




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、广东诲译犬学基于51单片机的万年历的设计学生姓名学 号所在专业电子信息工程所在班级电子1111小组成员指导教师完成日期基于51单片机的万年历的设计1需求分析1.1 “需“的分析万年历是一个可以显示当前时间、日历、温度信息以及设置闹钟报警的应用系统, 其具有以下功能:(1)可以显示当前的时间信息;(2)可以显示当前的温度;(3)可以手动修改时间;(4)可以设置闹钟,并且达到设置的时间点发出音响信号。1.2 “求“的分析设计万年历,需要考虑以下几方面的内容:(1)如何获取当前的时间信息,这些时间信息包括时、分、秒、年、月、日、和 星期;(2)如何获得当前的温度信息,精确到 1 C即可;(3)提供必
2、要的用户输入设置通道;(4)提供相应的显示和报警部件;(5)需要写出合适的软件应用代码。2方案设计与论证2.1 时间获取方法的方案设计与论证方案一:使用单片机的内部定时器进行定时,使用软件算法来计算当前的时间信息。此种方 案虽然可以不使用时钟芯片,节约成本,但是时间的精准度一般,软件代码复杂万案一:采用外部扩展实时时钟芯片 DS12C887勺方式来获取相应的时间信息。DS12C887是一种高性能的芯片,能自动产生年、月、日、时、分、秒等信息,并有 闰年修正功能。采用双电源供电方式,可设置备用电源充电方式,提供了对后备电源进 行涓细电流的充电的能力,在能满足精度要求的同时价格也比较便宜,性价比较
3、高。所以采用方案二。2.2 显示模块的方案设计与论证方案一:采用LED数码管动态扫描。LED数码管价格适中,但只能显示数字和简单的 字符,且其的接口线少万案一:采用点阵式数码管显示。点阵式数码管是由八行八列的发光二极管组成,并不太适 合于对数字跟字母进行显示,其主要用于汉字的显示。采用LED液晶显示屏。液晶显示屏的显示功能强大,可显示大量文字,图形,显示多 样,清晰可见,虽然价格稍微贵了点,但其接口线多。所以采用方案三。2.3 温度采集的方案设计与论证使用PT铂电阻采集。PT铂电阻根据温度变化的只是其电阻值,在实际使用过程, 需要额外的辅助器件将其转化为电压信号,并且通过调整后送到模/数字转换
4、器件才能让51单片机进行处理。方案二:使用数字温度传感器采集。温度传感器虽然、精度采样速度等性能比不上 PT铂电阻,但是其没有额外的附加器件,且能满足系统对采集精度的要求。所以采用数字温度传感器。3硬件设计3.1 万年历的硬件模块图3-1万年历的硬件模块3.2万年历的电路图3-2万年历的电路3.3硬件基础DS1302的硬件基础: 时钟芯片DS1302的工作原理:DS1302在每次进行读、写程序前都必须初始化,先把 SCLK端置“ 0”,接着把RST 端置“ 1”,最后才给予SCLK脉冲。图5为DS1302的控制字的位7必须置1,若为0则 不能把对DS1302进行读写数据。对于位6,若对程序进行
5、读/写时RAM=1对时间进行 读/写时,CK=0位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时, 该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。DS1302的日历、时间寄存器内容:“CH是时钟暂停标志位,当该位为1时,时钟振荡 器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP是写保护位, 在任何的对时钟和RAM勺写操作之前,WP必须为0。当“WP为1时,写保护位防止对 任一寄存器的写操作。(2)DS1302的控制字节DS1302的控制字如表-1所示。控制字节的高有效位(位 7)必须是逻辑1,如果它 为0,贝U不能把数据写入DS
6、1302中,位6如果0,则表示存取日历时钟数据,为1表示 存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位 0)如为0表示要进 行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。表3-1 DS1302的控制字格式(3)数据输入输出(I/O )在控制指令字输入后的下一个 SCLK寸钟的上升沿时,数据被写入 DS1302数据输 入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLKB冲的下降沿 读出DS1302的数据,读出数据时从低位 0位到高位7。如下图3-3所示:BXETI/O/扣盯XAlA2A3A4R/C-1DODlD2单宇*写hkFt1SCLKrurmT
7、ururLT ururururX/O、/ 5|AlA2AS| R/tl | C 皿 |D102图3-3 DS1302读/写时序图DS1302的寄存器DS1302有 12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式,其日历、时间寄存器及其控制字见表 3-2。表3-2 DS1302的日历、时间寄存器器Bit4Blt3-PBitZJBiti-PEito&1H-CH10 秒482H86DB3DS2ABD荒标归位00尊aa901X(3)输入方式选择指令: 表3-6输入方式选择指令指令功能箱令编玛1臨R/V1 114眄DMDB21 1/us逬入換式设置9j0901rrI/OS4
8、0(4) 显示开关控制指令:表3-7显示开关控制指令.腊會功能挹會輪码RSR/NDR7DB60841D&3DB2DB1显不开关桎制-0U1.01DCB44(5) 光标和画面移动指令:表3-8光标和画面移动指令表3-9功能设定指令指令功能指今策码/usRSDB/036DH5DH4DB3DEt?|问1功能设定*01NIFr1X4R(7) CGRAM设置指令:表3-10 CGRAM设置指令指令功健指令輪码时冋/US0B7D辭050B41 。曲 1 Dtl2 B1地址0091CGRAtJlfe 址“程)(8) DDRAM设置指令:表3-11 DDRAM设置指令I指令功擁堵令编码时面/US0B/DB5K
9、41DSJ 1 D2 B1DBCI设 Rodham 葩址01CKKAHBt地址存位)40(9) 读BF和AC指令:表3-12读BF和AC指令:菲令功能指今编码S I/U5R/WUB/0B6DB弓 | D曲DB3DB2 i 0B1lBU1社内容(7)du(10) 写数据指令:表3-13写数据指令)7指令功能|指令编码SS/U5RSR/VDRfDM0l3tBIl數据写入到CGIMNI 1u要号入的数据W00轴(11) 读数据指令:表3-14读数据指令:指令功能抱令編码I RSR/W0B7PBfrDBSDB4D时PflZDIMDBAy.ccftftn 岀 数据11要谀岀的數据07-0图4-1万年历的
10、工作流程5总结5.1 仿真结果及分析经过多次调试、修改程序,万年历终于在 pruteus正常运行起来了。前面由于初次 写的代码有较多不完善的地方,所以调试的时候出了很多大的问题,第一次发现大的问 题后,团队认真地讨论并修改了程序,后面调试遇到的都是些小问题,无非是打漏或者 打错这类问题。5.2 心得工程上的问题很多不是一个人的能力可以解决的,所以不能老是想着单干、蛮干, 一定要发挥团队的力量,多讨论,讨论往往可以碰撞出思想的火花来。做事的时候一定 要静下心来,保持专注,不能老想着快,不然会弄出很多本可以避免的问题,敲代码的 时候,为了求快,结果调试的遇到小问题花了可不少时间才解决。本次课程设计
11、,让我 知道了要想解决工程上的问题,必须现将问题具体化、模块化,然后再逐个击破,这样 才能更有效率地解决整个工程设计再到实物的问题。附录一:仿真图附录二:程序#i nclude#i nclude#defi ne TIME (0X10000-50000)#defi ne FLAG 0XEF 闹钟标志/引脚连接图sbit rst=P3A5;sbit clk=P3A4;sbit dat=P3A3;sbit rs=P1A5;sbit rw=P1A6;sbit e=P1A7;sbit DQ=P1A4; /温度输入口sbit ACC_7=ACCA7;/全局变量及常量定义unsigned char i=20
12、,j,time116;unsigned char alarm2,time215,time3;个月的最unsigned char code Day=31,28,31,30,31,30,31,31,30,31,30,31;/12 大日期(非闰年)/音律表unsigned int code table1=64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217;/发声部分的延时时间unsigned char code table2=0x82,1,0x81,0xf4,0xd4,0x
13、b4,0xa4,0x94,0xe2,1,0xe1,0xd4,0xb4,0xc4,0xb4,4,0;/LCD自建字unsigned char code tab=0x18,0x1b,5,4,4,5,3,0,0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,年0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,月0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00;温度小数部分用查表法*un sig nedcharditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05
14、,0x06,0x06,0x07,0x08 ,0x08,0x09,0x09;/闹钟中用的全局变量codeun sig ned char th1,tl1;un sig ned char temp_data2=0x00,0x00; bit flag;18b20存在标志位/读出温度暂放11微秒延时函数*/delay (un sig ned int t) for(;t0;t-);18B20复位函数RST18B20(void)un sig ned char i;DQ=1;_nop_();_nop_();DQ=0;/delay(50); / 550usDQ=1;/dela y(6); / 66usfor(i
15、=0;i0; i-) /DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDQ=val&0x01;/最低位移出dela y(6);66usval=val/2;/右移一位DQ=1; delay(1);18B20读1个字节函数*/从总线上读取一个字节un sig ned char Read1Byte18B20(void)un sig ned char i;un sig ned char value=0;for (i=8;i0;i-)DQ=1;_nop_();_nop_(); value=1;DQ=0;/_no
16、p_();_nop_();_nop_();_nop_(); 4us DQ=1;_nop_();_nop_();_nop_();_nop_(); /4us if(DQ)value|=0x80;dela y(6);/66usDQ=1;return(value);Read18B20()RST18B20();/ 总线复位if(!flag)/判断ds1820是否存在?若ds18b20不存在则返回return;/ Skip ROM/发转换命令/发读命令/Write1Byte18B20(0xCC);/Write1Byte18B20(0x44);/delay(70);Write1Byte18B20(0xCC)
17、;Write1Byte18B20(0xBE);temp_data0=Read1Byte18B20(); / 温度低 8 位 temp_data1=Read1Byte18B20(); / 温度高 8 位 RST18B20();/ Skip ROM/发转换命令Write1Byte18B20(0xCC);Write1Byte18B20(0x44);温度数据处理函数*/DealTempData() un sig ned char n=0,m;if(temp_data1127) 负温度求补码 temp_data1=(256-temp_data1); temp_data0=(256-temp_data0)
18、; n=1; time213=ditabtemp_data0&0x0f+0; time212=.;m=(temp_data0&0xf0)4)|(temp_data1&0x0f)4); if(n)m-=16; time29=m/100+0; time211=m%100;time210=time211/10+0;time211=time211%10+0;if(time29=0)最高位为0时都不显示time29=0x20;if(n)/负温度时最高位显示-time29=-;if(time210=0) if(n)time210=-; time29=0x20;elsetime210=0x20;if(tim
19、e211=0&time213=0)time211=time212=0x20;delay1ms(unsigned char time)/ 延时 1msun sig ned char i,j;for(i=0;itime;i+)for(j=0;j250;j+);/使能1602En ableLCD()rs=0;rw=0;e=0;delay1ms(3);e=1;/写LCD函数WriteLCD(u nsig ned char i)P0=i;rs=1;rw=0;e=0;delay1ms(2);e=1;/写LCD内部地址函数WriteLCDRAM(u nsig ned char data *address,m
20、)un sig ned char i,j;for(i=0;im;i+,address+)j=*address;WriteLCD(j);/LCD显示LCDSHOW()P0=0XC;En ableLCD();/显示器开、光标关P0=0x80;/写入显示起始地址En ableLCD();WriteLCDRAM(time1,16);P0=0xc1;/写入显示起始地址En ableLCD();WriteLCDRAM(time2,15);/自建字函数库Desig nH Z()un sig ned char i;P0=0x40;En ableLCD();for(i=0;i32;i+)WriteLCD(tab
21、i); delay1ms(2);/写DS1302子程序WriteDS1302(u nsig ned char address)un sig ned char i;clk=0;_nop_();rst=1;_nop_();for(i=0;i=1;clk=0;/读DS1302子程序un sig ned char ReadDS1302()un sig ned char i,j=0;for(i=0;i=1;_nop_(); clk=O;_nop_();if(dat) j|=0x80;_nop_(); clk=1; return(j);/部分显示数据初始化Timel nit() time11=time11
22、3=time28=time29=time210=0x20,time214=0; time16=1,time19=2,time112=3,time12=2,time13=0;time114=W,time22=time2 5=:;WriteDS1302(0xc1); alarm0=ReadDS1302(); rst=0;WriteDS1302(0xc3); alarm1=ReadDS1302(); rst=0;WriteDS1302(0xc5); time10=ReadDS1302(); rst=0;/读取时间ReadTime()un sig ned char i,m ,n;WriteDS1302
23、(0x8d); m=ReadDS1302();rst=0;time14=m/16+0x30; time15=m%16+0x30;WriteDS1302(0x8b); m=ReadDS1302();rst=0;time115=m+0x30;for(i=7, n=0x89;i11;i+=3, n-=2)/读取年份/读取星期/读取月份和日期WriteDS1302( n); m=ReadDS1302(); rst=0;time1i=m/16+0x30; time1i+1=m%16+0x30;/读取时,分,秒for(m=0,i=0, n=0x85;i7;i+=3 ,n-=2,m+) WriteDS130
24、2( n); timem=ReadDS1302(); rst=0; time2i=timem/16+0x30; time2i+1=timem%16+0x30;time0() in terrupt 1 using 1i-;if(i=0)if(j!=0)j-;i=20;TH0=TIME/256,TL0=TIME%256;/闹钟部分in time1() in terrupt 3TH1=th1,TL1=tl1;P3_2=!P3_2;/显示闹钟设置数据showalarm()un sig ned char i,j,a,b ,n;ET1=1;for(j=0;j=4;if(a=O)TR1=0; goto D1
25、;a=(-a)1)/2;TH仁th仁table1a/256,TL仁tl仁table1a%256; TR1=1;D1:dob-;for(n=0;n2)i+;j=(time110&0 xf)*10+(time111&0xf);i+=j;i%=7;if(i=0)i=7;return(i);/设置时间settime()un sig ned char i=0x85,year,m on th,day ,n; time26=time27=0x30,time114=time115=0x20; LCDSHOW();while(1)P0=0xe;/显示器开、光标开En ableLCD();PO=i;/定光标En
26、ableLCD();P2=0xf7;if(P2!=0XF7) delaylms(IOO);/ 延时 O.1s 去抖动if(P2!=0XF7)j=7;if(P2=0X77)i+=3;if(i=0x8e)i=0xc2;else if(i0xc5)i=0x85;else if(P2=0xb7)year=(time14&0 xf)*10+(time15&0xf); mon th=(time17&0 xf)*10+(time18&0xf); day=(time110&0 xf)*10+(time111&0xf); if(i=0x85)year+;if(year99)year=0;if(year%4)!=
27、0)if(mo nth=2&day=29)day=28;else if(i=0x88)mon th+;if(mo nth12)mon th=1;if(dayDaymo nth-1)day=Daym on th-1;if(mon th=2&(year%4)=0) day=29;else if(i=0x8b)day+;if(dayDaymo nth-1)if(mon th=2&(year%4)=0) if(day29) day=1;if(mo nth!=2)day=1;else if(i=0xc2)n=(time20&0xf)*10+(time21&0xf);n+;if(n 23)n=0;time
28、20=n/10+0x30;time21=n%10+0x30;elsen=(time23&0xf)*10+(time24&0xf);n+;if(n 59)n=0;time23=n/10+0x30;time24=n%10+0x30;time14=year/10+0x30;time1 5=year%10+0x30; time17=m on th/10+0x30;time18=mo nth%10+0x30;time110=day/10+0x30;time111=day%10+0x30;LCDSHOW();else if(P2=0xd7)WriteDS1302(0x8c);WriteDS1302(tim
29、e14&0xf)*16+(time15&0xf);rst=O;WriteDS1302(0x8a);WriteDS1302(setweek();rst=O;for(i=7, n=0x88;i11;i+=3, n-=2)WriteDS1302( n);WriteDS1302(time1i&0 xf)*16+(time1i+1&0xf);rst=0;for(i=0;i7;i+=3, n-=2)WriteDS1302( n);WriteDS1302(time2i&0 xf)*16+(time2i+1&0xf); rst=0;TR0=0; time114=W; return;else TR0=0; time114=W; return; if(j=0)TR0=0;time114=W; return;/设置闹钟setalarm()un sig ned char i,n;for(i=1;i0xc5) i=0xc2;else if(P2=0xb7)if(i=0xc2)n=(time20&0xf)*10+(time21&0xf);n+;if(n 23)n=0;time20=n/10+0x30;time21=n%10+0x30;elsen=(time23&0xf)*10+(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧教育平台下的教学模式创新
- 智慧城市大数据管理与隐私保护的未来趋势
- 教育资源优化配置在中医教学中的实践研究
- 全球化背景下的教育创新课程设计
- 营养膳食培训课件
- 智慧教育中的数字资源均衡分配方案
- 教育大数据库的构建与个性化学习方案设计实践
- 中国南方航空接送机理论培训
- 抖音商户达人合作流程标准化制度
- 抖音商户编导短视频传播潜力评估制度
- 风光储储能项目PCS舱、电池舱吊装方案
- 办公室常见颈腰椎疾病预防及养护
- 消防维保方案(消防维保服务)(技术标)
- 烟草专卖局招聘合同范本
- 2023年内蒙古生物学业水平测试卷
- 门诊就诊高峰期应急预案7篇,门诊患者高峰期应急预案
- 部编八下语文游记阅读训练题语文八年级下册能力训练(部编版)
- 保修管理控制程序
- GB/T 9117-2010带颈承插焊钢制管法兰
- GB/T 12513-2006镶玻璃构件耐火试验方法
- 人教版音乐三年级上册教材介绍-课件
评论
0/150
提交评论