电子时钟的设计.doc_第1页
电子时钟的设计.doc_第2页
电子时钟的设计.doc_第3页
电子时钟的设计.doc_第4页
电子时钟的设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子时钟的设计第三组组长:第三组成员:一设计目的:1. 理解掌握定时/计数器和中断,温度传感器、时钟芯片的使用方法。2. 掌握微机常用的输入输出方式及接口技术。3. 掌握一定的keil语言知识,培养自己的动手操作能力。4. 学习程序设计的基本思路和方法。二程序内容:第一部分:定义显示界面。第二部分:调用Ds1320时间。第三部分:用Ds18b20测温度。第四部分:控制调整时间的程序。 三程序流程图如下:#include #include #define uchar unsigned char#define uint unsigned intsbit SCK=P37;/时钟sbit SDA=P36;/数据sbit RST = P35;/ DS1302复位sbit rs=P15;sbit rw=P16;sbit e=P17;sbit s1=P10;sbit s2=P11;sbit s3=P12;sbit s4=P13;unsigned char l_tmpdate7=0x00,0x00,0x0c,0x02,0x05,0x40,0x0c;/秒分时日月周年unsigned char l_tmpdisplay20;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; uchar flag,s1num,count,flag1,flag2;unsigned char shi,fen,miao,nian,yue,ri,xq;uchar code Weeks3=SUN,MON,TUE,WED,THU,FRI,SAT,SUN;uchar lcd1602_line1= 000;sbit D18B20=P30; / 18b20的引脚定义#define NOP() _nop_() /* 定义空指令 */#define _Nop() _nop_() /*定义空指令*/void TempDelay (uchar us);/18b20的函数声明void Init18b20 (void);void WriteByte (uchar wr); /单字节写入void read_bytes (uchar j);uchar CRC (uchar j);void GemTemp (void);void TemperatuerResult(void);void GetTemp();void system_Ini1();void system_Ini();void display1();bit flag3;uint Temperature;/用来存放读出温度后的值uchar temp_buff9; /存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar *p,TIM; /声明引用外部函数extern uint Temperature; / 声明引用外部变量/else IOunsigned LedNumVal;/*/* 函数声明 */*/void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0void delay(uchar a);void lcd_mang();void write_lcd1602(uchar cmd,uchar i);void ini_lcd1602();void lcd_xs();void keyscan();void write_sfm(uchar add ,uchar date);void write_sfm1(uchar add ,uchar date);/*/* 主函数 */*/void main(void) system_Ini(); / 系统初始化 system_Ini1(); ini_lcd1602(); /Set_RTC(); /写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1) keyscan(); Read_RTC(); if(flag=0) lcd_xs(); GetTemp(); display1(); void delay(uchar a) uchar i; while(a-) for(i=0;i250;i+) _nop_(); _nop_(); _nop_(); _nop_(); /判忙 void lcd_mang() rs=0; rw=1; e=1; _nop_();_nop_();_nop_();_nop_(); while(P0&0x80); e=0; /1602的写void write_lcd1602(uchar cmd,uchar i) lcd_mang();rs=i;rw=0;e=0;_nop_();_nop_();e=1; _nop_();_nop_();P0=cmd; _nop_();_nop_();_nop_();_nop_();e=0;/1602的初始化void ini_lcd1602() write_lcd1602(0x38,0); delay(1); write_lcd1602(0x0c,0); delay(1); write_lcd1602(0x06,0); delay(1); write_lcd1602(0x01,0); delay(1); /*/* 写一个字节 */*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; /*/* 写入DS1302 */*/void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_(); SCK=0;_nop_(); RST=1; _nop_(); /启动 Write_Ds1302_Byte(address);/发送地址 Write_Ds1302_Byte(dat);/发送数据 RST=0; /恢复/*/* 读出DS1302数据 */*/unsigned char Read_Ds1302 ( unsigned char address ) unsigned char i,temp=0x00; RST=0;_nop_();_nop_(); SCK=0;_nop_();_nop_(); RST=1;_nop_();_nop_(); Write_Ds1302_Byte(address); for (i=0;i=1;/右移一位 _nop_(); _nop_(); _nop_(); SCK=1; return (temp);/返回/*/* 读时钟数据 */*/void Read_RTC(void) /读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i+) /分7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; /*/* 设定时钟数据 */*/void Set_RTC(void) /设定 日历unsigned char i,*p,tmp;for(i=0;i7;i+) /BCD处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00); p=write_rtc_address;/传地址 for(i=0;i7;i+)/7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); p+; Write_Ds1302(0x8E,0x80); /*显示*/void lcd_xs() uchar i; l_tmpdisplay0=l_tmpdate6/16+0x30;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay1=l_tmpdate6%16+0x30;l_tmpdisplay2=/; /加入-l_tmpdisplay3=l_tmpdate4/16+0x30;l_tmpdisplay4=l_tmpdate4%16+0x30;l_tmpdisplay5=/;l_tmpdisplay6=l_tmpdate3/16+0x30;l_tmpdisplay7=l_tmpdate3%16+0x30;l_tmpdisplay8=l_tmpdate2/16+0x30;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay9=l_tmpdate2%16+0x30;l_tmpdisplay10=:; /加入-l_tmpdisplay11=l_tmpdate1/16+0x30;l_tmpdisplay12=l_tmpdate1%16+0x30; l_tmpdisplay14=l_tmpdate0/16+0x30;l_tmpdisplay15=l_tmpdate0%16+0x30;for(i=0;i3;i+) lcd1602_line1i+13=Weeksl_tmpdate5&0x07i;/星期xq=l_tmpdate5&0x07;flag2=l_tmpdate5;miao=l_tmpdate0/16*10+l_tmpdate0%16;fen=l_tmpdate1/16*10+l_tmpdate1%16;shi=l_tmpdate2/16*10+l_tmpdate2%16;ri=l_tmpdate3/16*10+l_tmpdate3%16;yue=l_tmpdate4/16*10+l_tmpdate4%16;nian=l_tmpdate6/16*10+l_tmpdate6%16;write_lcd1602(0x80+12,0); write_lcd1602(0x80,0); /显示年月日 for(i=0;i=7;i+) write_lcd1602(l_tmpdisplayi,1); write_lcd1602(0x80+12,0);/显示星期 for(i=0;i3;i+) write_lcd1602( lcd1602_line1i+13,1); write_lcd1602(0x80+0x40+2,0); /显示时分秒 for(i=8;i=12;i+) write_lcd1602(l_tmpdisplayi,1); write_lcd1602(0x80+0x40+8,0); for(i=14;i=15;i+) write_lcd1602(l_tmpdisplayi,1); /*键盘扫描*/ void keyscan()s4=0;if(s1=0)delay(15);if(s1=0) TR0=0;flag=1;s1num+;while(!s1);delay(10);while(!s1);if(s1num=1)write_lcd1602(0x80+0x40+9,0);flag1=:;write_lcd1602(0x80+0x40+7,0);write_lcd1602(flag1,1);write_lcd1602(0x80+0x40+9,0); write_lcd1602(0x0f,0); if(s1num=2)write_lcd1602(0x80+0x40+6,0);if(s1num=3)write_lcd1602(0x80+0x40+3,0); if(s1num=4)write_lcd1602(0x80+14,0);if(s1num=5)write_lcd1602(0x80+7,0);if(s1num=6)write_lcd1602(0x80+4,0);if(s1num=7)write_lcd1602(0x80+1,0);if(s1num=8) s1num=0;write_lcd1602(0x0c,0); flag=0; Write_Ds1302(0x8E,0X00); Write_Ds1302( 0x80,miao/10*16+miao%10); Write_Ds1302( 0x82,fen/10*16+fen%10 );Write_Ds1302( 0x84,shi/10*16+shi%10 );Write_Ds1302( 0x86,ri/10*16+ri%10); Write_Ds1302( 0x88,yue/10*16+yue%10 );Write_Ds1302( 0x8c,nian/10*16+nian%10 ); Write_Ds1302( 0x8a,flag2); Write_Ds1302(0x8E,0X80); TR0=1; if(s1num!=0)if(s2=0)delay(15);if(s2=0) while(!s2);delay(5); while(!s1);if(s1num=1) miao+; if(miao=60) miao=0; write_sfm(8 ,miao); write_lcd1602(0x80+0x40+9,0); if(s1num=2)fen+;if(fen=60)fen=0;write_sfm(5,fen); write_lcd1602(0x80+0x40+6,0);if(s1num=3)shi+;if(shi=24)shi=0;write_sfm(2,shi);write_lcd1602(0x80+0x40+3,0);if(s1num=4) uchar i; flag2+;if(flag2=7)flag2=0; xq+; if(xq=7) xq=0;for(i=0;i3;i+) lcd1602_line1i+13=Weeksxqi;/星期write_lcd1602(0x80+12,0); for(i=0;i3;i+) write_lcd1602( lcd1602_line1i+13,1); write_lcd1602(0x80+14,0); if(s1num=5)ri+;if(ri=31)ri=0;write_sfm1(6,ri);write_lcd1602(0x80+7,0);if(s1num=6)yue+;if(yue=13)yue=1;write_sfm1(3,yue);write_lcd1602(0x80+4,0);if(s1num=7)nian+;if(nian=100)nian=0;write_sfm1(0,nian);write_lcd1602(0x80+1,0);if(s3=0)delay(15);if(s3=0)while(!s3);delay(5);while(!s1);if(s1num=1)miao-;if(miao=-1)miao=59;write_sfm(8,miao); write_lcd1602(0x80+0x40+9,0);if(s1num=2)fen-;if(fen=-1)fen=59;write_sfm(5,fen); write_lcd1602(0x80+0x40+6,0);if(s1num=3) shi-;if(shi=-1)shi=23;write_sfm(2,shi);write_lcd1602(0x80+0x40+3,0);if(s1num=4) uchar i; flag2-;if(flag2=-1)flag2=6; xq-; if(xq=-1) xq=6;for(i=0;i3;i+) lcd1602_line1i+13=Weeksxqi;/星期write_lcd1602(0x80+12,0); for(i=0;i3;i+) write_lcd1602( lcd1602_line1i+13,1); write_lcd1602(0x80+14,0); if(s1num=5)ri-;if(ri=-1)ri=30;write_sfm1(6,ri);write_lcd1602(0x80+7,0);if(s1num=6)yue-;if(yue=0)yue=12;write_sfm1(3,yue);write_lcd1602(0x80+4,0);if(s1num=7)nian-;if(nian=-1)nian=99;write_sfm1(0,nian);write_lcd1602(0x80+1,0); void write_sfm(uchar add ,uchar date)uchar ss,ff;ss=date/10; ff=date%10; write_lcd1602(0x80+0x40+add,0); write_lcd1602( 0x30+ss,1) ;write_lcd1602( 0x30+ff,1) ;void write_sfm1(uchar add ,uchar date)uchar ss,ff;ss=date/10; ff=date%10; write_lcd1602(0x80+add,0); write_lcd1602( 0x30+ss,1) ;write_lcd1602( 0x30+ff,1) ;void system_Ini1() TMOD=0x01;TH0=(65536-5000)/256; TL0=(65536-5000)%256;EA=1;ET0=1;TR0=1; void timer0() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256;count+;if(count=20)count=0; flag1=:;write_lcd1602(0x80+0x40+7,0); write_lcd1602(flag1,1); delay(35);write_lcd1602(0x01,0);/*/void system_Ini() TMOD|= 0x11; TH1 = 0xD8; /10 TL1 = 0xF0;IE = 0x8A; TR1 = 1;/*Function:延时处理*parameter:*Return:*Modify:*/void TempDelay (uchar us)while(us-);/*Function:18B20初始化*parameter:*Return:*Modify:*/void Init18b20 (void)D18B20=1;_nop_();D18B20=0;TempDelay(80); /delay 530 uS/80_nop_();D18B20=1;TempDelay(14); /delay 100 uS/14_nop_();_nop_();_nop_();if(D18B20=0)flag3 = 1; /detect 1820 success!elseflag3 = 0; /detect 1820 fail!TempDelay(20); /20_nop_();_nop_();D18B20 = 1;/*Function:向18B20写入一个字节*parameter:*Return:*Modify:*/void WriteByte (uchar wr) /单字节写入unsigned char idata i;for (i=0;i= 1;/*Function:读18B20的一个字节*parameter:*Return:*Modify:*/unsigned char ReadByte (void) /读取单字节unsigned char idata i,u=0;for(i=0;i= 1;D18B20 = 1;if(D18B20=1)u |= 0x80;TempDelay (2);_nop_();return(u);/*Function:读18B20*parameter:*Return:*Modify:*/void read_bytes (uchar j) unsigned char idata i; for(i=0;ij;i+) *p = ReadByte(); p+; /*Function:读取温度*parameter:*Return:*Modify:*/void GemTemp (void) Temperature = temp_buff1*0x100 + temp_buff0;/ Temperature *= 0.625;Temperature /= 16;TempDelay(1);/*Function:18B20ID全处理*parameter:*Return:*Modify:*/void TemperatuerResult(void)Init18b20 ();WriteByte(0xcc); /skip romWriteByte(0x44); /Temperature convertInit18b20 ();WriteByte(0xcc); /skip romWriteByte(0xbe); /read Temperaturep = temp_buff;read_bytes (9);GemTemp();void GetTemp() if(TIM=100) /每隔 1000ms 读取温度 TIM=0; TemperatuerResult();void display1() /*以下将读18b20的数据送到LED数码管显示*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论