基于lcd1602电子时钟课程设计报告(编辑修改稿)内容摘要:

当前温度并延时 5秒 ;报警时按 K4 退出。 图 1(硬件原理图 ) 图 2( 软件原理图 ) 16 图 3( PCB) 程序: include include unsigned char code displaywele[]={ Wele To My Lcd Timer}。 //欢迎界面 unsigned char code displaywish[]={ Happy Every Day ^_^}。 //欢迎界面 unsigned char code overtemperature[]={OVERTEMPERATURE!}。 unsigned char code digit[]={0123456789}。 //数字代码 unsigned char mode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours, minutea,seconds,houra=12。 sbit SCLK=P1^0。 //DS1302时钟输入 sbit DATE=P1^1。 //DS1302数据输入 sbit REST=P1^2。 //DS1302复位端口 sbit SET=P1^4。 //DS1302设置模式选择位 sbit ADD=P1^5。 //增加 sbit RED=P1^6。 //减小 sbit CANL=P1^7。 sbit beep=P3^6。 //位定义 , 定义 fmp void delay1ms(int i)//1毫秒延时 { 17 int j,k。 while(i) for(j=76。 j1。 j)。 for(k=29。 k1。 k)。 } void delaynus(unsigned char n) //延时若干微秒 { unsigned char i。 for(i=0。 in。 i++)。 } /***********蜂鸣器模块 ************/ void dely500(void) { unsigned char i。 for(i=i0。 i) { _nop_()。 } } void baojing() //报警 { unsigned int j,h,y。 for(h=0。 h3。 h++) { for(y=0。 y10。 y++) { beep=~beep。 for(j=0。 j50。 j++)。 } dely500()。 } } /*******DS1302模块 *************/ void Write1302(unsigned char date)//向 1302写数据 { unsigned char i。 SCLK=0。 delaynus(2)。 for(i=0。 i8。 i++) { DATE=dateamp。 0x01。 SCLK=1。 delaynus(2)。 SCLK=0。 18 delaynus(2)。 date=1。 } } void WriteSet1302(unsigned char cmd,unsigned char date) //根据相应的命令输入相应的数据 { REST=0。 SCLK=0。 REST=1。 Write1302(cmd)。 delaynus(5)。 Write1302(date)。 SCLK=1。 REST=0。 } unsigned char Read1302(void) //读取 1302数据 { unsigned char i,date。 delaynus(2)。 for(i=0。 i8。 i++) { date=1。 if(DATE==1) date|=0x80。 SCLK=1。 delaynus(2)。 SCLK=0。 delaynus(2)。 } return date。 } unsigned char ReadSet1302(unsigned char cmd)//根据命令读取 1302相应的值 { unsigned char date。 REST=0。 SCLK=0。 REST=1。 Write1302(cmd)。 delaynus(2)。 date=Read1302()。 SCLK=1。 REST=0。 return date。 19 } void IntDS1302(void) //DS1302初始化 { unsigned char flag。 flag= ReadSet1302(0x81)。 if(flagamp。 0x80) { //判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00)。 //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)4|(0%10)))。 //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((0/10)4|(0%10)))。 //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((0/10)4|(0%10)))。 //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((0/10)4|(0%10)))。 //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((0/10)4|(0%10)))。 //根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((10/10)4|(10%10)))。 //根据写年寄存器命令字,写入年的初始值 WriteSet1302(0x90,0xa5)。 //打开充电功能 选择 2K电阻充电方式 WriteSet1302(0x8E,0x80)。 //根据写状态寄存器命令字,写入保护指令 } } /***************液晶显示模块 *****************/ sbit RS=P2^5。 sbit RW=P2^6。 sbit E=P2^7。 sbit BF=P0^7。 /*液晶忙检测 */ bit BusyTest(void) { bit result。 RS=0。 RW=1。 E=1。 _nop_()。 _nop_()。 _nop_()。 result=BF。 _nop_()。 _nop_()。 _nop_()。 E=0。 return result。 } /*写指令 */ void Write_(unsigned char mand) { while(BusyTest()!=0)。 RS=0。 20 RW=0。 E=0。 _nop_()。 _nop_()。 _nop_()。 P0=mand。 _nop_()。 _nop_()。 _nop_()。 E=1。 _nop_()。 _nop_()。 _nop_()。 E=0。 } /*写地址 */ void Write_Address(unsigned char address) { Write_(address|0x80)。 delay1ms(1)。 } /*写数据 */ void Write_Date(unsigned char date) { RS=1。 RW=0。 E=0。 _nop_()。 _nop_()。 _nop_()。 P0=date。 _nop_()。 _nop_()。 _nop_()。 E=1。 _nop_()。 _nop_()。 _nop_()。 E=0。 delay1ms(1)。 } /*初始化 */ void Lcd_Int(void) { Write_(0x38)。 21 delay1ms(1)。 Write_(0x38)。 delay1ms(1)。 Write_(0x06)。 delay1ms(1)。 Write_(0x0c)。 delay1ms(1)。 Write_(0x01)。 } void displaymainpart(void)//显示液晶主要部分 ( 不变化部分 ) { Write_Address(0x01)。 delay1ms(1)。 Write_Date(39。 D39。 )。 Write_Date(39。 A39。 )。 Write_Date(39。 T39。 )。 Write_Date(39。 E39。 )。 Write_Date(39。 :39。 )。 delay1ms(1)。 Write_Address(0x0A)。 delay1ms(1)。 Write_Date(39。 39。 )。 Write_Address(0x0D)。 Write_Date(39。 39。 )。 Write_Address(0x42)。 Write_Date(39。 T39。 )。 Write_Date(39。 I39。 )。 Write_Date(39。 M39。 )。 Write_Date(39。 E39。 )。 Write_Date(39。 :39。 )。 Write_Address(0x4A)。 Write_Date(39。 39。 )。 Write_Address(0x4D)。 Write_Date(39。 39。 )。 Write_Address(0x06)。 Write_Date(39。 239。 )。 Write_Date(39。 039。 )。 } void display_Second(unsigned char second) //在液晶上显示秒 { unsigned char i,j。 i=second/10。 j=second%10。 Write_Address(0x4E)。 Write_Date(digit[i])。 22 Write_Date(digit[j])。 delay1ms(1)。 } void display_Minute(unsigned char minute) //在液晶上显示分 { unsigned char i,j。 i=minute/10。 j=minute%10。 Write_Address(0x4B)。 Write_Date(digit[i])。 Write_Date(digit[j])。 delay1ms(1)。 } void display_Hour(unsigned char hour) //在液晶上显示时 { unsigned char i,j。 i=hour/10。 j=hour%10。 Write_Address(0x48)。 Write_Date(digit[i])。 Write_Date(digit[j])。 delay1ms(1)。 } void display_Day(unsigned char day) //在液晶上显示日 { unsigned char i,j。 i=day/10。 j=day%10。 Write_Address(0x0E)。 Write_Date(digit[i])。 Write_Date(digit[j])。 delay1ms(1)。 } void display_Month(unsigned char month) //在液晶上显示月 { unsigned char i,j。 i=month/10。 j=month%10。 Write_Address(0x0B)。 Write_Date(digit[i])。 Write_Date(digit[j])。 delay1ms(1)。 } void display_Year(unsigned char year) //在液晶上显示年。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。