完整版万年历课程设计_第1页
完整版万年历课程设计_第2页
完整版万年历课程设计_第3页
完整版万年历课程设计_第4页
完整版万年历课程设计_第5页
免费预览已结束,剩余20页可下载查看

付费下载

下载本文档

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

文档简介

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勺方式来获取相应的时间信息。DS12C88一种高性能的芯片,能自动产生年、月、日、时、分、秒等信息,并有闰年修正功能。采用双电源供电方式,可设置备用电源充电方式,提供了对后备电源进行涓细电流的充电的能力,在能满足精度要求的同时价格也比较便宜,性价比较高。所以采用方

3、案二。2.2 显示模块的方案设计与论证方案一:采用LED数码管动态扫描。LE躁码管价格适中,但只能显示数字和简单的字符,且其的接口线少万案一:采用点阵式数码管显示。合于对数字跟字母进行显示,万案二:采用LED液晶显示屏。点阵式数码管是由八行八列的发光二极管组成,并不太适其主要用于汉字的显示。液晶显小屏的显小功能强大,可显小大量文字,图形,显不多样,清晰可见,虽然价格稍微贵了点,但其接口线多。所以采用方案三。2.3 温度采集的方案设计与论证万案一:使用PT铝电阻采集。PT铝电阻根据温度变化的只是其电阻值,在实际使用过程,需要额外的辅助器件将其转化为电压信号,并且通过调整后送到模/数字转换器件才能

4、让51单片机进行处理。方案二:使用数字温度传感器采集。温度传感器虽然、精度采样速度等性能比不上PT铝电阻,但是其没有额外的附加器件,且能满足系统对采集精度的要求。所以采用数字温度传感器。3硬件设计图3-1万年历的硬件模块3.1 万年历的硬件模块3.2 万年历的电路图3-2万年历的电路3.3 硬件基础DS1302的硬件基础:(1)时钟芯片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的日历、时间寄存器内容:”CFT是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP是写保护位,在任何的对时钟和RAM勺写操作之前,WP、须为00当“WP为1时,写保护位防止对任一寄存器的写操作。(2) DS1302的控制字节DS1302的控制字如表-1所示。控制字节白高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS13

6、02中,位6如果0,则表示存取日历时钟数据,为1表示存取RAMK据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。表3-1DS1302的控制字格式(3)数据输入输出(I/O)在控制指令字输入后的下一个SCLK寸钟的上升沿时,数据被写入DS1302数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLKB冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图3-3所示:里罕节曲rTTTTTJTLJnL_nL_nL工2T斤一出口AiA2A3A4R/C-1X,/DODI口之洎芋诘与吧1tf_I

7、_f_I_f_I_1_I_f_I_f_I_f_I_f_I_f_I_f_I_t图3-3DS1302读/写时序图(4)DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表3-2。表3-2DS1302的日历、时间寄存器写1寄存器濠寄存器Hit*Hit34Hit*BU4qBlt3-PBiti-PEito1S0H.&1H-CH10秒4秒*82H<10分+'分,84H+'85H-12/24-33AK1/T-M-时,时.&7Ha,ID日日a89110-'JQ*,11口月一G

8、AIL'GBIL'0c0c0*-.里财“io好8EH.ftFHr口产3卜|Q*Or此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAMt目关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAMf关的寄存器分为两类:一类是单个RAW元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0+FDH其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM&存器,此方式下可一次性读写所有的RAM勺31个字节,命令控制字为FEH得)、FFH0安)。1602液晶的硬件基础:1602通常有14条引脚线或1

9、6条引脚线的LCD多出来的2条线是背光电源线VCC(15脚)和地线GND(16却),其控制原理与14脚的LCDI全一样,引脚定义如表3-3所示:表3-31602的引脚及其对应的功能引海引解电平输入/输出作用11US5电源地2'Ucc电源(干5盯aUee对比调整电压R50/1输入嘲激S|R/W输入g向LCD写入指佥或数据1'从LCD馔取信息6|11JfG输入使能信号,1号谖取信息,1一见下降沿)皤指令7D6B即,输入/镉出数据总统n院附最低位)BDB10/1输入/输出数据总线“mi9DS2D71输入/输出数据总线ling1DDfi30/1输入,褊出数据总线limaDE4e/1输入

10、/输出数据总线知仙12DSS0/1输入/输出数据总线式睚5ISDR6071输入/入出数据总线】i皿614D670/1输入,辅出数据总线Une*最高位)15:AUccLE背光电源正极14K接地LS背光电源负椎|1602支持的一系列指令:(1)清屏指令:表3-4清屏指令指令功能指令索刊/KRS|t>B60骷iDR,DB3DB2DDQ清屏°1B1&010|:000Q1(2)归零指令:表3-5归零指令指令功靛指令编码ASR/Ube71>86bttiDB3DS2DS1ABD光标归位0000901X1,(3)输入方式选择指令:表3-6输入方式选择指令指令功能指令编码1

11、4;/usR/V1.110B6DBZ1进入模式设置9°0.01I/Or40(4)显示开关控制指令:表3-7显示开关控制指令,指令功能指令编刊隔/心RSR/NDR7DB6DB4ID&3DB2DB1帆H显不开关桂制口0«U,01DCB44(5)光标和画面移动指令:表3-8光标和画面移动指令指令功能揖令羯码ASR/U»B7DR6D鸣0呐OB2DD1ODO蹄修动方而Bfl9BS1s/cR/L)XX4D(6)功能设定指令:表3-9功能设定指令指令功能指令编码瑞/U5RSM/UDB7IH5DH4岫31DB?DB1DBH功靛设定00II31此N'I'rp

12、X可口(7)CGRAM设置指令:表3-10CGRAM置指令指令功靛指令编码执行时间/USR,W0B7DB物DB50B40触2B1设定口GMfHI地址00故1匚GH口此地址(6位)(8)DDRAMg置指令:表3-11DDRAM置指令I指令功能指令编码执行时间R/W0B71DSfr口B5UB4DE*|D»2UB1DBO设Rodham地址0«1|(:电KRI1的地址(了位)40(9)读BF和AC指令:表3-12读BF和AC指令:指令功能指令墉色/U5R/WUB/0B6DBS|DB3DB20B1111就内容b位)凶II(10)写数据指令:表3-13写数据指令(11)读数据指令:表3

13、-14读数据指令,指令功能指令编码/u节RSR/WOBrPBfrDBSDBMIIB3PSZDB1DBfly.ccftftnDMIV售出数据11要读出的魏据G7-DB图4-1万年历的工作流程5总结5.1 仿真结果及分析经过多次调试、修改程序,万年历终于在pruteus正常运行起来了。前面由于初次写的代码有较多不完善的地方,所以调试的时候出了很多大的问题,第一次发现大的问题后,团队认真地讨论并修改了程序,后面调试遇到的都是些小问题,无非是打漏或者打错这类问题。5.2 心得工程上的问题很多不是一个人的能力可以解决的,所以不能老是想着单干、蛮干,一定要发挥团队的力量,多讨论,讨论往往可以碰撞出思想的火

14、花来。做事的时候一定要静下心来,保持专注,不能老想着快,不然会弄出很多本可以避免的问题,敲代码的时候,为了求快,结果调试的遇到小问题花了可不少时间才解决。本次课程设计,让我知道了要想解决工程上的问题,必须现将问题具体化、模块化,然后再逐个击破,这样才能更有效率地解决整个工程设计再到实物的问题。附录一:仿真图附录二:程序#include<AT89X52.H>#include<INTRINS.H>#defineTIME(0X10000-50000)#defineFLAG0XEF/闹钟标志/引脚连接图sbitrst=P3A5;sbitclk=P3A4;sbitdat=P3A3

15、;sbitrs=P1A5;sbitrw=PW6;sbite=P1A7;sbitDQ=P1A4;/温度输入口sbitACC_7=ACCA7;/全局变量及常量定义unsignedchari=20,j,time116;unsignedcharalarm2,time215,time3;unsignedcharcodeDay=31,28,31,30,31,30,31,31,30,31,30,31;/12个月的最大日期(非闰年)/音律表unsignedintcodetable1=64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,6505

16、8,65110,65157,65178,65217;/发声部分的延时时间unsignedcharcodetable2=0x82,1,0x81,0xf4,0xd4,0xb4,0xa4,0x94,0xe2,1,0xe1,0xd4,0xb4,0xc4,0xb4,4,0;/LCD自建字unsignedcharcodetab=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,0

17、x00;/*温度小数部分用查表法*/unsignedcharditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08code,0x08,0x09,0x09;/闹钟中用的全局变量unsignedcharth1,tl1;unsignedchartemp_data2=0x00,0x00;bitflag;/18b20存在标志位/*11微秒延时函数*/delay(unsignedintt)for(;t>0;t-);/*18B20复位函数*/RST18B20(void)/读出温度暂放d1:unsignedchar

18、i;DQ=1;_nop_();_nop_();DQ=0;/delay(50);/550usDQ=1;/delay(6);/66usfor(i=0;i<0x30;i+)if(!DQ)gotod1;flag=0;DQ=1;return;delay(45);flag=1;DQ=1;/清标志位,表示ds1820不存在延时500us置标志位,表示ds1820存在/*18B20写命令函数*/向1-WIRE总线上写一个字节voidWrite1Byte18B20(unsignedcharval)unsignedchari;for(i=8;i>0;i-)/DQ=1;_nop_();_nop_();D

19、Q=0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDQ=val&0x01;delay(6);val=val/2;DQ=1;delay(1);/66us/最低位移出右移一位/*18B20读1个字节函数*/从总线上读取一个字节unsignedcharRead1Byte18B20(void)unsignedchari;unsignedcharvalue=0;for(i=8;i>0;i-)DQ=1;_nop_();_nop_();value>>=1;DQ=0;/_nop_();_nop_();_nop_();_nop_();/4u

20、sDQ=1;_nop_();_nop_();_nop_();_nop_();/4usif(DQ)/66usvalue|=0x80;delay(6);DQ=1;return(value);/*读出温度函数*/Read18B20()RST18B20();/总线复位if(!flag)/判断ds1820是否存在?若ds18b20不存在则返回/SkipROM/发转换命令return;/Write1Byte18B20(0xCC);/Write1Byte18B20(0x44);/delay(70);Write1Byte18B20(0xCC);Write1Byte18B20(0xBE);temp_data0=

21、Read1Byte18B20();temp_data1=Read1Byte18B20();RST18B20();/发SkipROM命令发读命令温度低8位温度高8位/SkipROM/发转换命令if(time29='0')/最高位为0时都不显示Write1Byte18B20(0xCC);Write1Byte18B20(0x44);/*温度数据处理函数*/DealTempData()unsignedcharn=0,m;if(temp_data1>127)/负温度求补码temp_data1=(256-temp_data1);temp_data0=(256-temp_data0);

22、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'time29=0x20;if(n)/负温度时最高位显示"-"time29='-'

23、;if(time210='0')if(n)time210='-'time29=0x20;elsetime210=0x20;if(time211='0'&&time213='0')time211=time212=0x20;)delay1ms(unsignedchartime)延时1ms(unsignedchari,j;for(i=0;i<time;i+)(for(j=0;j<250;j+);)/使能1602EnableLCD()(rs=0;rw=0;e=0;delay1ms(3);e=1;)/写LCD函数

24、WriteLCD(unsignedchari)(P0=i;rs=1;rw=0;e=0;delay1ms(2);e=1;)/写LCD内部地址函数WriteLCDRAM(unsignedchardata*address,m)(unsignedchari,j;for(i=0;i<m;i+,address+)(j=*address;WriteLCD(j);)/LCD显示LCDSHOW()(P0=0XC;EnableLCD();/显小器开、光标关P0=0x80;/写入显示起始地址EnableLCD();WriteLCDRAM(time1,16);P0=0xc1;/写入显示起始地址EnableLCD

25、();WriteLCDRAM(time2,15);/自建字函数库DesignHZ()unsignedchari;P0=0x40;EnableLCD();for(i=0;i<32;i+)WriteLCD(tabi);delay1ms(2);/写DS1302T程序WriteDS1302(unsignedcharaddress)unsignedchari;clk=0;_nop_();rst=1;_nop_();for(i=0;i<8;i+)dat=address&1;_nop_();clk=1;address>>=1;clk=0;/读DS1302T程序unsigned

26、charReadDS1302()unsignedchari,j=0;for(i=0;i<8;i+)j>>=1;_nop_();clk=0;_nop_();if(dat)j|=0x80;_nop_();clk=1;)return(j);)/部分显示数据初始化TimeInit()(time11=time113=time28=time29=time210=0x20,time214=0;time16=1,time19=2,time112=3,time12='2',time13='0'time114='W,time22=time25=':

27、'WriteDS1302(0xc1);alarm0=ReadDS1302();rst=0;WriteDS1302(0xc3);alarm1=ReadDS1302();rst=0;WriteDS1302(0xc5);time10=ReadDS1302();rst=0;)/读取时间ReadTime()(unsignedchari,m,n;WriteDS1302(0x8d);m=ReadDS1302();rst=0;time14=m/16+0x30;time15=m%16+0x30;WriteDS1302(0x8b);m=ReadDS1302();rst=0;time115=m+0x30;f

28、or(i=7,n=0x89;i<11;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;i<7;i+=3,n-=2,m+)/读取时,分,秒(WriteDS1302(n);timem=ReadDS1302();rst=0;time2i=timem/16+0x30;time2i+1=timem%16+0x30;)time0()interrupt1using1(i-;if(i=0)(if(j!=0)j

29、-;i=20;)TH0=TIME/256,TL0=TIME%256;)/闹钟部分intime1()interrupt3(TH1=th1,TL1=tl1;P3_2=!P3_2;)/显示闹钟设置数据showalarm()(unsignedchari,j,a,b,n;ET1=1;for(j=0;j<6;j+)(i=0;while(1)(a=table2i;if(a=0)break;b=a&0xf;a>>=4;if(a=0)(TR1=0;gotoD1;)a=(-a)<<1)/2;TH1=th1=table1a/256,TL1=tl1=table1a%256;TR1

30、=1;D1:do(b-;for(n=0;n<3;n+)(ReadTime();LCDSHOW();P2=0xf7;if(P2=0xe7)(delay1ms(100);if(P2=0xe7)(TR1=0;ET1=0;return;)while(b!=0);i+;TR1=0;ET1=0;根据日期的变动自动调整星期unsignedcharsetweek()(unsignedchari=5,j,n;j=(time14&0xf)*10+(time15&0xf);n=j/4;i=i+5*n;n=j%4;if(n=1)i+=2;elseif(n=2)i+=3;elseif(n=3)i+

31、=4;j=(time17&0xf)*10+(time18&0xf);if(j=2)i+=3;elseif(j=3)i+=3;elseif(j=4)i+=6;elseif(j=5)i+=1;elseif(j=6)i+=4;elseif(j=7)i+=6;elseif(j=8)i+=2;elseif(j=9)i+=5;elseif(j=11)i+=3;elseif(j=12)i+=5;if(n=0)if(j>2)i+;j=(time110&0xf)*10+(time111&0xf);i+=j;i%=7;if(i=0)i=7;return(i);/设置时间set

32、time()unsignedchari=0x85,year,month,day,n;time26=time27=0x30,time114=time115=0x20;LCDSHOW();while(1)P0=0xe;/显小器开、光标开EnableLCD();P0=i;/定光标EnableLCD();P2=0xf7;if(P2!=0XF7)(delay1ms(100);/延时0.1s去抖动if(P2!=0XF7)(j=7;if(P2=0X77)(i+=3;if(i=0x8e)i=0xc2;elseif(i>0xc5)i=0x85;elseif(P2=0xb7)(year=(time14&am

33、p;0xf)*10+(time15&0xf);month=(time17&0xf)*10+(time18&0xf);day=(time110&0xf)*10+(time111&0xf);if(i=0x85)(year+;if(year>99)year=0;if(year%4)!=0)if(month=2&&day=29)day=28;elseif(i=0x88)(month+;if(month>12)month=1;if(day>Daymonth-1)(day=Daymonth-1;if(month=2&&

34、;(year%4)=0)day=29;elseif(i=0x8b)(day+;if(day>Daymonth-1)(if(month=2&&(year%4)=0)(if(day>29)day=1;if(month!=2)day=1;elseif(i=0xc2)(n=(time20&0xf)*10+(time21&0xf);n+;if(n>23)n=0;time20=n/10+0x30;time21=n%10+0x30;else(n=(time23&0xf)*10+(time24&0xf);n+;if(n>59)n=0;ti

35、me23=n/10+0x30;time24=n%10+0x30;time14=year/10+0x30;time15=year%10+0x30;time17=month/10+0x30;time18=month%10+0x30;time110=day/10+0x30;time111=day%10+0x30;LCDSHOW();elseif(P2=0xd7)(WriteDS1302(0x8c);WriteDS1302(time14&0xf)*16+(time15&0xf);rst=0;WriteDS1302(0x8a);WriteDS1302(setweek();rst=0;fo

36、r(i=7,n=0x88;i<11;i+=3,n-=2)(WriteDS1302(n);WriteDS1302(time1i&0xf)*16+(time1i+1&0xf);rst=0;for(i=0;i<7;i+=3,n-=2)(WriteDS1302(n);WriteDS1302(time2i&0xf)*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()(unsignedchari,n;for(i=1;i<16;i+)(time1i=0x20;time20=alarm0/16+0x30;time21=(alarm0&0xf)+0x30;time23=alarm1/16+0x30;time24=(alarm1&0xf)+0x30;time26=time27=0x30;LCDSHOW();i=0xc2;while(1)P0=0xe;/显示器开、光标开EnableLCD();P0=i;/定光标EnableLCD();P2=0xf7;if(P2!

温馨提示

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

最新文档

评论

0/150

提交评论