基于AT89S52单片机的万年历设计
发布时间:2024-10-11
发布时间:2024-10-11
编程万年历
洛阳师范学院
单片机原理及应用课程设计报告
基于AT89S52单片机万年历的设计
院
系
信息技术学院 计算机科学与技术
杨烁琪 11级计科班 111114013 赵秀英 2015年1月 20日
专业
学生姓名 班学
级 号
指导教师 完成日期
编程万年历
摘 要
电子万年历是一种非常广泛日常计时工具。它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3---5V电压供电。
此次是基于52系列的单片机进行的电子万年历设计,相比传统的万年历来说,精确度更高。可以显示温度、年、月、日、时、分、秒及周信息,具有可调整日期和时间功能。对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件方面进行同步设计。硬件部分主要由单片机,LED显示电路,以及调时按键电路等组成。在单片机的选择上使用了AT89S52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用共阴极的数码管。使用MAX7219来驱动显示,然后并行输出。软件方面主要包括日历程序、时间调整程序、温度程序、显示程序等。程序采用汇编语言编写,以便更简单地实现调整时间及阴历显示功能。所有程序编写完成后,在keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。
关键词:时钟芯片、MAX7219、DS18B20、动态扫描、单片机。
编程万年历
目 录
摘 要 ............................................................ 1 1 绪论 ............................................................ 4
1.1设计背景 .................................................... 4 1.2设计思想 .................................................... 4 1.3设计框图 .................................................... 5 2 系统硬件设计 .................................................... 6
2.1最小化电路设计 .............................................. 6
2.1.1 主控芯片简介 .......................................... 6 2.1.2 复位电路、晶振电路设计 ................................ 7 2.2显示电路设计 ................................................ 9
2.2.1 显示器简介 ............................................ 9 2.2.2 驱动芯片简介 ......................................... 11 2.2.3 显示电路 ............................................. 16 2.3温度采集电路设计 ........................................... 17
2.3.1 温度采集芯片简介 ..................................... 17 2.3.2 温度采集电路 ......................................... 21 2.4实时时钟电路设计 ........................................... 21
2.4.1时钟芯片简介 .......................................... 22 2.4.2时钟电路 .............................................. 22
3 系统软件设计 ................................................... 25
3.1主程序流程图 ............................................... 25 3.2系统子程序的设计 ........................................... 26
3.2.1送显示流程图 .......................................... 26 3.2.2 时钟流程图 ........................................... 27 3.2.3 温度采集流程图 ....................................... 29
4 系统仿真 ....................................................... 29
4.1仿真软件简介 ............................................... 29 4.2 软件仿真过程 ............................................... 33 4.3仿真结果 ................................................... 35 致谢 ............................................................. 37
编程万年历
参考文献 ......................................................... 37 附 录 一 ......................................................... 38 附 录 二 ......................................................... 39
编程万年历
1 绪论
1.1设计背景
随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步。
目前流行的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基础于该程序所开发的各种应用程序中的日历程序。然而,这些程序都千篇一律的局限在一个很短的时间范围内。(Windows各个版本一般都局限在1980年至2099年这一范围内),但是,在很多情况下,一个时间跨度较大的日历程序是很有参考价值的,本程序在这种背景下开始编辑,其中集成了国际通用日历和中国农历,此外还可以显
示星期和加载了部分节日,显示本机准确日期等功能。
1.2设计思想
众所周知,地球绕太阳公转,公转一周历时365天5小时48分46秒。现代国际上普遍采用罗马历法,在罗马历法中人为地规定一年365天,也就是我们所说的平年,为了弥补每一年多出的5小时48分46秒,同时又规定4年中有一年是闰年,闰年为366天(平年的2月份为28天,而闰年的2月份为29天),这样4年有365*3+366=1461天,而地球绕太阳公转4周历时1460天23小时15分4秒,这样,每4年又产生了44分56秒的误差,为了减小影响,历法上又规定,每400年中只存在97个闰年,这样400年中共有365*400+97=146097天,
而地球绕太阳公转400周历时146096天21小时6分40秒,较好的弥补了这一缺陷,这样几乎3300年才产生一天的误差。
编程万年历
1.3设计框图
本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。晶振电路是给主控模块提供脉冲信号;温度的采集由DS18B20构成;显示部分由8个数码管,MAX7219译码器构成。使用动态扫描显示方式对数字的显示。本设计系统框图如图1.1所示。
图1.1 基于AT89S52单片机的电子万年历系统框图
编程万年历
2 系统硬件设计
2.1 最小化电路设计
在单片机使用中有必须的最小化电路,它是单片机工作的前提。其中包括电源电路、晶振电路、复位电路。下面就简单介绍最小化电路。 2.1.1 主控芯片简介
(1)主要功能的简介
拥有灵巧的8位CPU和在系统可编程Flash
晶片内部具有时钟振荡器(传统最高工作频率可至 12MHz) 内部 (ROM)程序存储)为 8KB 内部(RAM)数据存储器为 256字节 32 个可编程I/O 口线 8 个中断向量源
三个 16 位定时器/计数器 三级加密程序存储器 全双工UART串行通道 (2)引脚功能简介
图2.1 AT89S52单片机的引脚图
VCC:电源正端输入,接+5V。
编程万年历
VSS:电源地端。
XTAL1:单芯片系统时钟的反相放大器输入端。
XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。 RESET:重置引脚,高电平动作。
EA/Vpp:"EA"表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。 ALE/PROG:ALE是表示地址锁存器启用信号。
PSEN:此为"Program Store Enable"的缩写,其意为程序储存启用。
PORT0(P0.0~P0.7):端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。
PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。
PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。其引脚分配如下:
P3.0:RXD,串行通信输入。 P3.1:TXD,串行通信输出。 P3.2:INT0,外部中断0输入。 P3.3:INT1,外部中断1输入。 P3.4:T0,计时计数器0输入。 P3.5:T1,计时计数器1输入。
P3.6:WR,外部数据存储器的写入信号。 P3.7:RD,外部数据存储器的读取信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
编程万年历
/EA/VPP:当/EA保持低电平时,在此期间外部程序存器(0000H-FFFFH),不管是否有内部程序存储器。 .2.1.2 复位电路、晶振电路的设计
单片机工作需要3个基本条件:接电源、接石英晶体振荡器和复位电路。如图2.2所示。
图2.2 单片机的基本电路
(1)接电源
将单片机第40脚Vcc接电源+5V,第20脚Vss接地(电源负极),为单片机工作提供电源。由于AT89S52片内带有程序存储器,当使用片内程序存储器时要将EA(31脚)接高电平,即接到电源+5V。 (2)接石英晶体振荡器
将单片机第19脚(XTAL1)与18脚(XTAL2)分别接外部晶体的两个引脚,由石英晶体组成振荡器,保证单片机内部各部
分有序工作。 图2.3 晶振电路
单片机运行程序的速度与振荡器的频率有关。单片机在读、写操作时都需要消耗一定的时间。机器周期是指单片机完成一个基本操作所用的时间,当外接石英晶体为12MHz时,1个机器周期为1ms;当外接石英晶体为6MHz时,1个机器周期为1ms。
编程万年历
(3)复位电路
在实际应用中,复位电路有两种基本形式:一种是上电复位,另一种是上电与按键均有效的复位如图2.4所示。
上电复位要求接通电源后,单片机自动实现复位操作。常用的上电复位电路如图2-4(a)所示。上电瞬间RST引脚获得高电平,随着电容C1的充电,RST引脚的高电平将逐渐下降。RST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。该电路典型的电阻和电容参数为:晶振为12MHz时,C1为10uF,R1为8.2KΩ;晶振为6MHz时,电容C1为22uF,R1为1KΩ。
上电与按键均有效的复位电路如图2.4(b)所示。上电与按键均有效的复位电路原理与上电复位原理相同,不同的是上电与按键均有效的复位电路在单片机运行期间,能用按键来控制复位操作晶振为6MHz时,电容C1为22uF,R2为200Ω
图
上电复位电路 图2.4(b)上电与按键均有效复位电路
2.4(a)
本设计中使用后者电路复位,就是可以在单片机运行期间可以人工的复位。这样是比较方便。
2.2 显示电路设计
.2.2.1 显示器的简介
发光二极管LED是简单常用的输出设备,通常用来指示机器的状态或其它信息。它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在测量控制仪器中获得了广泛的应用。
LED是近似于恒压的元器件,到导电时(发光)的正向压降一般约为1.6V或2.4V,反向击穿电压一般≥5V。工作电流通常在10---20mA,故电路中需要串联适当的限流电阻。发光强度基本上与正向电流成正比。发光效率和颜色取决于制造的材料,一般常用红色,偶尔也用于黄色或绿色。
编程万年历
多个LED可接成共阴或共阳极形式。通过驱动器接到系统的并行输出口上,由CPU输出适当的代码来点亮或熄灭相应的LED。
发光二级管显示驱动(点亮)的方法有如下2种:
静态驱动方法:即给欲点亮的LED通过恒定的定流。这种驱动方法需要显示的
位数增加时,所需的逻辑部件及连线也相应增加,成本也增加。
动态驱动方法:是给欲点亮的LED通过脉冲电流,此时LED的脉冲电流倍数于
其额定电流值。利用动态驱动方法可以减少需要的逻辑部件和连线。 7段LED数码显示器
最常用的一种数码显示器是由7段条形的LED组成,如图2.5所示。
图2.5(a)共阴极接法 图2.5(b)共阳极接法
点亮适当的字段,就可以出不同的数字。此外不少于7段数码管显示器在右下角带有一个圆形的LED作小数点用,这样一共有8段,恰好适用于8位的并行系统。 图2.5(a)为共阴极接法,公共阴极接地。当各段阳极上的电平为“1”时,该段点亮;电平为“0”时,段就熄灭。图2.5(b)为共阳极接法+5V电源。当各段阴极上的电平为“0”时,该段就点亮;电平为“1”时,段就熄灭。图中的电阻是限流电阻。
编程万年历
图2.6 7段LED数码管显示器内部段的排列
为了在7段(图2.6)LED上显示不同的数字或字符,首先要把数字或字符转换成相应的段码(又称字型码),由于电路接法不同,形成的段码也不相同,如表2-1所示。
表2-1 7段数码显示器的段位码
注:由于用MAX7219驱动译码,所以,本文选用共阴极数码管,只显示0---9,如果要用7段数码显示器显示多位数字,就用MAX7219来驱动,下一节MAX7219的驱动。详情请参考上一节。 2.2.2 驱动芯片的简介
MAX7219是MAXMI公司生产的一种串行接口方式7段共阴极LED显示驱动
编程万年历
器。其片内包含有一个BCD码到B码的译码器、多路复用扫描电路、字段和字位驱动器,以及存储每个数字的8X8RAM。每位数字都可以被寻址和更新,允许对每一位数字选择B码译码或不译码。采用三线串行方式与单片机接口。电路十分简单,只需要一个10KΩ左右的外接电阻来设置所有LED的段电流。MAX7219的引脚排列如图2.7所示。
图2.7 MAX7219的引脚排列
(1)引脚功能简介
DIN:串行数据输入。在CLK时钟的上升沿,串行数据被移入内部移位寄存器。移入时最高位(MSB)在前。
DIG0-7:8根字位驱动引脚,它从LED显示器吸入电流。 GND:接地,两根GND引脚必须相连。
LOAD:装载数据输入。在LOAD的上升沿,串行输入数据的最后16位被锁存。 CLK:时钟输入。它是串行数据输入时所需的移位脉冲。最高时钟频率为10MHz,在CLK地上升沿串行数据被移入内部移位寄存器,在CLK的下降沿数据从DOUT移出。
SEGA-SEGG,DP:七段和小数点驱动输出,它提供LED显示器源电流。 ISET:通过一个10KΩ电阻Rset接到V+以设置峰值段电流。 V+:+5V电源电压。
DOUT:串行数据输出。输入到DIN的数据经过16.5个时钟周期后,在DOUT端有效。
(2) MAX7219的传输方式:
采用串行数据传输方式,由16位数据包发送到DIN引脚的串行数据在每个CLK的上升沿被移入的内部16位移位寄存器,然后在LOAD的上升沿将数据所存到数字
编程万年历
或控制寄存器中。LOAD信号必须在第16个时钟上升沿同时或之后,但在下一个时钟上升沿之前变高;否则将会丢失数据。DIN端的数据通过移位寄存器传送,并在16.5个时钟周期之后出现在DOUT端。DOUT端的数据在CLK的下降沿输出。串行数据以16位为一帧,其中,D11-D8为内部寄存器地址,D7-D0为寄存器数据,格式如表2-2所示。
(3) MAX7219的内部寄存器:
MAX7219具有14个可寻址的内部数字和控制寄存器。8个数字寄存器由一个片内8X8双端口SRAM实现,它们可以直接寻址;因此,可以对单个数字进行更新;并且只要V+超过2V,数据就可以保留下去。控制寄存器有5个,分别为译码方式、显示亮度、扫描界限(扫描数位的个数)、停机和显示测试。另外还有一个空操作寄存器(NO-OP),在不改变显示或影响任一控制寄存器的条件下器件级联时,它允许数据从DIN传到DOUT。表2.3所列为MAX7219的内部寄存器及其地址。
表2-3 MAX7219的内部寄存器及其地址
编程万年历
下面以表格形式对MAX7219内部寄存器中不同数据所表示的含义进行说明。 表2-4为译码方式寄存器中数据的含义。从表中可见,寄存器中的每一位与一个数字位相对应,逻辑高电平选择B译码,而逻辑低电平则选择旁路译码器。
表2-4 译码方式寄存器(地址 = X9H)
MAX7219可用V+和ISET之间所接外部电阻Rset来控制显示亮度。来自段驱动器的峰值电流通常为进入ISET电流的100倍。Rset既可以为固定电阻,也可以为可变电阻,以提供来自面板的亮度调节,其最小值为9.52KΩ。段电流的数字控制由内部脉宽调制DAC控制。该DAC通过亮度寄存器向低4位加载,将平均峰值电流按16级比例设计,从Rset设置峰值电流的31/32的最大值到1/32的最小值,如表2-5所列,最大亮度出现在占空比为31/32时。
表2-5 亮度寄存器(地址
= XAH)
扫描界限寄存器用于设置所显示的数字位,可以为1-8。通常以扫描频率为1300Hz、8位数字、多路方式显示。因为所扫描数字的多少会影响显示亮度,所以要注意调整。如果扫描界限寄存器被设置为3个数字或更少,各数值驱动器将消耗过量的功率。因此,Rset电阻的值必须按所显示数字的位数多少适当调整,以限制各个数字驱动器的功耗。表2-6为扫描界限寄存器中数据的含义。
表2-6 扫描界限寄存器(地址=XBH)
编程万年历
当MAX7219处于停机方式时,扫描振荡器停止工作,所有的段电流源被拉到地,而所有的位驱动器被拉到V+,此时LED将不显示。在数字和控制寄存器中的数据保持不变。停机方式可用于节省功耗或使LED处于闪烁。MAX7219退出停机方式的时间不到250uS,在停机方式下显示驱动器还可以进行编程。停机方式可以被显示测试功能取消。表2-7为停机寄存器中数据的含义。
表2-7 停机寄存器(地址 = XCH)
显示测试寄存器有两种工作方式:正常和显示测试。在显示测试方式下8位数字被扫描,占空比为31/32。通常不考虑(但不改变)所有控制寄存器和数据寄存器(包括停机寄存器)内的控制器来接通所有的LED显示器。表2-8为显示测试寄存器中数据的含义。
表 2-8 显示测试寄存器(地址 = XFH)
数字0-7寄存器受译码器寄存器的控制:译码或不译码。数据将寄存器可将BCD码译成B码(0-9、-、E、L、P),如表2-9所列。如果不译码,则数字寄存器中数据的D6-D0为=位分别对应7段LED显示器的A-G段,D7位对应LED的小数点DP。某一位数据为1,则点亮与该位对应的LED段;数据为0,则熄灭该段。
下一篇:房地产经纪1税费查询指导