版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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) 时钟芯片的精确计时。、整体介绍:本作品整体如上图,由主板,电池两部分组成。采用双路供电,电池、交流任选。交流输入不分极性,板载整流全桥,自动调整电源 极性。直流输入连接
3、6-24伏任意直流电源,有连接座方便连接。时钟部分不须外界电源保持,自带后备电池,维持时钟运行。当系统整体工作时,时 钟部分自动对后备电源涓流充电,保持电源容量。键盘输入部分采用矩阵键盘,预留 4个空白键位,为以后系统功能拓展,对按键需求 增加时准备。带有3组闹钟,断电自动保护,重新上电后闹钟不丢失。定时精度为分钟。闹钟到时 会有蜂鸣器鸣响,约一分钟后自动停闹。还带有一路生日提醒,到达日期后也会有蜂鸣器鸣响。板载的实时温度测量探头可以实时测量环境温度,显示精度代0.1度,同时有上下限超温报警功能。一旦温度超过报警上限或低于报警下限,就会报警。上下限温度可自行设定。测温范围 0 度到 99度三、
4、操作说明 主板上的显示部分液晶显示器显示的内容自左向右分别是: 第一行:年、月、日、星期第二行:时、分、秒,实时温度2*2 矩阵键盘的左侧两列共 4个按键, 4个按键自上而下依次定义为: 第一列:模式切换、保存闹钟、修改时间确认、闹钟换组 第二列:光标左移、数字加一、数字减一、光标右移液晶显示器下方的白色按键是电源切换开关,弹起为交流供电,按下为 直流供电。下面按模式介绍使用方法。(注:因为上电自动进入模式 2 正常显示模式, 所以实际使用中模式显示的顺序与本说明不同)1、模式 0:闹钟调整模式按动模式切换键 至液晶屏左上角显示“ alarm ”,设置第一组闹钟。用光 标移动键配合数字加减键设
5、定闹钟,设定好后按 保存闹钟键 保存闹钟,此时 液晶屏上显示“ SaveAlarm”片刻后返回设置界面。按动 闹钟换组键切换至 下一组闹钟,按同样的步骤设置。切换时,屏幕上显示“ ChangeTeai”片刻 后返回设置界面。 3组闹钟可以循环切换。闹钟断电后可保存不丢失。 注意: 每设完一组闹钟后都需要保存,切换闹钟后上一组闹钟的数据会被覆盖。同 时退出闹钟设置模式会将缓冲区内的闹钟数据全部清空。2、模式 1:时间调整模式按动模式切换键 至液晶屏右上角显示“ adjust ”,设置时间。用光标移动 键配合数字加减键设定时间、日期,设定完成后,必须按 修改时间确认键 , 确认并保存修改后的时间,
6、否则,修改的时间数据不会被更新到时钟芯片中。3、模式 2:正常显示模式上电默认进入的模式,正常显示时间、日期、温度等数据4、模式 4:上下限报警温度设置模式按动模式切换键至液晶屏左边显示“ max_temp min_temp”各自对应着上限报警温度和下限报警温度。用光标移动键配合数字加减键设定,自动保 存,设置完成后可直接退出。注:上下限报警温度掉电不保存。5、模式 5:生日提醒模式按动模式切换键 至液晶屏左上角显示“ birthday ”,设置生日提醒。操作同闹 钟设置。生日提醒数据断电不丢失。五,功能测试1、设定好三组闹钟(时间间隔 3 分钟以上),分别到时后蜂鸣器报警,约一分钟后自动停
7、止。2、用手捏住温度传感器,显示温度值上升,超过温度报警上限后蜂鸣器报警,松手后显 示温度下降,低于温度报警上限后,蜂鸣器自动停止。3、设定好时间、闹钟、生日提醒等数据后,切断外部电源供给(取下电池,切断 220V 电 源),3 小时后恢复供电,检查所有数据依然正确,时钟在断电期间依然在走动。七、未来功能扩展1、画面风格显示功能选择。2、增加 EEPROM 存储器,使闹钟的组数增多,保存时间不再受备份电源的限制。3、增加无线数据传输功能,可对其他多部同型号数字钟同步统一时间、闹钟、生日提 醒、温度报警设定等设定。附录一:总体电原理图?muKIiOWil:ELKBTEhwK2OK1OK?.a M
8、i-oKlDlmi:画pi ifa,MMIK出測 jucm ?IJCK?i.iWpi碑Pk2O卫puStlBOHJJH翊1mJfi匹迈HIM?:/io:E2IPS斜3ML 3呛*POj 3帕WJTWM和附录二:程序清单#include#include #define uchar unsigned char#define uint unsigned intsbit lcd_rs=P2A7;sbit lcd_rw=P2A6;sbit lcd_enable=P2A5;sbit sck=P2A1;sbit io=P2A2;sbit rst=P2A3;sbit DQ=P2A0;sbit key1=P1A
9、0;sbit key2=P1A1;sbit key3=P1A2;sbit key4=P1A3;sbit beep=P2A4;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,0x87,0x85,0x83,0x81; uchar disp14;uchar t_data7=12,7,4,17,11,58,30;/*sbit lcd_rs=P3A4;sbit lcd_r
10、w=P3A5;sbit lcd_enable=P3A6;sbit sck=P2A4;sbit io=P2A5;sbit rst=P2A6;sbit DQ=P2A7;*/ /*/* void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat);uchar read_ds1302(uchar add);void set_rtc();void read_rtc();void time_pros();void change_day(uchar com); /星期转换void lcd_1302_display(); /*
11、/* /延时函数,在 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 lcd_inital();/写指令 /写数据 /液晶初始化void lcd_com_dat(uchar com,uchar dat); void lcd_com_string(uchar com
12、,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_inital();while(1)key_change_time();delay_50us(20);lcd_1302_display(); change_temperatu
13、re();/时间调节/时间显示/温度显示/*/*void delay_50us(uint t)uchar j;for(;t0;t-)for(j=19;j0;j-);void delay_50ms(uint t)uint j;for(;t0;t-) for(j=6245;j0;j-);void lcd_com(uchar com)/写指令lcd_rs=0;lcd_rw=0;P0=com;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;
14、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;x0;x-)for(y=110;y0;y-);void lcd_com_dat(uchar com,uchar dat) / 在液晶的某一位置写某个数 lcd_com(0x80+com);lcd_delay(5);if(dat=A&dat=a&d
15、at=z) lcd_dat(dat);elselcd_dat(0x30+dat);void lcd_com_string(uchar com,uchar dat)uchar a;lcd_com(0x80+com);lcd_delay(5);for(a=0;a3;a+)lcd_dat(data);lcd_delay(5);*/在某个位置写字符串/*/1302 实时时钟部分void write_ds1302_byte(uchar dat)uchar i;for(i=0;i1; sck=1;/用时钟写一个字节void write_ds1302(uchar add,uchar dat) rst=0;_
16、nop_();sck=0;_nop_();rst=1;_nop_(); 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;i1; sck=0; if(io) value=value|0x80; sck=1;rst=0;_nop_();s
17、ck=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;i7;i+) j=time_datai/10; time_datai=time_datai%10; time_datai=time_datai+j*16; write_ds1302(0x8e,0x00); / 去除写保护 for(i=0;i7;i+)write_ds1302(write_addi,time_datai); write_ds1
18、302(0x8e,0x80); / 加写保护void read_rtc(void) / 读出当前时间uchar i;for(i=0;i7;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;/日disp7=time_data3/16
19、;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);break;case 3: lcd_com_string(com,WED);break;case 4: l
20、cd_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();/ 读时间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(
21、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,disp7);/周/日十位/日个位lcd_com_dat(0x0a+2,disp6);lcd_com_dat(0x48,disp0);lcd_com_dat(0x47,disp1);lcd_com_dat(0x46,0x3a-0x30);lcd
22、_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)while(t-);/对 ds18b20 进行初始化void init_ds18b20(void)uchar n;DQ=1; b1820_delay(8);DQ=0; b1820_delay(80);DQ=1; b1820_delay(8);n
23、=DQ; b1820_delay(4);/ 对 ds18b20 写一个字节void write_byte(uchar dat)uchar i;for(i=0;i=1; b1820_delay(4);uchar read_byte(void)/对 ds18b20 读一个字节uchar i,value; for(i=0;i=1;DQ=1; if(DQ) value|=0x80; b1820_delay(4);return value;uint readtemperature(void) / 返回的一个 16 位的数 uint a,c,b; init_ds18b20();write_byte(0xc
24、c); / 跳过 ROM write_byte(0x44); / 启动温度测量 b1820_delay(300);init_ds18b20(); write_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_
25、dat(0x4d,5);elselcd_com_dat(0x4d,0); temp=readtemperature()4; / 显示整数部分 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();
26、/ 对时钟芯片进行时间设置while(!key1);/*?if(key2=0)/延时消抖 10msdelay_50us(200); if(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); if(key2=0) flag=0; lcd_com(0x0c); while(!key2);if(key3=0)delay_50us(200);if(key3=0)flag1+;if(flag1=14)f
27、lag1=1;while(!key3);switch(flag1)/显示光标/使得光标显示在秒的个位/ 延时消抖 10ms/不显示光标/ 延时消抖 10ms/使光标闪烁在正确位置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_
28、com_dat(0x40,0x20-0x30);break;case 7: 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);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; bre
29、ak;case 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)
30、 if(flag1=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,dis
31、p2);lcd_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 进制dis
32、p4+;/调节小时的时间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(0x00,0x20-0x30);lcd_com_dat(0x01,0x20-0x30);lcd_co
33、m_dat(0x42,disp4);lcd_com_dat(0x41,disp5);else if(flag1=6)disp5+;if(flag2=0)if(disp5=3)disp5=0;elseif(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(!key4);switch(disp10)case 1: lcd_com_string(0x0d,M
34、ON);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);break;case 5: l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国环保用品设备行业市场前景预测及投资价值评估分析报告
- 2026年中国麻醉盐水架行业市场前景预测及投资价值评估分析报告
- 2026年中国量变送器行业市场前景预测及投资价值评估分析报告
- 2025年建平县面向社会公开招聘城市社区工作者21人考试笔试参考题库附答案解析
- 2025年体育赛事赞助合同终止及权益协议
- 药剂科抗菌药物应用须知
- 2026年浙江纺织服装职业技术学院单招职业适应性测试题库附答案
- 2026年广东水利电力职业技术学院单招职业倾向性测试题库及答案1套
- 2026年太原旅游职业学院单招职业倾向性考试必刷测试卷附答案
- 2026年辽宁省葫芦岛市单招职业适应性测试必刷测试卷必考题
- 湖南省湘潭市2024-2025学年九年级上学期1月期末历史试题
- 库蚊环境适应性-深度研究
- 新能源行业人力资源规划与招聘
- 蛇串疮的健康宣教
- DB33 1121-2016 民用建筑电动汽车充电设施配置与设计规范
- 自动化电气元器件介绍与使用
- 【MOOC】温病学-河南中医药大学 中国大学慕课MOOC答案
- 直线和圆的方程 直线与圆的位置关系 教学设计
- 《中华人民共和国学前教育法》专题培训
- 《外科护理学(第七版)》考试复习题库-下(多选题)
- 2024年世界职业院校技能大赛高职组“研学旅行组”赛项参考试题库(含答案)
评论
0/150
提交评论