基于单片机多功能电子钟电路的设计内容摘要:

} //写入数据: d for (i = 0。 i 8。 i ++) { if (d amp。 0x01) { SDA=1。 } else { 22 SDA=0。 } SCK=1。 SCK=0。 d = d 1。 } RST=0。 //停止 DS1302 总线 } //*************************从 DS1302 读出一字节数据 unsigned char Read1302(uchar addr) { unsigned char i。 unsigned char temp。 unsigned char dat1=0。 unsigned char dat2=0。 SCK=0。 RST=1。 //写入目标地址: addr for (i = 0。 i 8。 i ++) { if (addr amp。 0x01) { SDA=1。 } else { SDA=0。 } SCK=1。 SCK=0。 23 addr = addr 1。 } //输出数据: temp for (i = 0。 i 8。 i ++) { temp = temp 1。 if (SDA) { temp |= 0x80。 } else { temp amp。 = 0x7F。 } SCK=1。 SCK=0。 } RST=0。 //停止 DS1302 总线 dat2 = temp/16。 // 数据进制转换 dat1 = temp%16。 dat1 = dat2*10+dat1。 return dat1。 } /*****************************1602 显示******************************************/ void write_add(uchar add) //1602 控制字 { RS=0。 P0=add。 EN=1。 24 delay(5)。 EN=0。 } void write_date(uchar date) //1602 显示字 { RS=1。 P0=date。 EN=1。 delay(5)。 EN=0。 } void writesfm(uchar add,uchar date) //1602 显示时分秒 { uchar s,g。 s = date/10。 g = date%10。 write_add(0x80+0x40+add)。 write_date(0x30+s)。 write_date(0x30+g)。 } void writenyr(uchar add,uchar date) //1602 显示年月日 { uchar s,g。 s=date/10。 g=date%10。 write_add(0x80+0x00+add)。 write_date(0x30+s)。 write_date(0x30+g)。 } void writexi(uchar a) 25 { write_add(0x80+0x00+11)。 if(a==1) { for(i=0。 i3。 i++) { write_date(xi1[i])。 delay(5)。 } } if(a==2) { for(i=0。 i3。 i++) { write_date(xi2[i])。 delay(5)。 } } if(a==3) { for(i=0。 i3。 i++) { write_date(xi3[i])。 delay(5)。 } } if(a==4) { for(i=0。 i3。 i++) { 26 write_date(xi4[i])。 delay(5)。 } } if(a==5) { for(i=0。 i3。 i++) { write_date(xi5[i])。 delay(5)。 } } if(a==6) { for(i=0。 i3。 i++) { write_date(xi6[i])。 delay(5)。 } } if(a==7) { for(i=0。 i3。 i++) { write_date(xi7[i])。 delay(5)。 } } } void writefuhao(void) //写符号 27 { write_add(0x80+0x00+2)。 write_date(table[2])。 delay(10)。 write_add(0x80+0x00+5)。 write_date(table[2])。 delay(10)。 write_add(0x80+0x40+2)。 write_date(time1[2])。 delay(10)。 write_add(0x80+0x40+5)。 write_date(time1[2])。 delay(10)。 } void Speak1() //闹铃 { alarm = 0。 smiao = Read1302(r_Sec)。 sfen = Read1302(r_Min)。 sshi = Read1302(r_Hou)。 snian = Read1302(r_Yea)。 syue = Read1302(r_Mou)。 sri = Read1302(r_Day)。 sxi = Read1302(r_xi)。 writefuhao()。 writesfm(0,sshi)。 writesfm(3,sfen)。 writesfm(6,smiao)。 writenyr(0,snian)。 writenyr(3,syue)。 28 writenyr(6,sri)。 writexi(sxi)。 delay(500)。 alarm = 1。 delay(500)。 } void Speak2() { alarm=0。 delay(500)。 Normal()。 delay(500)。 Normal()。 alarm=1。 } void Normal() //正常显示时间功能 { smiao = Read1302(r_Sec)。 sfen = Read1302(r_Min)。 sshi = Read1302(r_Hou)。 snian = Read1302(r_Yea)。 syue = Read1302(r_Mou)。 sri = Read1302(r_Day)。 sxi = Read1302(r_xi)。 //读取时间数据 if((nshi==sshi)amp。 amp。 (nfen==sfen)) //闹钟铃响 { for(i=0。 i2。 i++) { key5()。 if(b==0) 29 { Speak1()。 } } } //关闭蜂鸣器 if((sshi==0||sshi==1||sshi==2||sshi==3 ||sshi==4||sshi==5||sshi==6||sshi==7 ||sshi==8||sshi==9||sshi==10||sshi==11 ||sshi==12||sshi==13||sshi==14||sshi==15 ||sshi==16||sshi==1||sshi==18||sshi==19 ||sshi==20||sshi==21||sshi==22||sshi==23) amp。 amp。 (sfen==0)amp。 amp。 (smiao==0)) { Speak2()。 //整点报时 } alarm=1。 //关闭蜂鸣器 writefuhao()。 writesfm(0,sshi)。 writesfm(3,sfen)。 writesfm(6,smiao)。 writenyr(0,snian)。 writenyr(3,syue)。 writenyr(6,sri)。 writexi(sxi)。 } /***********************按键程序 *********************************/ void key() //闹钟时的按键功 能 { 30 if(k1==0) { delay(10)。 if(k1==0) { n++。 while(!k1)。 if(n==1) { write_add(0x0f)。 write_add(0x80+0x40+4)。 //写 shi } if(n==2) { write_add(0x0f)。 write_add(0x80+0x40+7)。 //写 fen } if(n==3) { n=0。 nfen=fen。 nshi=shi。 //确认 write_add(0x0c)。 //光标不闪烁 } } } if(k2==0) { delay(10)。 if(k2==0) 31 { while(!k2)。 if(n==1) { shi++。 if(shi==24) shi=0。 writesfm(4,shi)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。