您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > STC51单片机+DS1302+18b20实现万年历
STC51电子钟制作最近做了一件DIY电子钟,自我感觉效果还不错,所以传到网上与大家分享一下,大家如果喜欢可以尝试做一下,也可以用作毕业设计。这款电子钟可以显示年,月,日,小时,分,秒,星期,还有温度,可以调节时间。1,电路原理图:我的原理不是很清楚,大家可以看我的PCB图,我把每部分都截图了,效果挺好的。2,PCB板图:(1)蜂鸣器部分(2)DS1302部分和复位电路部分(3)18B20部分,和单片机晶振部分(4)调时按键部分(5)1602部分(6)电源部分3,元件清单12M晶振1个9015三极管1个DS13021块30pf电容2个蜂鸣器1个STC89c511块100欧1个10pf电容2个1041个按键5个Lcd16021块5.1k1个10k9个32.768k晶振1个备用锂电池1块18b201个USB插口1个10uf电容1个4.7k1个20k滑动变阻器1个电池盒1个8脚插座1个40脚插座14,源程序清单:#includereg52.h#includestdio.h#defineuintunsignedint#defineucharunsignedcharsbitLCD_RS=P2^4;//1602sbitLCD_RW=P2^5;sbitLCD_EN=P2^6;sbitrst=P1^7;//DS1302sbitio=P1^6;sbitsclk=P1^5;sbitACC_7=ACC^7;sbitK1=P2^3;//按键sbitK2=P2^2;sbitK3=P2^1;sbitK4=P2^0;sbitBEEP=P1^0;//蜂鸣器sbitDQ=P3^1;//温度传感器bitflag=0;bitflag1=0;ucharyes;//ucharcodetable2[]=SONGyou;//ucharcodetable3[]=zhanpeng;ucharcodetable4[]=0123456789;chartable5[7];uchartable6[2];chartable7[2];charleap;//延时函数部分voidDelay_ms(uintxms)//延时{uinti,j;for(i=xms;i0;i--)for(j=110;j0;j--);}voidDelayus(uchart)//延时1用于18b20{while(--t);}voidDelayms(uchart)//延时2用于18b20{while(t--){//大致延时1mSDelayus(245);Delayus(245);}}//18b20部分bitinit18b20(void)//初始化18b20{bitdat=0;DQ=1;Delayus(5);DQ=0;Delayus(200);Delayus(200);DQ=1;Delayus(50);dat=DQ;Delayus(25);returndat;}ucharread18b20(void)//读18b20函数{uchari=0,dat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;Delayus(25);}return(dat);}voidwrite18b20(uchardat)//写18b20函数{uchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;Delayus(25);DQ=1;dat=1;}Delayus(25);}uintget_18b20(void)//读取温度函数{uchara=0;uintb=0,t=0;init18b20();write18b20(0xCC);//跳过读序号列号的操作write18b20(0x44);//启动温度转换Delayms(10);init18b20();write18b20(0xCC);//跳过读序号列号的操作write18b20(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度a=read18b20();//低位b=read18b20();//高位b=8;t=a+b;return(t);}//蜂鸣器部分voidbeep(){BEEP=0;Delay_ms(100);BEEP=1;}//LCD1602部分voidwrite1602(uchardat)//1602写数据函数{LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;LCD_EN=1;Delay_ms(1);LCD_EN=0;}voidwrite1602c(ucharcom)//1602写指令函数{LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=com;LCD_EN=1;Delay_ms(1);LCD_EN=0;}voidinit1602()//1602初始化{write1602c(0x38);//16*2显示write1602c(0x0f);//显示光标write1602c(0x06);//光标右移write1602c(0x01);//清屏write1602c(0x80);}//DS1302部分voidwrite1302(ucharaddr,dat)//1302写数据函数{uchari,temp;rst=0;sclk=0;rst=1;for(i=0;i8;i++)//写地址,写数据{sclk=0;temp=addr;io=(bit)(temp&0x01);addr=1;sclk=1;}for(i=0;i8;i++)//写地址,写数据{sclk=0;temp=dat;io=(bit)(temp&0x01);dat=1;sclk=1;}rst=0;}ucharread1302(ucharaddr)//1302读数据函数{uchari,temp,dat1,dat2;rst=0;sclk=0;rst=1;for(i=0;i8;i++){sclk=0;temp=addr;io=(bit)(temp&0x01);addr=1;sclk=1;}for(i=0;i8;i++){ACC_7=io;sclk=1;ACC=1;sclk=0;}rst=0;dat1=ACC;dat2=dat1%16;dat1=dat1/16;dat1=dat1*10+dat2;return(dat1);}voidinit1302()//1302初始化函数{write1302(0x8e,0x00);write1302(0x80,0x00);//秒初始化write1302(0x8e,0x80);}/*voidinit1602B(){uchari=0;write1602c(0x80+16);write1602(0xef);while(table2[i]!='\0'){write1602(table2[i]);i++;}write1602(0xef);write1602c(0x80+0x40+20);i=0;while(table3[i]!='\0'){write1602(table3[i]);i++;}for(i=0;i16;i++){write1602c(0x18);Delay_ms(800);}Delay_ms(2000);write1602c(0x01);write1602c(0x06);}*///显示部分voidget_time()//获取时间函数{table5[5]=read1302(0x8d);table5[4]=read1302(0x89);table5[3]=read1302(0x87);table5[2]=read1302(0x85);table5[1]=read1302(0x83);table5[0]=read1302(0x81);table5[6]=read1302(0x8b);}voidDisplay_time(ucharyear,yue,day,hour,min,sec,xq)//显示函数{write1602c(0x80);write1602('2');write1602('0');write1602(table4[year/10]);write1602(table4[year%10]);write1602('-');write1602(table4[yue/10]);write1602(table4[yue%10]);write1602('-');write1602(table4[day/10]);write1602(table4[day%10]);write1602('');write1602('w');write1602('e');write1602('e');write1602('k');write1602(table4[xq]);write1602c(0x80+0x40);write1602(table4[hour/10]);write1602(table4[hour%10]);write1602(':');write1602(table4[min/10]);write1602(table4[min%10]);write1602(':');write1602(table4[sec/10]);write1602(table4[sec%10]);write1602('');write1602('');write1602('T');write1602('');write1602(table7[0]);write1602(table7[1]);write1602(0xdf);write1602('c');}//调时部分voidKeyprocess(){staticucharnum=0;ucharyear1,yue1,day1,hour1,min1,xq1;write1302(0x8e,0x00);write1302(0x80,0x80);if(K3==0){Delay_ms(5);if(K3==0){while(!K3);beep();num++;}}if(num6){num=0;}if(num){if(K1==0){Delay_ms(5);if(K1==0){while(!K1);beep();if(num==1){table5[1]++;if(table5[1]==60)table5[1]=0;min1=table5[1]/10*16+table5[1]%10;write1302(0x82,min1);}if(num==2){table5[2]++;if(table5[2]==24)table5[2]=0;hour1=table5[2]/10*16+table5[2]%10;write1302(0x84,hour1);}if(num==3){table5[6]++;if(table5[6]==8)table5[6]=1;xq1=table5[6]/10*16+table5[6]%10;write1302(0x8a,xq1);}if(num==4){if(table5[5]==0){switch(table5[4]){case1:table5[3]++;if(table5[3]==32)table5[3]=1;break;case2:table5[3]++;if(table5[3]==30)table5[3]=1;break;case3:table5[3]++;if(table5[3]==32)table5[3]=1;break;case4:table5[3]++;if(table5[3]==31)table5[3]=1;break;case5:table5[3]++;if(table5[3]==32)table5[3]=1;break;case6:table5[3]++;if(table5[3]==31)table5[3]=1;break;case7:table5[3]++;if(table5[3]==32)table5[3]=1;break;case8:table5[3]++;if(table5
本文标题:STC51单片机+DS1302+18b20实现万年历
链接地址:https://www.777doc.com/doc-3369956 .html