单片机数字钟设计报告_第1页
单片机数字钟设计报告_第2页
单片机数字钟设计报告_第3页
单片机数字钟设计报告_第4页
单片机数字钟设计报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、中国矿业大学2011年电子设计竞赛作品设计总结报告作 品 名 称:多功能数字钟参赛队员:联系电话:摘要:本多功能数字钟采用ATMEL公司的AT89S52单片机作为核心器件,实现对整个系统的自动控制。采用DALLAS公司的DS1302实时时钟芯片作为时间信号源,实现年、月、日、时、分、秒、星期的自动计时,同时利用其内部31字节的SRAM静态寄存器,实现闹钟数据和生日提醒数据的掉电保存。采用DALLAS公司的DS18B20单总线数字温度传感器采集环境温度数据,温度转换精度可达0.0625度。显示器件采用LCD1602液晶显示屏,该显示屏单屏可显示32个字符,所有的时间及温度数据均可在一屏中显示。关

2、键字:单片机 数字钟 AT89S52 DS1302 DS18B20 LCD1602多功能数字钟设计报告一、总体要求1、基本要求:(1)可实现基本时钟功能,十进制显示小时、分和秒位。(2)可调时,可预置时间。(3)倒计时功能。(4)可定时。定时时间到发出提示(提示为声音或光等均可)。2、扩展功能:(1)时钟12小时制和24小时制之间可调节自由转换。(2)实现秒表计时功能。(3)时钟芯片的精确计时。. 二、整体介绍:本作品整体如上图,由主板,电池两部分组成。采用双路供电,电池、交流任选。交流输入不分极性,板载整流全桥,自动调整电源极性。直流输入连接6-24伏任意直流电源,有连接座方便连接。时钟部分

3、不须外界电源保持,自带后备电池,维持时钟运行。当系统整体工作时,时钟部分自动对后备电源涓流充电,保持电源容量。键盘输入部分采用矩阵键盘,预留4个空白键位,为以后系统功能拓展,对按键需求增加时准备。带有3组闹钟,断电自动保护,重新上电后闹钟不丢失。定时精度为分钟。闹钟到时会有蜂鸣器鸣响,约一分钟后自动停闹。还带有一路生日提醒,到达日期后也会有蜂鸣器鸣响。板载的实时温度测量探头可以实时测量环境温度,显示精度代0.1度,同时有上下限超温报警功能。一旦温度超过报警上限或低于报警下限,就会报警。上下限温度可自行设定。测温范围0度到99度三、操作说明主板上的显示部分液晶显示器显示的内容自左向右分别是:第一

4、行:年、月、日、星期第二行:时、分、秒,实时温度2*2矩阵键盘的左侧两列共4个按键,4个按键自上而下依次定义为:第一列:模式切换、保存闹钟、修改时间确认、闹钟换组第二列:光标左移、数字加一、数字减一、光标右移液晶显示器下方的白色按键是电源切换开关,弹起为交流供电,按下为直流供电。下面按模式介绍使用方法。(注:因为上电自动进入模式2正常显示模式,所以实际使用中模式显示的顺序与本说明不同)1、模式0:闹钟调整模式按动模式切换键至液晶屏左上角显示“alarm”,设置第一组闹钟。用光标移动键配合数字加减键设定闹钟,设定好后按保存闹钟键保存闹钟,此时液晶屏上显示“SaveAlarm”,片刻后返回设置界面

5、。按动闹钟换组键切换至下一组闹钟,按同样的步骤设置。切换时,屏幕上显示“ChangeTeam”,片刻后返回设置界面。3组闹钟可以循环切换。闹钟断电后可保存不丢失。注意:每设完一组闹钟后都需要保存,切换闹钟后上一组闹钟的数据会被覆盖。同时退出闹钟设置模式会将缓冲区内的闹钟数据全部清空。2、模式1:时间调整模式按动模式切换键至液晶屏右上角显示“adjust”,设置时间。用光标移动键配合数字加减键设定时间、日期,设定完成后,必须按修改时间确认键,确认并保存修改后的时间,否则,修改的时间数据不会被更新到时钟芯片中。3、模式2:正常显示模式上电默认进入的模式,正常显示时间、日期、温度等数据4、模式4:上

6、下限报警温度设置模式按动模式切换键至液晶屏左边显示“max_temp、min_temp”,各自对应着上限报警温度和下限报警温度。用光标移动键配合数字加减键设定,自动保存,设置完成后可直接退出。注:上下限报警温度掉电不保存。5、模式5:生日提醒模式按动模式切换键至液晶屏左上角显示“birthday”,设置生日提醒。操作同闹钟设置。生日提醒数据断电不丢失。五,功能测试1、设定好三组闹钟(时间间隔3分钟以上),分别到时后蜂鸣器报警,约一分钟后自动停止。2、用手捏住温度传感器,显示温度值上升,超过温度报警上限后蜂鸣器报警,松手后显示温度下降,低于温度报警上限后,蜂鸣器自动停止。3、设定好时间、闹钟、生

7、日提醒等数据后,切断外部电源供给(取下电池,切断220V电源),3小时后恢复供电,检查所有数据依然正确,时钟在断电期间依然在走动。七、未来功能扩展1、 画面风格显示功能选择。2、 增加EEPROM存储器,使闹钟的组数增多,保存时间不再受备份电源的限制。3、 增加无线数据传输功能,可对其他多部同型号数字钟同步统一时间、闹钟、生日提醒、温度报警设定等设定。附录一:总体电原理图附录二:程序清单#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit

8、 lcd_rs=P27;sbit lcd_rw=P26;sbit lcd_enable=P25;sbit sck=P21;sbit io=P22;sbit rst=P23;sbit DQ=P20;sbit key1=P10;sbit key2=P11;sbit key3=P12;sbit key4=P13;sbit beep=P24;uchar time_data7=12,7,4,17,11,58,30;uchar write_add7=0x8c,0x8a,0x88,0x86,0x84,0x82,0x80; /对时时向里面写的地址uchar read_add7=0x8d,0x8b,0x89,0

9、x87,0x85,0x83,0x81; /读时间时向里面写的地址uchar disp14;uchar t_data7=12,7,4,17,11,58,30; /*sbit lcd_rs=P34;sbit lcd_rw=P35;sbit lcd_enable=P36;sbit sck=P24;sbit io=P25;sbit rst=P26;sbit DQ=P27;*/*/*void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat);uchar read_ds1302(uchar add);void set_r

10、tc();void read_rtc();void time_pros();void change_day(uchar com); /星期转换void lcd_1302_display();/*/*/延时函数,在12MHz的晶振频率下/大约50us的延时/*void delay_50us(uint t);/*/延时函数,在12MHz的晶振频率下/大约50ms的延时/*void delay_50ms(uint t);/*/*void lcd_delay(uint z);void lcd_com(uchar com); /写指令void lcd_dat(uchar dat); /写数据void l

11、cd_inital(); /液晶初始化void lcd_com_dat(uchar com,uchar dat);void lcd_com_string(uchar com,uchar dat);/*/*void init_ds18b20(void);void b1820_delay(uint t);void write_byte(uchar dat);uchar read_byte(void);uint readtemperature(void);void change_temperature();/*/*void key_change_time();/*/*void main()lcd_i

12、nital(); while(1)key_change_time(); /时间调节delay_50us(20);lcd_1302_display(); /时间显示change_temperature(); /温度显示/*/*void delay_50us(uint t) uchar j; for(;t>0;t-) for(j=19;j>0;j-);void delay_50ms(uint t) uint j; for(;t>0;t-) for(j=6245;j>0;j-);void lcd_com(uchar com)/写指令lcd_rs=0;lcd_rw=0;P0=c

13、om;lcd_enable=1;lcd_delay(1);lcd_enable=0; void lcd_dat(uchar dat)/写数据lcd_rs=1;lcd_rw=0;P0=dat;lcd_enable=1;lcd_delay(1);lcd_enable=0;void lcd_inital()/ 初始化程序lcd_rs=0;lcd_rw=0;lcd_com(0x38);lcd_com(0x01); lcd_delay(5);lcd_com(0x0c); /不显示光标void lcd_delay(uint z) /延时函数uint x,y;for(x=z;x>0;x-)for(y=

14、110;y>0;y-); void lcd_com_dat(uchar com,uchar dat) /在液晶的某一位置写某个数 lcd_com(0x80+com); lcd_delay(5);if(dat>='A'&&dat<='Z'|dat>='a'&&dat<='z')lcd_dat(dat);elselcd_dat(0x30+dat); void lcd_com_string(uchar com,uchar dat) /在某个位置写字符串uchar a; lcd

15、_com(0x80+com); lcd_delay(5);for(a=0;a<3;a+)lcd_dat(data);lcd_delay(5);/*/*/1302实时时钟部分void write_ds1302_byte(uchar dat)/用时钟写一个字节 uchar i; for(i=0;i<8;i+) sck=0; io=dat&0x01; dat=dat>>1; sck=1; void write_ds1302(uchar add,uchar dat) /随机写入数据 rst=0; _nop_(); sck=0;_nop_(); rst=1; _nop_(

16、); write_ds1302_byte(add); write_ds1302_byte(dat); rst=0; _nop_(); io=1; sck=1;uchar read_ds1302(uchar add) /随机读出一个数据 uchar i,value; rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add); for(i=0;i<8;i+) value=value>>1; sck=0; if(io) value=value|0x80; sck=1; rst=0; _nop_();

17、 sck=0; _nop_(); sck=1; io=1; return value;void set_rtc() /对1302进行对时uchar time_data7=12,7,4,17,11,58,30; /年周月日时分秒uchar i,j;for(i=0;i<7;i+) j=time_datai/10; time_datai=time_datai%10; time_datai=time_datai+j*16; write_ds1302(0x8e,0x00); /去除写保护for(i=0;i<7;i+) write_ds1302(write_addi,time_datai);w

18、rite_ds1302(0x8e,0x80); /加写保护void read_rtc(void)/读出当前时间 uchar i; for(i=0;i<7;i+) time_datai=read_ds1302(read_addi);void time_pros(void) /显示时分秒 disp0=time_data6%16; /秒 disp1=time_data6/16; disp2=time_data5%16; /分 disp3=time_data5/16; disp4=time_data4%16; /时 disp5=time_data4/16; disp6=time_data3%16

19、; /日 disp7=time_data3/16; disp8=time_data2%16; /月 disp9=time_data2/16; disp10=time_data1%16; /周 disp11=time_data1/16; disp12=time_data0%16; /年 disp13=time_data0/16;void change_day(uchar com) /写星期进去switch(disp10)case 1: lcd_com_string(com,"MON");break;case 2: lcd_com_string(com,"TUE&qu

20、ot;);break;case 3: lcd_com_string(com,"WED");break;case 4: lcd_com_string(com,"THU");break;case 5: lcd_com_string(com,"FRI");break;case 6: lcd_com_string(com,"SAT");break;case 7: lcd_com_string(com,"SUN");break;void lcd_1302_display()rst=1;read_rtc()

21、; /读时间rst=0;time_pros(); /处理时间lcd_com_dat(0x01+2,2);lcd_com_dat(0x02+2,0);lcd_com_dat(0x03+2,disp13); /年十位lcd_com_dat(0x04+2,disp12);/年个位lcd_com_dat(0x05+2,0x2d-0x30);lcd_com_dat(0x06+2,disp9);/月十位 lcd_com_dat(0x07+2,disp8);/月个位lcd_com_dat(0x08+2,0x2d-0x30); change_day(0x0d); /周lcd_com_dat(0x09+2,di

22、sp7);/日十位lcd_com_dat(0x0a+2,disp6);/日个位lcd_com_dat(0x48,disp0); /秒个位lcd_com_dat(0x47,disp1);/秒十位lcd_com_dat(0x46,0x3a-0x30);lcd_com_dat(0x45,disp2); /分个位lcd_com_dat(0x44,disp3);/分时位lcd_com_dat(0x43,0x3a-0x30);lcd_com_dat(0x42,disp4); /时个位lcd_com_dat(0x41,disp5);/时十位 /*/*/温度部分void b1820_delay(uint t)

23、 while(t-); void init_ds18b20(void) /对ds18b20进行初始化 uchar n; DQ=1; b1820_delay(8); DQ=0; b1820_delay(80); DQ=1; b1820_delay(8); n=DQ; b1820_delay(4);void write_byte(uchar dat) /对ds18b20写一个字节 uchar i; for(i=0;i<8;i+) DQ=0; DQ=dat&0x01; b1820_delay(4); DQ=1; dat>>=1; b1820_delay(4);uchar r

24、ead_byte(void) /对ds18b20读一个字节 uchar i,value; for(i=0;i<8;i+) DQ=0; value>>=1; DQ=1; if(DQ) value|=0x80; b1820_delay(4); return value;uint readtemperature(void) /返回的一个16位的数 uint a,c,b; init_ds18b20(); write_byte(0xcc); /跳过ROM write_byte(0x44); /启动温度测量 b1820_delay(300); init_ds18b20(); write_

25、byte(0xcc); write_byte(0xbe); a=read_byte(); /读低8位 b=read_byte(); /读第二个8位 c=b*256+a; return c;void change_temperature()uint temp;uchar tp;temp=readtemperature()>>3;/readtemperature()/256;tp=temp&0x01;if(tp=1) /显示小数lcd_com_dat(0x4d,5);elselcd_com_dat(0x4d,0);temp=readtemperature()>>4;

26、/显示整数部分lcd_com_dat(0x4a,temp/10%10);lcd_com_dat(0x4b,temp%10);lcd_com_dat(0x4c,0x2e-0x30);lcd_com_dat(0x4e,0xdf-0x30);lcd_com_dat(0x4f,'C');/*/*void key_change_time()/*闹钟设置?if(key1=0) delay_50us(200); /延时消抖10msif(key1=0) set_rtc(); /对时钟芯片进行时间设置while(!key1);/*?if(key2=0) delay_50us(200); /延时消

27、抖10msif(key2=0) uchar flag=1,flag1=1,flag2=0;while(!key2);lcd_com(0x0f); /显示光标lcd_com_dat(0x47,disp1);/使得光标显示在秒的个位while(flag=1)if(key2=0) delay_50us(200); /延时消抖10msif(key2=0)flag=0;lcd_com(0x0c); /不显示光标while(!key2);if(key3=0) delay_50us(200); /延时消抖10msif(key3=0)flag1+;if(flag1=14)flag1=1;while(!key3

28、);switch(flag1) /使光标闪烁在正确位置case 1:lcd_com_dat(0x47,disp1);break;case 2:lcd_com_dat(0x46,0x3a-0x30);break;case 3:lcd_com_dat(0x44,disp3); break;case 4:lcd_com_dat(0x43,0x3a-0x30);break;case 5:lcd_com_dat(0x41,disp5);break;case 6:lcd_com_dat(0x40,0x20-0x30);break;case 7:switch(disp10)case 1: lcd_com_d

29、at(0x0d,'M');break;case 2: lcd_com_dat(0x0d,'T');break;case 3: lcd_com_dat(0x0d,'W');break;case 4: lcd_com_dat(0x0d,'T');break;case 5: lcd_com_dat(0x0d,'F');break;case 6: lcd_com_dat(0x0d,'S');break;case 7: lcd_com_dat(0x0d,'S');break; break;ca

30、se 8: lcd_com_dat(0x09+2,disp7);break;case 9: lcd_com_dat(0x08+2,0x2d-0x30);break;case 10: lcd_com_dat(0x06+2,disp9);break;case 11: lcd_com_dat(0x05+2,0x2d-0x30);break;case 12: lcd_com_dat(0x03+2,disp13);break;case 13: lcd_com_dat(0x02+2,0);break;if(key4=0) delay_50us(200); /延时消抖10msif(key4=0)if(fla

31、g1=1)disp0+;if(disp0=10)disp0=0;while(!key4);lcd_com_dat(0x48,disp0); /秒个位lcd_com_dat(0x47,disp1);/使得光标显示在秒的个位else if(flag1=2)disp1+;if(disp1=6)disp1=0;while(!key4);lcd_com_dat(0x47,disp1); lcd_com_dat(0x46,0x3a-0x30);else if(flag1=3)disp2+;if(disp2=10)disp2=0;while(!key4);lcd_com_dat(0x45,disp2); l

32、cd_com_dat(0x44,disp3);/使得光标显示在秒的个位else if(flag1=4)disp3+;if(disp3=6)disp3=0;while(!key4);lcd_com_dat(0x44,disp3); lcd_com_dat(0x43,0x3a-0x30);/使得光标显示在秒的个位else if(flag1=5)if(flag2=0) /24进制disp4+; /调节小时的时间if(disp4=10)disp4=0;disp5+;if(disp5=2&&disp4=4)disp4=0;disp5=0;flag2=1;if(flag2) /12进制di

33、sp4+; /调节小时的时间if(disp4=10)disp4=0;disp5+;if(disp5=1&&disp4=3)disp4=0;disp5=0;flag2+;if(flag2=3)flag2=0;while(!key4);if(flag2=1)lcd_com_dat(0x00,'A');lcd_com_dat(0x01,'M');else if(flag2=2)lcd_com_dat(0x00,'P');lcd_com_dat(0x01,'M');else if(flag2=0)lcd_com_dat(0

34、x00,0x20-0x30);lcd_com_dat(0x01,0x20-0x30);lcd_com_dat(0x42,disp4); lcd_com_dat(0x41,disp5);else if(flag1=6)disp5+;if(flag2=0)if(disp5=3)disp5=0;else if(disp5=3)disp5=0;while(!key4);lcd_com_dat(0x41,disp5); lcd_com_dat(0x40,0x20-0x30);/使得光标显示在秒的个位else if(flag1=7)disp10+;if(disp10=8)disp10=1;while(!k

35、ey4);switch(disp10)case 1: lcd_com_string(0x0d,"MON");break;case 2: lcd_com_string(0x0d,"TUE");break;case 3: lcd_com_string(0x0d,"WED");break;case 4: lcd_com_string(0x0d,"THU");break;case 5: lcd_com_string(0x0d,"FRI");break;case 6: lcd_com_string(0x0d,"SAT");break;case 7: lcd_com_string(0x0d,"SUN");break;/delay_50ms(1); switch(disp10)case 1: lcd_com_dat(0x0d,'M');break;case 2: lcd_com_dat(0x0d,'T');break;case 3: lcd_com_dat(0x0d,'W');break;case 4: lcd_com_dat(0x0d,'T&#

温馨提示

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

评论

0/150

提交评论