[电子电路]基于stc89c52单片机的数字时钟设计内容摘要:

} } 16 /******************DS18B20 驱动程序 *******************/ void delay_18b20(unsigned int i)//延时函数 { while(i)。 }//18b20 初始化函数 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(10)。 x=DQ。 //稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败 delay_18b20(5)。 }//读一个字节 unsigned char ReadOneChar(void) { unsigned char i=0。 unsigned char dat = 0。 for (i=8。 i0。 i) { DQ = 0。 // 给脉冲信号 dat=1。 DQ = 1。 // 给脉冲信号 if(DQ) dat|=0x80。 delay_18b20(5)。 } return(dat)。 }//写一个字节 void WriteOneChar(unsigned char dat) { unsigned char i=0。 for (i=8。 i0。 i) { DQ = 0。 DQ = datamp。 0x01。 delay_18b20(5)。 DQ = 1。 dat=1。 } delay_18b20(5)。 17 }//读取温度 unsigned int ReadTemperature(void) { unsigned int a=0。 unsigned int b=0。 unsigned int t=0。 float tt。 Init_DS18B20()。 WriteOneChar(0xCC)。 // 跳过读序号列号的操作 WriteOneChar(0x44)。 // 启动温度转换 delay_18b20(200)。 Init_DS18B20()。 WriteOneChar(0xCC)。 //跳过读序号列号的操作 WriteOneChar(0xBE)。 //读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度 a=ReadOneChar()。 b=ReadOneChar()。 t=b。 t=8。 t=t|a。 tt=t*。 t=tt*10+。 return(t)。 } /************一级主界面显示函数 ************/ void first_interface() { LCD1602_write_string(0,0,20)。 LCD1602_write_data(Read1302(0x8d)/16+0x30)。 // 十年 LCD1602_write_data(Read1302(0x8d)%16+0x30)。 // 年 LCD1602_write_data(0)。 //显示自定义字符“年” LCD1602_write_data(Read1302(0x89)/16+0x30)。 // 十月 LCD1602_write_data(Read1302(0x89)%16+0x30)。 // 月 LCD1602_write_data(1)。 //显示自定义字符“月” LCD1602_write_data(Read1302(0x87)/16+0x30)。 // 十日 LCD1602_write_data(Read1302(0x87)%16+0x30)。 // 日 LCD1602_write_data(2)。 //显示自定义字符“日” if(Read1302(0xd7)) LCD1602_write_char(9,1,5)。 //显示自定义字符贪睡标志 else LCD1602_write_char(9,1,39。 39。 )。 LCD1602_write_string(12,0,week[Read1302(0x8b)1])。 //显示星期 if(Read1302(0xc7)||Read1302(0xcf)) LCD1602_write_char(10,1,3)。 //显示自定义字符闹钟标志 else LCD1602_write_char(10,1,39。 39。 )。 LCD1602_write_char(0,1,Read1302(0x85)/16+0x30)。 // 十时 18 LCD1602_write_data(Read1302(0x85)%16+0x30)。 // 时 LCD1602_write_data(39。 :39。 )。 LCD1602_write_char(3,1,Read1302(0x83)/16+0x30)。 // 十分 LCD1602_write_data(Read1302(0x83)%16+0x30)。 // 分 LCD1602_write_data(39。 :39。 )。 LCD1602_write_char(6,1,Read1302(0x81)/16+0x30)。 //十秒 LCD1602_write_data(Read1302(0x81)%16+0x30)。 //秒 temp=ReadTemperature()。 temp=temp。 temp1=temp/100。 temp2t=temp%100。 temp2=temp2t/10。 temp3=temp2t%10。 temp4=temp3%100/10。 LCD1602_write_char(11,1,temp1+0x30)。 //温度显示 LCD1602_write_data(temp2+0x30)。 LCD1602_write_data(0x2E)。 LCD1602_write_data(temp3+0x30)。 LCD1602_write_data(4)。 } /****************定时器 2 初始化函数 ***********停表 用 *************/ void init_timer2() { T2CON=0。 T2MOD=0。 RCAP2H=(6553610000)/256。 //10ms RCAP2L=(6553610000)%256。 TH2=(6553610000)/256。 //10ms TL2=(6553610000)%256。 EA = 1。 ET2 = 1。 TR2 = 1。 } /**************定时器 1 初始化函数 ************* 贪睡用 **************/ void init_timer1() { TMOD=0x10。 TH1=(6553610000)/256。 //10ms TL1=(6553610000)%256。 EA = 1。 ET1 = 1。 TR1 = 1。 } /************二级菜单显示函数 ************/ 19 void second_interface() { LCD1602_write_char(0,(menu_num*3)%2,0x7E)。 //三角形指示符号 LCD1602_write_char(0,!((menu_num*3)%2),39。 39。 )。 //清除残留显示三角形 if(!((menu_num*3)%2)) //判断是否要往液晶写入显示 ,menu_num 每跳变 2 时写一次 { LCD1602_write_string(1,0,menu[menu_num])。 // 1602 液晶第一行显示 LCD1602_write_string(1,1,menu[menu_num+1])。 // 1602 液晶第二行显示 } else if((menu_num*3)%2) //防止从三级界面回来时二级界面不显示了 { LCD1602_write_string(1,0,menu[menu_num1])。 // 1602 液晶第一行显示 LCD1602_write_string(1,1,menu[menu_num])。 // 1602 液晶第二行显示 } } /************三级菜单显示函数 ************/ void third_interface() { switch(menu_num) { case 0 : { if(!position1) //时间设置界面 ,仅进入三级菜单界面时刻显示一下 { LCD1602_write_string(0,0,20)。 LCD1602_write_data(Read1302(0x8d)/16+0x30)。 // 十年 LCD1602_write_data(Read1302(0x8d)%16+0x30)。 // 年 LCD1602_write_data(0)。 //显示自定义字符“年” LCD1602_write_data(Read1302(0x89)/16+0x30)。 // 十月 LCD1602_write_data(Read1302(0x89)%16+0x30)。 // 月 LCD1602_write_data(1)。 //显示自定义字符“月” LCD1602_write_data(Read1302(0x87)/16+0x30)。 // 十日 LCD1602_write_data(Read1302(0x87)%16+0x30)。 // 日 LCD1602_write_data(2)。 //显示自定义字符“日” LCD1602_write_string(12,0,week[Read1302(0x8b)1])。 //显示星期 LCD1602_write_char(0,1,Read1302(0x85)/16+0x30)。 // 十时 LCD1602_write_data(Read1302(0x85)%16+0x30)。 // 时 LCD1602_write_data(39。 :39。 )。 LCD1602_write_char(3,1,Read1302(0x83)/16+0x30)。 // 十分 LCD1602_write_data(Read1302(0x83)%16+0x30)。 // 分 LCD1602_write_data(39。 :39。 )。 LCD1602_write_char(6,1,Read1302(0x81)/16+0x30)。 //十秒 LCD1602_write_data(Read1302(0x81)%16+0x30)。 //秒 20 LCD1602_write_cmd(0x80+3)。 //第一次进入三级菜单时将光标放的位置 position1=1。 } }break。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。