当前位置:首页 > 基于51单片机的电子万年历设计毕业论文设计
附录
电路原理图:
设计主程序:
/*
* 万年历 */
#include \#include \#include \#include \
#include \#include \
TIME time, tmp_time; ALARM alarm; bit Alarm_flag=0; bit Clock_flag=0; bit flag=0;
sbit DQ=P2^6; //DS18B20 pin
//-----------------18B20-----------------------
unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen; unsigned int fg=0,xiaoshu_a;
//-----------------18B20---------------------- //-------------音乐----------------------------- uint8 code SONG_TONE[]= { 212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0 };
uint8 code SONG_LONG[]= {
9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0 };
//------------------------------------------------------------
void delay(uint16 n) { while (n--); }
//************************************************************************/ // 函数: LCD_Delay() // 描述: 延时t ms函数 // 参数: t // 返回: 无
// 备注: 11.0592MHZ t=1延时时间约1ms // 版本: 2011/01/01 First version
//************************************************************************/ void Delay_nms(unsigned int t) { unsigned int i,j; for(i=0;i } ///////////////////////////////////////////////// //-----------播放音乐---------------------------- void PlayMusic() { uint16 i =0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { for(j=0;j ///////////////////////////////////////////////// /*------DS18B20------*/ void delay_18B20(unsigned int i) { while(i--); } /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲 然后主机释放单总线并进入接收模式 此时单总线电平被拉高 DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲 */ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0 所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间 两种写时隙均以主机拉低总线开始 产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平 产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间 每次读时隙由主机发起,拉低总线至少1us。 若传1,则保持总线高电平;若发送0,则拉低总线 传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样总线状态 */ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } void read_18B20(void) { Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换
共分享92篇相关文档