发布时间 : 星期一 文章基于单片机的电子万年历的设计与制作 - 图文更新完毕开始阅读46fa9556af45b307e971970f
郑州航空工业管理学院毕业设计(论文)
//当前时间的 时,分比较,要是相同且闹钟状态是开,则蜂鸣器响 di(); delay(100); di(); delay(500); }
if((i+1>high||i { //超过温度上或小于下限且闹钟状态开,则蜂鸣器报警 di(); delay(100); di(); delay(500); } } void main() { Init_12887(); LCDInit(); LCDlear(); PSB=1;//并口 while(1) { while(!next) { Key(); WriteCommandLCD(0x0c); DisplayYear();//显示年 DisplayMonth();//显示月 DisplayDay();//显示日 DisplayWeek();//显示周 DisplayHour(); //显示时 DisplayMin(); //显示分 DisplaySec();//显示秒 Holidays(); //节日提醒 DisplayTemp(); //显示温度 beep(); //闹钟 DisplayShengXiao();//显示生肖 } Key(); } } 时钟模块 #include \void Init_12887() //初始化DS12C887,LCD { write_ds(0x0A,0xAF); //立级更新、开启振荡、500ms方波 write_ds(0x0B,0x0A); //输出方波、2进制表示、24小时制 } 32 郑州航空工业管理学院毕业设计(论文) void write_ds(uchar add,uchar date) { dsds=1; dsrw=1; dscs=0; dsas=1; P1=add; dsas=0; dsrw=0; P1=date; dsrw=1; dsas=1; dscs=1; } uchar read_ds(uchar add) { uchar ds_date; dsas=1; dsds=1; dsrw=1; dscs=0; P1=add; dsas=0; dsds=0; P1=0xff; ds_date=P1; dsds=1; dscs=1; dsas=1; return ds_date; } 温度检测 #include \ /**********DS18B20****************************/ uchar tt=1,tflag; //tflag为1时,温度为负的标志 uchar TH,TL; void DS18B20Init() { unsigned char a,b,c; DQ=1;//复位 DQ=0;//拉低800us for(c=1;c>0;c--)//延时800us for(b=2;b>0;b--) for(a=197;a>0;a--); DQ=1;//产生一个上升沿, 进入等待应答状态 for(b=1;b>0;b--)//延时50us for(a=22;a>0;a--); while(DQ==1); while(DQ==0);//检测到应答脉冲 33 郑州航空工业管理学院毕业设计(论文) } uchar TempRead(void) //从DS18B20中读取一个字节数据 { uchar a,b; uchar i,dat = 0,dat1 = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号0 _nop_(); DQ = 1; //给脉冲信号1 if(DQ)//读 判为1为0 {dat|=0x01;} else {dat&=0xfe;} dat=_cror_(dat,1);//最低位移到最高位 for(b=3;b>0;b--)//60us for(a=8;a>0;a--); } return(dat); } void write0()//写0 { uchar a,b; DQ=0;//拉低 for(a=6;a>0;a--);//拉低15us for(b=21;b>0;b--); //送入0至少45us,DS1820采样,(其实15us就行) //总共拉低至少60us DQ=1;//拉高恢复(至少1us) _nop_(); } void write1()//写1 { DQ=0; _nop_(); DQ=1; _nop_(); } void TempWriteByte(uchar dat) //向DS18B20写入数据 { uchar i,b; for(i=0;i<8;i++) { b=dat&0x01;//取出最低位 进行写 if(b==0) write0(); else 34 郑州航空工业管理学院毕业设计(论文) write1(); dat=_cror_(dat,1); _nop_(); _nop_(); } } int GetTemp()//读取寄存器中存储的温度数据 { int temp; uint b,t,a; DS18B20Init();//初始化 TempWriteByte(0xcc);//写入跳过序列号命令字 Skip Rom TempWriteByte(0x44);//写入温度转换命令字 Convert T DS18B20Init(); TempWriteByte(0xcc);//写入跳过序列号命令字 Skip Rom TempWriteByte(0xbe);//写入读取数据令字 Read Scratchpad a=TempRead();//读低8位 b=TempRead();//读高8位 TH=TempRead(); TL=TempRead(); t=b; t<<=8;//高八位左移 temp=t|a;//高低八位组合 if(temp<0x0fff) tflag=0; else { tflag=1;//显示负 temp=~temp+1; } temp=temp*0.625;//转换温度值,精确小数点后一位 return(temp); } 显示模块 #include \#include \ void delay(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } /****************12864的子函数*****************/ void WriteDataLCD(uchar dat)//向12864写数据 { LCD_RS=1; LCD_RW=0; delay(2); 35