ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:565.78KB ,
资源ID:5737405      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5737405.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于单片机的万年历设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于单片机的万年历设计.docx

1、基于单片机的万年历设计1 绪论1.1 设计目的与意义随着电子技术的高速发展,对电子方面人才的要求越来越高,不仅要求其具备相关的专业理论知识,还要求其具有较强的设计、制作等实践动手能力.此次学校举行的电子设计无疑是对从事电子相关专业的人的一次很好的锻炼和考验,是培养信息人才的一次良好的机会,为其提供了一个理论知识与实践相结合的平台。通过本次课程设计,引导学生结合所学的电路理论和程序设计的知识,思考设计方案,以小组合作方式,分工完成各个部分,从而掌握相关的硬件结合软件显示电路的设计和调试技术,一方面提高了学生的实践动手和协作能力,另一方面培养了学生综合运用所学理论知识进行工程设计的能力。1.2 方

2、案选择与DIY电子万年历的研究情况1.2.1时钟芯片选择方案一:不使用芯片,采用单片机的定时计数器这种方法原理是利用单片机芯片的定时器来产生固定的时间,模拟时钟的时, 分,秒。如:利用AT80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期。每一个周期加1,那么1min为60个周期,1h就是60*60=3600个周期,一天就是3600*24=86400个周期。此方法优点是可以省去一些外围的芯片,但这种方法只能适用于一些要求不是十分精确,不做长期保留的场合。方案二:并行接口时钟芯片 DS12887特点:采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口

3、电路具有操作速度快,编程方便的优点。但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大,DS12887管脚图如图1所示。 图1 DS12887管脚图方案三:串行接口时钟芯片DS1302芯片主特性:(1)实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力,还有闰年调整的能力 (2)31 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0 5.5V(5)工作电流 2.0V 时,小于300nA(5)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(6)8 脚DIP 封装或

4、可选的8 脚SOIC 封装根据表面装配(7)简单 3 线接口(8)与 TTL 兼容Vcc=5V(9)可选工业级温度范围-40 +85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。 图2 DS1302管脚图1.2.2键盘选择方案一:矩阵式键盘矩阵式键盘电路图如图3所示。 图3 矩阵式键盘行列式键盘的原理就是每一行线与每一列线的交叉地方不相通,而是接上一个按键,通过按键来接通。特点: 以省出不少的I/O 口资源,程序编写相对复杂点,适用于键数

5、比较多的情况。方案二: 独立式键盘独立式键盘电路图如图4所示。 图4 独立式键盘独立式键盘是指各个按键相互独立地连接到各自的单片机的I/O 口,I/O口只需要做输入口就能读到所有的按键。特点: 电路简单,程序容易写,适用于按键数较少的情况。所以我们选择独立式键盘。1.2.3显示模块选择方案一:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。目前单片机数码管普通采用动态显示。编程简单,但只能显示数字,不能显示中文。方案二:LCD1602 能够显示英文和数字。 1602

6、液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号。方案三:LCD12864作为一种输出方式,液晶显示最大的特点就是能够实现友好的人机界面,它己经广泛应用于现代工业控制和智能化仪器仪表等领域,它己经成为单片机就用开发领域典型模块之一。能够方便的显示文字和数字。所以最终选择LCD12864。1.2.4 DIY万年历的研究情况目前电子爱好者,所设计的万年历大部分都采用LCD1602或数码管显示,只能显示阳历,不能带显示阴历,而且没有阴历相对应的的天干地支,和生肖年,没有达到多功能的效果。我们采用LCD12864显示,

7、通过算法实现,能正确显示阴历,具有友好的界面,为了追求时间的准确,我们采用芯片DS1302,通过单片机控制,读出时间显示在LCD上。我们除了用芯片DS18B20,通过程序控制,把温度也显示出来外还通过算法控制,把阴历相对应的天干地支,和生肖年也显示出来,达到多功能效果。2 主要硬件描述2.1 89C52模块Mcs-51单片机管脚图图如图5所示。 图5 单片机管脚图 (1)一个8位的微处理器(CPU)(2)片内数据存储器RAM(128B/256B)(3)片内程序存储器ROM/EPROM(4kB/8kB)(4)4个8位并行I/O拉口P0-P3,每个口既可以作输入,也可以作输出(5)2个16位定时器

8、/计数器(6)5个中断源的中断控制系统(7)1个全双工的串行I/O接口(8)片内时钟振荡器2.2 显示模块LCM128642.2.1液晶模块概述我们采用FG12864J显示模块,如图6所示,它是一种图形点阵液晶显示器。它主要采用动态驱动原理由行驱动控制器和列驱动器两部分组成了128(列)64(行)的全点阵液晶显示。2.2.2液晶模块特点(1)工作电压为+5V10% ,可自带驱动 LCD 所需的负电压(2)全屏幕点阵,点阵数为128(列)64(行),可显示8(/行)4(行)个(1616 点阵)汉字,也可完成图形,字符的显示(3)与 CPU 接口采用5 条位控制总线和8 位并行数据总线输入输出,适

9、配M6800 系列时序(4)内部有显示数据锁存器(5)简单的操作指令 显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令 图6 FG12864J显示模块2.3 芯片DS1302简介DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟

10、/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。 DS1302的管脚描述如表1所示。表1 DS1302管脚X1 X232.758KHz晶振管脚GND地RST复位I/O数据输入/输出引脚SCLK串行时钟Vcc1 Vcc2电源供电管脚 2.4 芯片DS18B20简介DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强。对电子爱好者来说,DS18B20是我们开发温度相关的首选小产品。 DS18B20引脚功能如表2所示。表2 DS18B20引脚功能GND地DQ单数据总线VDD电源

11、电压NC 空引脚 3 硬件设计与实现该万年历以89S52作为控制核心,外接DS18B20温度传感器,DS1302时钟芯片,显示采用LCM12864,调表采用矩阵式键盘,整体硬件电路的框图如图7所示。 图7 硬件电路框图3.1 单片机最小系统的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。单片机的最小系统如图8所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另

12、一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。 图8 单片机最小系统 3.2 时钟电路的设计本系统采用有DS1302串行时钟芯片作为主时钟电路,该电路使用单独的32.768M的晶振和单独的电源供电,减小主控的负担。电路图如图9所示。图9 时钟电路3.3 温度采集模块的设计采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。电路图如图10所示。 图

13、10 温度采集电路3.4 人机交互模块设计该系统输入模块采用独立式式键盘输入,显示模块采用LCM12864,很好的实现了人机交互,液晶与主控制器的接口如图11所示。 图11 液晶接口电路4 系统软件设计与实现4.1 主要算法流程图描述以80C52为核心,处理外转电路传进来的信号,实现时钟数据的读取,保存,显示其及键盘操作。流程图如图12所示。 图12 主程序流程图阳历和时分秒都是通过DS1302读出来的,经过主控的转换和处理最终显示在LCM12864上,该程序流程图如图13所示。 图13 计算阳历和时分秒流程图阴历是通过一种算法转换过来,首先得到阳历值,然后根据这种算法把阳历转换成阴历,最终显

14、示在LCM12864模块上,该程序流程图如图14所示。 图14 计算阴历程序流程图时间调整是通过四个独立按键来调整时间值,时间调整流程图如图15所示。 图15 时间调整程序流程图星期的计算方法如下:星期=(日期年份+所过闰年数+月校正数)%7,如果是在闰年又不到3月份上述之和要减一天再除7,其1到12月的校正数据为 6 2 2 5 0 3 5 1 4 6 2 4,该程序中采用1个字节表示年份闰年数也只计算1900 年以后的闰年数。该程序的流程图如图16所示。 图16 计算星期算法4.2 LCM16824子程序的实现LCM12864的读写时序如图17所示。 图17 LCM12864读写时序主要函

15、数模块:函数:void lcd_init(void) 显示初始化程序函数:Void GUI_init() 该函数用于初始化显示界面,把一些固定不需要刷新的文字固定下来函数:void lw(uchar x, uchar y, uchar dd)用来写数据的子程序函数: void display(uchar xx, uchar yy, uchar n, uchar fb,uchar hz) 用于显示汉字,每个汉字为16*16的点阵函数: void shownum(uchar xx,uchar yy,uchar n,uchar fb,uchar num) 用于显示数字,每个数字为8*16的点阵4.3

16、 DS1302子程序的实现DS1302的读写时序如图18所示。 图18 DS1302读写时序定义结构体数组SYSTEMTIME的时间类型,结构体数组如下:typedef struct _SYSTEMTIME_ unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year;SYSTEMTIME主要函数模块:函数: void Initial_DS1302(void)描述:时钟芯

17、片初始化函数: void Write1302(unsigned char ucAddr, unsigned char ucDa)描述:把某个数据写进某个地址函数: unsigned char Read1302(unsigned char ucAddr)描述:从芯片内某地址读取数据函数: void DS1302_GetTime(SYSTEMTIME *Time)描述: 获取时钟芯片的时钟数据到自定义的结构型数组函数: void DS1302InputByte(unsigned char d)描述: 往时钟写入一字节函数: unsigned char DS1302OutputByte(void)描

18、述:从时间内读取一个字节4.4 DS18B20子程序的实现DS18B20的读写时序如图19所示。 图19 DS18B20读写时序简易的程序流程图如图20所示。 图20 DS18B20读写程序流程图主要函数描述:函数: void Init_DS18B20(void)描述:单总线传输初始化函数.函数: void WriteOneChar(uchar dat) 描述:往芯片内部地址写入一个字节,有写数据和写指令之分.函数: void ReadTemp(void)描述:读取芯片的温度.函数: void delay_18B20(unsigned int i)描述:延时函数4.5 键盘子程序的实现键盘示意

19、图如图21所示。 图21 按键示意图主要函数模块:函 数 名: void key_count()功能描述:设置状态转换函数,根据变量count的不同值,对应不同的设置状态按下设置键,自动切换设置位函 数 名: void key_out()功能描述:跳出设置模式函 数 名: uchar key_up(int temp,int max,int min)功能描述: 按键加函数,在最大值与最小值之间变化函 数 名: uchar key_down(int temp,int max,int min)功能描述: 按键减函数,在最大值与最小值之间变化函 数 名:void set_year(); void se

20、t_month(); void set_day(); void set_hour();void set_minute(); 功能描述: 分别是用来设置 年 月 日 时 分 秒函 数 名: void key_al01() 功能描述:设置定时报警功能4.6 主程序的实现主要函数模块:函 数 名: Init_GUI()功能描述:进行界面初始化,例如固定的年、星期、农历函 数 名: void Show_NL() 功能描述:根据算法,得出阴历, 包括天干地支月日函 数 名: void Show_YL()功能描述:根据算法,从时钟芯片读出阳历数据,显示出来函 数 名: LCD_ShowWNL()功能描述:

21、 根据算法,显示电子万年历,其中时钟的”秒”位为每次循环刷新一次,”分”为在普通模式时每分钟刷新一次,在设置模式时每次循环刷新一次,”时”为在普通模式时每小时刷新一次,在设置模式时每次循环刷新一次,公历农历的年、月、日、星期、温度,设置模式每次循环刷新一次函数名:void LCD_showalarm()功能描述: 显示定时报警的时间函 数 名: void mian()功能描述:.显示万年历,循环读取时间,并通过程序进行键盘检测5 测试结果分析与结果5.1 测试结果分析(1)在测试中遇到LEDLCD16824不显示分析:首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。再接着研

22、究程序的时序图是否正确。最后发现程序时序方面出了点小错。修改后就把问题解决了(2)测试中遇到调时间调到2079年后跳到2000年分析:认真研究时钟芯片的Datasheet发现,对年的读取,读出后是BCD码转换成十制显示时算法不正确(3)按键调整时,不是按单位递增和递减分析:在键盘程序中,按键一次,向芯片写入一个新的数字,在写入数字后必须有一定延时才再写入另一个数字 (4)烧写程序进单片机里面时,有时会在显示屏上显示烂码. 分析:用电压表检查.最后检测出USB下载线的端口电压不够换条新线就可以把问题解决5.2 测试总结经过多次的反复测试与分析,掌握了硬件的设计与分析的能力, 学会看英文版的Dat

23、asheet,同时在软件的编程方面得到更到的提高,对编程能力得到加强。对所学的知识得到很大的提高与巩固。 最终实现功能:(1)能显示阳历年、月、日、星期、小时、分、秒(2)显示模块采用LCD液晶显示,要求能用按键调整时间。(3)能显示阴历月、日,在显示阴历时间时能标明是否为闰年。(4)具有定时报警功能,能够进行整点和半点语音报时。(5)能够准确在LCD上显示室。(6)在显示农历时通过算法能够把天干地去也显示出来。结束语通过对基于单片机的万年历的研究和设计,完成了一种能够显示阳历、阴历、星期、时间、实时温度、天干地支的多功能万年历,该万年历还可以定时报警和进行进行整点和半点报时。本系统设计从开始

24、到完成包括文档的编写总共花了一个月左右的时间,设计的难点在于星期和天干地支的计算方法,还有单片机和各个芯片之间的通信协议,液晶的读写时序,按键的防抖。本系统基本完成了设计指标的所有要求,所有的程序分块编写,通过main函数来调用,增加了程序的易修改性和易读性,方便他人的使用和改进。但是由于时间的局限性以及本人能力的有限性,本系统还有许多需要改进和完善的地方。其中主要的问题就是功耗和电源供电的问题,该处采用5V供电,最好采用3V供电。整个电路的功耗太大,没让单片机工作在空闲模式,这都是作品不实用,不能够大批量生产,这都有待改进,希望以后有机会对该系统做进一步的完善。致谢在本次设计中,我想首先感谢

25、赵老师,从设计的开始到完成,给了我很多指导性的意见,不断帮助我完善系统设计。从大一开始,赵老师作为我的导师,一直很注重我们动手能力的培养。她丰富的教学及实际操作经验、严谨的治学态度,以及和蔼的态度,使得我投入了大量时间在创新基地的实验室中,做了许多实验。而这,对我的帮助和影响是非常巨大的。正是因为有了这些锻炼的机会,我才能非常顺利地完成我的毕业设计。最后非常感谢郑州铁路职业技术学院信息工程系的老师和同学,是他们让我学会了如何学习,更学会了如何做人,这将是我终身受益的宝贵财富参考文献1 周兴华编著 手把手教你学单片机C程序设计北京:北京航空航天大学出版社,20072 侯玉宝编著. 基于Prote

26、us的51系列单片机设计与仿真 北京:电子工业出版社,20083 张义和编著. 例说51单片机(C语言). 北京:人民邮电出版社. 20084 李朝青编著. 单片机原理及接口技术. 北京:北京航空航天大学出版社,20055 周慈航编著. 单片机应用程序设计基础. 北京:北京航空航天大学出版社,19916 马忠梅编著. 单片机的C语言应用程序设计. 北京:北京航空航天大学出版社,20037 李广弟编著. 单片机基础. 北京:北京航空航天大学出版社,19948 曾巧媛编著. 单片机原理及应用. 北京:电子工业出版社,19979 邱丽芳编著. 单片机原理与应用. 人民邮电出版社,200710 何立民

27、编著. MCS-51系列单片机应用系统设计. 北京航空航天大学出版社,2003附录一 作品实物图附录二 原理图附录三 部分程序主程序#include#include /更改管脚#include#include#include#include#include#include#define uchar unsigned char#define uint unsigned intSYSTEMTIME sys;uchar c_sun,year_sun,month_sun,day_sun;uchar year_moon,month_moon,day_moon,week; uchar alarm=0,al

28、_hour=0,al_min=0;Init_GUI() lcd_init(); Init_DS18B20(); Initial_DS1302(); delay(10); jiemian(); /显示初始化界面,例如固定的年、星期、农历放在12864.c里 void Show_NL() DS1302_GetTime(&sys); year_sun=Read1302(DS1302_YEAR); month_sun=Read1302(DS1302_MONTH); day_sun=Read1302(DS1302_DAY); Conversion(0,year_sun,month_sun,day_sun

29、); /* day_moon=(day_moon&0x70)4)*10 + (day_moon&0x0F); month_moon=(month_moon&0x70)4)*10 + (month_moon&0x0F); year_moon=(year_moon&0xF0)4)*10 + (year_moon&0x0F); */ if(month_moon=1)display(8,4,12,0,ch1616); /显示“正” else display(8,4,month_moon-1,0,ch1616); /显示当前农历的月 if(day_moon11)display(12,4,13,0,ch1

30、616); /显示“初” if(day_moon10)display(12,4,9,0,ch1616); /显示“十” if(day_moon19)display(12,4,14,0,ch1616); /显示“廿” if(day_moon29)display(12,4,2,0,ch1616); /显示“三” display(14,4,(day_moon-1)%10,0,ch1616); /显示农历个位 display(14,2,year_moon%12,0,shengxiao); /显示生肖 display(9,2,year_moon%10,0,tiangan); /显示天干 display(11,2,year_moon%12

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1