基于单片机的电子万历的设计论文.doc

上传人:仙人指路1688 文档编号:4148738 上传时间:2023-04-07 格式:DOC 页数:25 大小:3.41MB
返回 下载 相关 举报
基于单片机的电子万历的设计论文.doc_第1页
第1页 / 共25页
基于单片机的电子万历的设计论文.doc_第2页
第2页 / 共25页
基于单片机的电子万历的设计论文.doc_第3页
第3页 / 共25页
基于单片机的电子万历的设计论文.doc_第4页
第4页 / 共25页
基于单片机的电子万历的设计论文.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《基于单片机的电子万历的设计论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的电子万历的设计论文.doc(25页珍藏版)》请在三一办公上搜索。

1、江西科技师范大学通信与电子学院单片机应用技术实训报告实训题目: 电子万年历设计 小组成员: 班 级: 12电子信息工程职教本科1班 指导老师: 一、 实训选题内容、要求 电子万年历 要求:1、使用DS1302芯片,电路能使用液晶显示日期、时间、星期;2、电路能更改当前时间和日期;3、系统能设定闹钟,设定时间到了后用LED闪烁表示;二、实训计划和人员安排在这次单片机实训中,我们做的是万年历加闹钟电路。在这次实训中我们小组进行分工完成此次单片机实训。具体分工情况如下:4月15号4月16 整个小组进行讨论分析,确定如何完成这次实训。每个人开始在网上查找有关万年历有关的资料4月18 号4月19号 大家

2、将各自找好的资料进行分析,确定大概思路4月20号 4月22号 整理思路,写出大概的框架,以及流程图4月23号-4月24号 画出仿真电路4月25号4月27号 根据仿真电路写出单片机程序4月28号-4月30号 采购电路元件以及焊接电路板5月1号 5月3号 进行电路板的调试,直至达到选题要求具体人员安排王文博: 程序设计以及焊接电路板陈红英: 硬件部分设计及元件采购刘玉婷:PPT制作及实训报告兰小玲: 视屏录制 三、实训选题分析(主要完成对选题的功能分析,注重原理阐述;如何细化功能模块,软、硬件电路设计的设计思路)功能分析:电子万年历加闹钟就是实用单片机加上一个时钟芯片DS1302和几个与门芯片构成

3、一个可调节年月日时分秒,以及能够读取当前时间的一个电路和闹钟功能。实现我们日常生活中的日历的作用。硬件设计 由于电路程序复杂,本电路采用89c52单片机作为控制核心,它具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒等进行计时,具有闰年补偿功能,工作电压为2.5V-5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个用于临时存放数据的RAM寄存器。可产生年、月、日、时、分、。以及通过与门芯片和按键开关来实现年月日时分秒可调

4、。具体框架结构图如下:开关单 片 机 LCD显示与门芯片 DS1302芯片四、方案设计(最少要提出两种不同的方案,并比较两种方案在设计、实现细节方面的差异和优劣,确定实训最终选定方案)方案一:采用AT89C51芯片作为硬件核心,内部具有4KB ROM存储空间,能于3V的超低电压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术。显示部分 采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机相连接时,占用的单片机口线少,但所需要的数码管数量太多,焊接困难极易出错,所以不采用LED数码管作为显示。直接采用单片机定

5、时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒技术,调节部分使用与门芯片和按键开关进行调节。实现对年月日时分秒的调节与设定。方案二: 采用STC89C52芯片,它能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KB ROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或程序的新增功能需要烧入程序时,不需要对芯片进行多次插拔,所以不会对芯片造成损坏.采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。采用DS1302时钟芯片实现时钟,DS1302芯片是一

6、种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V-5.5V范围内,2.5V时耗电小于300Ma。调节部分使用与门芯片和按键开关进行调节。实现对年月日时分秒的调节与设定。最后,我们采用方案二STC89C52单片机 实时时钟芯片DS1302 显示使用LCD1602液晶显示屏,并设置了5个按键,每个按键分别标号为KEY1,KEY2,KEY3,KEY4.KEY5.按下KEY1,选择调节的对象,key2,key3键为加减键,key4为确定键,key5键为闹钟设置键。五、方案实现(根据选定的方案,给出每一功能模块具体的实

7、现细节,所选用的具体芯片介绍,得到的硬件电路和相应的函数模块) 单片机芯片的选择和方案论证采用AT89C52芯片,它能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KB ROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,。P1口有两个作用,一个接上DS1302的AD0-AD7(双向地址/数据复用总线),控制着DS1302的8位并行数据的地址和数据的传输,另接上液晶的DB0-DB7(数据总线)控制着向液晶发送8位并行数据。P1.1接上DS1302的单数据线,发送并接受数据,地址的操作。P3.0到P3.3作为独立按键口。P2.4口为液晶的数据/

8、命令选择端,1为数据,二为命令,P2.1口控制液晶读/写选择端,1为读命令,0为写操作,P2.0口控制液晶使能信号。对DS1302:P2.0口控制DS1302的片选信号的输入(CS),P2.1口控制地址选通输入(AS),P2.2口为读写输入(R/W),P1.7接入闹钟,到设置时间到了,led灯闪烁。 时钟电路模块的设计图示为DS1302的引脚排列,其中VCC1为后备电源,VCC2为主电源,在主电源关闭的情况下,也能保持时钟的连续运行,DS1302由VCC1或VCC2两者中的较大者供电,当VCC2大于VCC1+0.2V时,VCC2给DS1302供电,当VCC2小于VCC1时候VCC1供电。X1和

9、X2是振荡源,外接32.768KHz晶振,RST是复位片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段,当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作,如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态,上电运行时,在VCC大于等于2.5V之前,RST必须保持低电平,中有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端,SCLK始终是输入端。工作原理如下:(1) 时钟芯片DS1302的工

10、作原理: DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时

11、,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。(2) DS1302的控制字节DS1302的控制字如表1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出表1 DS1302的控制字格式 RAM RD 1 A4 A3 A2 A1 A0 / CK /WR (3) 数据输入输出(I/O)在控制指

12、令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如图5所示: 图5 DS1302读/写时序图 闹钟模块对时间进行设定,时间到了。Led灯闪烁。闹钟模块的接线如图所示,3.2.5 按键部分按键部分如上图所示,本设计总的用了5个按扭开关作为键盘,其中一个是闹钟确定键,另4个中的其中两个是调整时间增加、减少的键,第一个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间,另外一个是确定键。液晶显示部分液晶显示模块如上

13、图所示,字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本设计采用16列*2行的字符型LCD1602带背光的液晶显示屏。六、仿真电路图 七、程序设计过程(介绍程序设计的算法思想、并介绍主要模块的功能及实现,用自顶向下的设计思路完成程序功能的分解)1基于DS1302的电子万年历设计系统主程序设计该系统的主程序包含了液晶模块初始化、DS1302时钟控制模块初始化、定时器T0初始化、时钟程序和中断程序。2液晶模块初始化程序首先产生一个让LCD复位的低电平脉冲,复位后再使能LCD。初始化中主要设置LCD模式、偏置电压、显示模式和清屏。3.DS1302时钟控制模块初始化程D1302时

14、钟模块的初始化主要是往DS1302中写数据定时器T0初始化程序定时器T0的初始化主要设置定时器的操作模式、启动方式。设置定时器的值及采用中断方式。设置完成后,启动定时器工作。4时钟程序和中断程序钟程序主要包含了键盘控制程序和时钟显示程序液晶显示模块液晶显示主要显示四行,第一行采用显示当前日期,格式为年月日星期。第二行显示闹钟的时间,格式为时:分:秒。闹钟部分采用了led灯闪烁来显示闹钟的到来。程序如下: #include #include #include#define uchar unsigned char#define uint unsigned intsbit SDA=P10;/ DS1

15、302数据线sbit CLK=P11;/DS1302时钟线sbit RST=P12; /DS1302复位线sbit RS=P20;sbit RW=P21;sbit EN=P22;sbit K1=P34; / 选择sbit K2=P35; / 加sbit K3=P36; / 减sbit K4=P37; / 确定sbit K5=P30; / 闹钟确定sbit K6=P30; / 闹钟设置sbit beep=P17;void Display_LCD_String(uchar p,uchar *s);uchar tCount=0;/一年中每个月的天数,2月的天数由年份决定uchar MonthsDay

16、s=0,31,0,31,30,31,30,31,31,30,31,30,31;uchar *WEEK=SUN,MON,TUS,WEN,THU,FRI,SAT;/周日,周一到周六uchar LCD_DSY_BUFFER1=Date 00-00-00 ; /LCD显示缓冲uchar LCD_DSY_BUFFER2=Time 00-00-00 ;uchar ALARM_TIME_BUFFER= ;/闹钟时分位保存uchar DateTime7; /所读取的日期时间char Adjust_Index=-1; /当前调节的时间:秒,分,时,日,uchar Change_Flag=-MHDM-Y; uch

17、ar Read_LCD_State(); void LCD_Busy_Wait(); void Write_LCD_Data(uchar dat); void Write_LCD_Command(uchar cmd); void Init_LCD(); void Set_LCD_POS(uchar p); void DelayMS(uint x) uchar i;while(x-) for(i=0;i120;i+); uchar Read_LCD_State() uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN=0;DelayMS(1);ret

18、urn state; void LCD_Busy_Wait()while(Read_LCD_State()&0x08)=0x80);DelayMS(5);void Write_LCD_Data(uchar dat) /写数据LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;void Write_LCD_Command(uchar cmd)/写命令LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;void Init_LCD()/LCD初始化Write_LCD_C

19、ommand(0x38); DelayMS(1);Write_LCD_Command(0x01); DelayMS(1);Write_LCD_Command(0x06); DelayMS(1);Write_LCD_Command(0x0C); DelayMS(1);Display_LCD_String(0x00,zhongzhoudaxue);DelayMS(1000);Display_LCD_String(0x40,dian zi ri li);DelayMS(1000);void Set_LCD_POS(uchar p)Write_LCD_Command(p|0x80);void Disp

20、lay_LCD_String(uchar p,uchar *s)uchar i;Set_LCD_POS(p);for(i=0;i16;i+)Write_LCD_Data(si);DelayMS(1);/*-向DS1302写入一字节-*/void DS1302_Write_Byte(uchar x) uchar i; for(i=0;i=1; /*-从DS1302读取一字节-*/uchar DS1302_Read_Byte()uchar i,b,t;for(i=0;i=1;t=SDA;b|=t7;CLK=1;CLK=0; return b/16*10+b%16;/*-从DS1302指定位置数据-

21、*/uchar Read_Data(uchar addr)uchar dat;RST=0;CLK=0;RST=1;DS1302_Write_Byte(addr);dat=DS1302_Read_Byte();CLK=1;RST=0;return dat;/*-向DS1302某地址写入数据-*/void Write_DS1302(uchar addr,uchar dat)CLK=0;RST=1;DS1302_Write_Byte(addr);DS1302_Write_Byte(dat);CLK=0;RST=0;/*- 设置时间-*/void SET_DS1302()uchar i;Write_D

22、S1302(0x8e,0x00);for(i=0;i7;i+)Write_DS1302(0x80+2*i,(DateTimei/104|(DateTimei%10);Write_DS1302(0x8e,0x80);/*-读取当前时期时间-*/void GetTime()uchar i;for(i=0;i7;i+)DateTimei=Read_Data(0x81+2*i); /*- 时间和日期转换成数字字符-*/void Format_DateTime(uchar d,uchar *a)a0=d/10+0;a1=d%10+0;/*- 判断是否为闰年-*/uchar isLeapYear(uint

23、 y)return (y%4=0&y%100!=0)|(y%400=0);/*- 星期转换-*/void RefreshWeekDay()uint i,d,w=5;for(i=2000;i2000+DateTime6;i+)d=isLeapYear(i) ? 366 : 365;w=(w+d)%7;d=0;for(i=1;iDateTime4;i+) d+=MonthsDaysi;d+=DateTime3;DateTime5=(w+d)%7+1;/*- 年月日时分秒+/-*/void DateTime_Adjust(char x)switch (Adjust_Index)case 6: /年i

24、f(x= 1&DateTime60) DateTime6-;MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(DateTime3MonthsDaysDateTime4) DateTime3=MonthsDaysDateTime4;RefreshWeekDay();break;case 4: /月if(x= 1&DateTime41) DateTime4-;MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(DateTime3MonthsDaysDateTime4)DateTime3=MonthsDay

25、sDateTime4;RefreshWeekDay();break;case 3:/日MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(x= 1&DateTime30) DateTime3-;RefreshWeekDay();break;case 2: /时if(x= 1&DateTime20) DateTime2-;break;case 1: /秒if(x= 1&DateTime10) DateTime1-;break; /*-主程序-*/void main()Init_LCD();/LCD初始化IE=0x83; / 允许INT0,T0中断IP

26、=0x01;IT0=0x01;TMOD=0x01;TH0=-50000/256;TL0=-50000%256;TR0=1; while(1)if(Adjust_Index=-1) GetTime();/*- 定时器每秒刷新LCD显示-*/void T0_INT() interrupt 1TH0=-50000/256;TL0=-50000%256;if(+tCount!=2) return;tCount=0;Format_DateTime(DateTime6,LCD_DSY_BUFFER1+5);Format_DateTime(DateTime4,LCD_DSY_BUFFER1+8);Forma

27、t_DateTime(DateTime3,LCD_DSY_BUFFER1+11);strcpy(LCD_DSY_BUFFER1+13,WEEKDateTime5-1);Format_DateTime(DateTime2,LCD_DSY_BUFFER2+5);Format_DateTime(DateTime1,LCD_DSY_BUFFER2+8);Format_DateTime(DateTime0,LCD_DSY_BUFFER2+11);Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2

28、);if(ALARM_TIME_BUFFER0=LCD_DSY_BUFFER25&ALARM_TIME_BUFFER1=LCD_DSY_BUFFER26&ALARM_TIME_BUFFER2=LCD_DSY_BUFFER28&ALARM_TIME_BUFFER3=LCD_DSY_BUFFER29)beep=beep;/*- 键盘中断-*/void EX_INT0() interrupt 0if(K1=0)/选择调整对象:年,月,日,时,分,秒while(K1=0);if(Adjust_Index=-1|Adjust_Index=1) Adjust_Index=7;Adjust_Index-;i

29、f(Adjust_Index=5) Adjust_Index=4;LCD_DSY_BUFFER213=;LCD_DSY_BUFFER214=Change_FlagAdjust_Index;LCD_DSY_BUFFER215=;elseif(K2=0) / 加while (K2=0); DateTime_Adjust(1);elseif(K3=0) / 减while (K3=0); DateTime_Adjust(-1);elseif(K4=0) / 确定while(K4=0);SET_DS1302();/调整后的时间写入DS1302LCD_DSY_BUFFER213= ;LCD_DSY_BUF

30、FER214= ;LCD_DSY_BUFFER215= ;Adjust_Index=-1;elseif(K5=0) / 闹钟确定while(K5=0);if(Adjust_Index!=-1)ALARM_TIME_BUFFER0=LCD_DSY_BUFFER25;/设置当前时间为闹铃时间ALARM_TIME_BUFFER1=LCD_DSY_BUFFER26;ALARM_TIME_BUFFER2=LCD_DSY_BUFFER28;ALARM_TIME_BUFFER3=LCD_DSY_BUFFER29;Adjust_Index=-1;八、焊接、调试过程(说明焊接过程中的故障情况及调试处理的方法)1

31、载入程序后,LCD显示的秒数快慢不均匀,有时快一点有时慢一点。解决办法:首先晶振的连接进行检查,看是否是由于晶振连接不对而导致产生的脉冲时钟不均匀。其次,是看焊接问题,有没有虚焊,导致电路连接不畅,查看后都没有问题,于是检查程序,循环出问题了,修正了循环条件,最后解决了此问题。2修改时间、日期时没有星期和日期没有自动对应上。解决办法:把不相关的程序暂时屏蔽,将星期的子程序独立调试,发现在调用星期更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.3. 对于日的调整不正确,找出是程序的问题,在日期循环设定的时候,必须将其值设为

32、小于等于31,月就要小于等于12,没有将条件设定好,而DS1302芯片对这类寄存器的取值都有具体的规定,后来找出又是条件搞错了,好在单片机是可擦除的,重新装入程序后再次运行一下,就解决了这个问题。在实际使用中,我们发现DS1302的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。我们对DS1302的工作电路进行了分析, DS1302的外部电路十分简单,惟一外接的元件是32768Hz的晶振。通过实验我们发现:当外接晶振电路振荡时,DS1302计时正确;当外接晶振电路停振时,DS1302计时停止。因此,我们认为32768Hz晶振是造成DS1302工作不稳定的主要

33、原因。在使用前对晶体的负载电容并不知道的情况下,通过测定晶体振荡频率的方法可以确定该晶体的负载电容。对于晶体振荡器来说,其振荡频率与负载电容之间的关系是确定的。以本文讨论的DS1302使用的32768Hz晶振为例:当它工作于所要求的负载电容时,能较准确地产生 32768Hz的频率;当它的负载电容小于6pF时,其振荡频率会正向偏移;当它的负载电容大于6pF时,其振荡频率就会负向偏移。因此,对于未知负载电容的晶体应首先采用实验的方法,在其两端加入辅助电容使晶体起振,然后用频率计测出振荡频率。若测得频率大于32768Hz,说明负载电容偏小;若测得频率小于32768Hz,说明负载电容偏大。对辅助电容逐

34、步调整,最终使振荡频率尽可能接近32768Hz,则此时晶体端所接负载电容的总和就是适合该晶体的负载电容。九、焊接板正面图(板子上必须能清晰看见姓名和学号)十、焊接板背面图十一、实训元件清单Stc89c52芯片 1个 DS1302芯片 1个 液晶显示屏 1个 发光二极管 1个电阻 若干电容 3个晶振 2个开关按键 5个十二、调试结果展示(用图片展示调试正常的结果)十三、实训心得(要求不得少于500字,必须手写)(1) 王文博:本次课程设计是基于单片机的开发设计,从刚开始拿到设计题目,我就想到了各个公共场合悬挂的电子时钟,可以显示年,月,日,星期,时,分,秒,很想知道它是怎么工作的,为我们的生活带

35、来了这么大的方便。于是赶紧看需要什么器件来完成这么复杂的功能,看到有DS1302,LCD显示器,还有AT89C52于是就赶紧在网上搜有关DS1302的资料,能自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度很高,提起了我很大的兴趣,赶紧看它与单片机的链接方法,以及如何进行初始化,它的引脚功能和使用时应该注意的问题,两个电源,一个主电源,一个备用电源,在SCLK的下降沿可以写入数据,DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,每个寄存器的读写都有自己的固定地址和取值范围。在初始化时,必须先设定其地址。在看AT89C52时,结合我们学

36、过的51单片机就很好理解了,功能几乎相近,而LCD就是一个液晶显示器,用来显示DS1302的功能,这样一来就很好理解了。开始写程序,并用protus进行仿真,再加入程序,可是那个按键没有按理想中来,按键对显示的数据不起作用,原来是因为一个管脚接错了。 由于电子万年历的广泛应用,对其准确性要求越来越高,故本次设计在完成显示功能的设计上外加时钟调整程序使其更能满足要求。由于程序过长调试时可先分开调试,因为平时学习不到位对知识理解不够深入,使其在刚开始分析题目遇到很大问题。虽然通过查阅不同资料,努力学习借鉴他人的编程方法最终在大家共同努力下完成任务,但可能还存在一些不足,需要老师指出和做进一步修改。在解决不懂得问题时,发现网络是一个很好的学习平台,利用前人的经验可以提高自己解决实际问题的能力,通过两个礼拜的课程设计,使我对所学知识进行了系统的复习和巩固。这次课程设计是一个团队的结果,增强了我们的团队意识,每个人的力量都是不容忽视的,在我们的共同努力下,成功完成实验。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号