首页 基于单片机的电子万年历的设计

基于单片机的电子万年历的设计

举报
开通vip

基于单片机的电子万年历的设计 信息职业技术学院 毕业设计说明书(论文) 设计(论文)题目: _ 基于单片机的万年历系统设计 专 业: 应用电子技术 班 级: 应电08-2   学 号: 姓 名: 指导教师: 二〇一〇年九月十日 信息职业技术学院毕业设计(论文)任务书 学 生 姓 名 学号 01 班...

基于单片机的电子万年历的设计
信息职业技术学院 毕业 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 说明书( 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 ) 设计(论文)题目: _ 基于单片机的万年历系统设计 专 业: 应用电子技术 班 级: 应电08-2   学 号: 姓 名: 指导教师: 二〇一〇年九月十日 信息职业技术学院毕业设计(论文)任务书 学 生 姓 名 学号 01 班级 应电08-2 专业 应用电子技术 设计(或论文)题目 电子万年历的设计 指导教师姓名 职 称 工作单位及所从事专业 联系方式 备 注 讲师 学院 21 设计(论文)内容: 利用单片机控制和高性能时钟芯片设计一电子万年历。要求该系统具有如下特点和功能: 1.可显示公历及农历年、月、日和时、分、秒; 2.走时准确,可调整公历年、月、日和时、分、秒; 3.采用市电通过电源适配器供电,当市电停电时,不但万年历所有数据不丢失,且万年历照常运行(有后备电池供电,可供数年); 4.万年历设置运行到2099年。 进度安排: 要有较为详细的时间安排(时间具体到周); 第2~4周:查找资料,选择参考 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ; 第5~6周:确定方案; 第7~8周:查找资料,进行单元电路的设计; 第9~10周:整机电路整机与分析; 第11~12周:整理报告,定稿; 第13~14周:制作PPT,准备答辩; 第15周:答辩。 主要参考文献、资料(写清楚参考文献名称、作者、出版单位): [1] 王新颖.单片机原理及应用.北京:北京大学出版社,2008 [2] 陈忠平.单片机基础与最小系统实践.北京:北京航空航天大学出版社,2006 [6] 沈庆阳.8051单片机实践与应用.北京:清华大学出版社,2003 [4] 侯玉宝.基于Proteus的51系列单片机设计与仿真.北京:电子工业出版社,2008 [5] 何立民.单片机应用技术选编.北京:北京航空航天出版社,2006 [6] 杨振江.流行单片机实用子程序及应用实例.西安:西安电子科技大学出版社,2007 [7] 王明顺.可涓流充电的串行实时时钟芯片DS1302.北京:电子工业出版社,2009 [8] 刘和平.单片机原理及接口程序设计.北京:北京航天航空大学出版社,2008 审 批 意 见 教研室负责人: 年 月 日 备注:任务书由指导教师填写,一式二份。其中学生一份,指导教师一份。 目 录 1 摘 要 2 第1章 绪论 3 第2章 设计方案 3 2.1 系统基本方案选择和论证 3 2.1.1 单片机的选择 3 2.1.2 显示模块的选择 3 2.1.3 键盘模块的选择 4 2.1.4 时钟芯片的选择 4 2.1.5 温度传感器的选择 5 2.2 电路设计最终方案决定 6 第3章 硬件设计 6 3.1 AT89C52单片机 8 3.1.1 AT89C52的信号引脚 10 3.2 DS1302时钟模块 11 3.2.1 内部结构及引脚 12 3.2.2 工作原理 12 3.2.3 寄存器和控制命令 14 3.3 DS18B20温度采集模块 15 3.3.1 内部结构及引脚 15 3.3.2 测温原理 16 3.3.3 工作过程及时序 20 3.4 键盘模块 21 3.5 LCD显示模块 23 第4章 软件设计 23 4.1 温度采集软件 24 4.2 阳历软件设计 26 4.3 阴历软件设计 29 4.4 LCD显示系统 30 4.5 按键系统 31 4.6 系统主流程图 32 第5章 系统调试 32 5.1 调试过程 33 5.2 仿真结果 34 总 结 35 参考文献 36 附录1 整机电路图 37 附录2 元件明细表 38 附录3 系统主程序 摘 要 电子万年历能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。选用的是单片机AT89C52来实现电子万年历的功能。 该电子万年历主要由单片机、LCD显示电路、DS18B20温度采集模块、DS1302时钟电路模块组成。系统以硬件软件化为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高,同时该系统还具有功耗小、成本低的特点,具有很强的实用性。由于该系统所用元器件较少,单片机所被占用的I/O口不多,因此系统具有较强的可扩展性。软件程序均采用C语言编写,便于移植与升级。报告详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计。 关键词 万年历;AT89C52;DS1302;DS18B20 第1章 绪论 随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。 二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步。 本文介绍了基于AT89C52单片机设计的电子万年历。 首先介绍单片机的发展与其在中低端领域中的优势以及课题的开发意义,接着介绍了AT89C52单片机的硬件结构,并在此基础上实现了万年历基本电路的设计,然后使用单片机C语言进行万年历程序的设计,程序采用模块化结构,使得逻辑关系简单明了,维护方便。 第2章 设计方案 2.1 系统基本方案选择和论证 2.1.1 单片机的选择 方案一:采用传统的AT89C52作为电机的控制核心。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。 方案二:采用FTC10F04单片机,还带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。其主要特点如下:8KB Flash ROM,可以擦除1000次以上,数据保存10年。 方案比较:由于本系统对CPU运算速度要求很高,需要执行很复杂的运算,方案一成本比较低,适合做设计,方案二运算速度高,性能好,所以两种方案都有可取之处。选用方案一作为主方案,方案二作为备用方案。 2.1.2 显示模块的选择 方案一:使用传统的LED数码管显示。 数码管具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度比较高,称重轻,精确可靠,操作简单。数码管采用BCD编码显示数字,程序编译容易,资源占用较少。但显示不够直观,太过单调,电源设计复杂。 方案二:使用液晶显示屏显示时间数字。 液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。 方案比较:LED数码管虽然操作简单,实用性高,但显示太过单调。而本设计显示内容量大,采用LCD液晶显示画面效果好,直观明了,故选用方案二。 2.1.3 键盘模块的选择 在对日期和时间进行控制,对日期和时间进行调节校准过程中,系统需要产生激励电流,因此需要用按键。 方案一:使用独立式键盘。独立式键盘是指直接用I/O口线构成的单个按键电路。独立式按键电路配置灵活,软件结构简单。 方案二:使用矩阵式键盘。矩阵式键盘是由行线和列线组成,按键位于行、列的交叉点上,行线、列线分别连接到按键开关的两端。其特点是简单且不增加成本,这种键盘适合按键数量较多的场合。 方案比较:因为本设计键盘部分简单需要的按键少,故采用独立式按键选择方案二。 2.1.4 时钟芯片的选择 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。 方案二: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA. 方案比较:虽然采用单片机定时计数器提供秒信号可实现功能且减少芯片的使用,但误差较大,而DS1302时钟芯片是一种高性能芯片,精度高还具有闰年补偿功能,所以采用方案二。 2.1.5 温度传感器的选择 方案一: 使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。 方案二: 采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。 方案比较:选用DS18B20数字式温度传感器,与单片机连接简单,成本低,还具有测量精度高、测量范围广等优点。而热敏电阻作为传感器,成本高,误差大。所以选用方案二。 2.2 电路设计最终方案决定 综上各方案所述,对此次作品的方案选定: AT89C52单片机,内部自带有6KB的Flash存储器及256KB RAM单元,不需另外扩展EEPROM及静态RAM,可以在线下载程序,易于日后的升级。DS1302时钟日历芯片,稳定性高误差小。数字式温度传感器DS18B20,测量准确,误差小范围广。LCD液晶显示,显示清晰直观明了。 第3章 硬件设计 该系统硬件设计总体思想是以单片机为控制系统,接受感应信息并进行处理后,将控制指令传出,对各个系统进行对应操作。硬件设计总体框图如图3-1所示。 SHAPE \* MERGEFORMAT 图 3-1 硬件设计框图 主控模块:根据输入信息进行处理,并将控制数据传出。 显示模块:显示相关的内容。 时钟模块:提供时钟数据。 温度采集模块:感应和提供温度。 键盘模块:对系统进行操作。 3.1 AT89C52单片机 单片机实质上是一个芯片。它具有结构简单、控制功能强、可靠性高、体积小、价格低等优点,单片机技术作为计算机技术的一个重要分支,广泛的应用于工业控制、智能化仪器仪表、家用电器、电子玩具等各个领域。 ATMEL公司生产的AT89C52单片机采用高性能的静态80C51设计,并采用先进工艺制造,还带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。其主要特点如下:8KB Flash ROM,可以擦除1000次以上,数据保存10年。技术特点有:256字节内部RAM;电源控制模式;时钟可停止和恢复;空闲/掉电模式;6个中断源;4个中断优先级;4个8位I/O口;全双工增强型TUAR;3个16位定时/计数器:T0、T1( 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 80C51)和增加的T2(捕获和比较);全静态工作方式:0~24MHZ;AT89C52单片机的基本结构请参见图3-2,各部分情况介绍如下: 中央处理器(CPU):中央处理器是单片机的核心,完成运算和控制功能。AT89C52的CPU能处理8位二进制数或代码。 内部数据存储器(内部RAM):AT89C52芯片中共有256个RAM单元,但其中后128单元被专用寄存器占用,能作为寄存器供用户使用的只是前128单元,用于存放可读写的数据。因此通常所说的内部数据存储器就是指前128单元,简称内部RAM。 内部程序存储器(内部ROM):AT89C52共有8KB掩膜ROM,用于存放程序、原始数据或表格,因此称之为程序存储器,简称内部ROM。 定时器/计数器:AT89C52共有2个16位的定时器/计数器,以实现定时或计数功能,并以其定时或计数结果对计算机进行控制。 SHAPE \* MERGEFORMAT 图3-2 AT89C52单片机结构框图 并行I/O口:AT89C52共有四个8位的I/O口(P0、P1、P2、P3),以实现数据的并行输入输出。 串行口:AT89C52单片机有一个全双工的串行口,以实现单片机和其它设备之间的串行数据传送。该串行口功能较强,既可作为全双工异步通信收发器使用,也可作为同步移位器使用。 中断控制系统:AT89C52单片机的中断功能较强,以满足控制应用的需要。AT89C52共有5个中断源,即外中断2个,定时/计数中断2个,串行中断1个。全部中断分为高级和低级共二个优先级别。 时钟电路:AT89C52芯片的内部有时钟电路,但石英晶体和微调电容需外接。时钟电路为单片机产生时钟脉冲序列。系统允许的晶振频率一般为6MHZ和12MHZ。 从上述内容可以看出,AT89C52虽然是一个单片机芯片,但作为计算机应该具有的基本部件它都包括,因此实际上它已是一个简单的微型计算机系统了。 3.1.1 AT89C52的信号引脚 AT89C52是标准的40引脚双列直插式集成电路芯片,引脚排列请参见图3-2。 ①信号引脚介绍 P0.0~P0.7:低八位地址/数据总线分时复用。 P1.0~P1.7:只能做一般I/O口。 P2.0~P2.7:高八位地址总线。 P3.0~P3.7:8位双向口线。 ALE:地址锁存控制信号。 在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存器锁存起来,以实现低位地址和数据的隔离。此外由于ALE是以晶振六分之一的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲使用。 :外部程序存储器读选通信号。在读外部ROM时 有效(低电平),以实现外部ROM单元的读操作。 :访问程序存储控制信号。当 信号为低电平时,对ROM的读操作限定在外部程序存储器;而当 信号为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。 RST:复位信号。当输入的复位信号延续2个机器周期以上高电平即为有效,用以完成单片机的复位初始化操作。 XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。 VSS:地线。 VCC:+5V电源。 以上是AT89C52单片机芯片40条引脚的定义及简单功能说明。 SHAPE \* MERGEFORMAT 图3-3 AT89C52引脚图 ②信号引脚的第二功能 由于工艺及标准化等原因,芯片的引脚数目是有限制的。例如AT89C52系列把芯片引脚数目限定为40条,但单片机为实现其功能所需要的信号数目却远远超过此数,因此就出现了需要与可能的矛盾。如何解决这个矛盾,兼职是唯一可行的办法,即给一些信号引脚赋以双重功能。如果把前述的信号定义为引脚第一功能的话,则根据需要再定义的信号就是它的第二功能。下面介绍一些信号引脚的第二功能。 P3口线的第二功能: P3的8条口线都定义有第二功能,详见表3-1。 EPROM存储器程序固化所需要的信号: 有内部EPROM的单片机芯片,为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚以第二功能的形式提供的,即: 编程脉冲:30脚(ALE/PROG) 编程电压(25V):31脚( /VPP) 备用电源引入: 由于万年历在运行过程中需要电源,而在运行过程中有可能出现突发情况,所以引入备用电源。AT89C52单片机的备用电源也是以第二功能的方式由9脚(RST/VPD)引入的。当电源发生故障电压降低到下限值时,备用电源经此端向内部RAM提供电压,以保护内部RAM中的信息不丢失。 表3-1 P3口各引脚与第二功能表 引脚 第二功能 第二功能信号名称 P3.0 RXD 串行数据接收 P3.1 TXD 串行数据发送 P3.2 外部中断0申请 P3.3 外部中断1申请 P3.4 T0 定时器/计数器0的外部输入 P3.5 T1 定时器/计数器1的外部输入 P3.6 外部RAM写选通 P3.7 外部RAM读选通 以上把AT89C52单片机的全部信号,分别以第一功能和第二功能的形式列出。各种型号的芯片,其引脚的第一功能信号是相同的,所不同的只在引脚的第二功能信号。 对于9、30和31三个引脚,由于第一功能信号与第二功能信号是单片机在不同工作方式下的信号,因此不会发生使用上的矛盾。但是P3口的情况却有所不同,它的第二功能信号都是单片机的重要控制信号。因此在实际使用时,都是先按需要选用第二功能信号,剩下的才以第一功能的身份作数据位的输入输出使用。 3.2 DS1302时钟模块 DS1302是DALLAS半导体公司推出的时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 3.2.1 内部结构及引脚 SHAPE \* MERGEFORMAT 图3-4 DS1302内部结构图 图3-5 ds1302引脚排列 DS1302的引脚排列,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向)。SCLK为时钟输入端。 3.2.2 工作原理 DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。 3.2.3 寄存器和控制命令 对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。日历、时间寄存器及控制字如表3-2所示: 表3-2 日历、时钟寄存器与控制字对照表 寄存器名称 7 6 5 4 3 2 1 0 1 RAM/CK A4 A3 A2 A1 A0 RD/W 秒寄存器 1 0 0 0 0 0 0 分寄存器 1 0 0 0 0 0 1 小时寄存器 1 0 0 0 0 1 0 日寄存器 1 0 0 0 0 1 1 月寄存器 1 0 0 0 1 0 0 星期寄存器 1 0 0 0 1 0 1 年寄存器 1 0 0 0 1 1 0 写保护寄存器 1 0 0 0 1 1 1 慢充电寄存器 1 0 0 1 0 0 0 时钟突发寄存器 1 0 1 1 1 1 1 最后一位RD/W,为“0”时表示进行写操作,为“1”时表示读操作。 DS1302内部寄存器列表如表3-3所示: 表3-3:DS1302内部主要寄存器分布表 寄存器名称 命令字 取值范围 各位内容 写 读 7 6 5 4 3 2 1 0 秒寄存器 80H 81H 00-59 CH 10SEC SEC 分寄存器 82H 83H 00-59 0 10MIN MIN 小时寄存器 84H 85H 01-12或00-23 12/24 0 A HR HR 日期寄存器 86H 87H 01-28,29,30,31 0 0 10DATE DATE 月份寄存器 88H 89H 01-12 0 0 0 10M MONTH 周寄存器 8AH 8BH 01-07 0 0 0 0 0 DAY 年份寄存器 8CH 8DH 00-99 10YEAR YEAR DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表3-2所示,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。 物理上,DS1302的通讯接口由3个口线组成,即*RST,SCLK,I/O。其中*RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。具体的读写时序参考图3-5,但是请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。 SHAPE \* MERGEFORMAT 图3-6 DS1302的命令字结构 SCLK为0——写入的数据——SCLK为1——SCLK为0——读出的数据 图3-7 DS1302时钟模块 3.3 DS18B20温度采集模块 DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。 3.3.1 内部结构及引脚 SHAPE \* MERGEFORMAT 图3-8 DS18B20内部结构图 SHAPE \* MERGEFORMAT 图3-9 DS18B20引脚排列 3.3.2 测温原理 DS18B20的测温原理如图3-9所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3-9中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。 SHAPE \* MERGEFORMAT 图3-10 DS18B20的测温原理框图 3.3.3 工作过程及时序 DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。 高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。 初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。 初始时,计数器1预置的是与-55℃相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。 DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。 温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。 DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。 DS18B20工作过程一般遵循以下协议:初始化——ROM操作命令——存储器操作命令——处理数据。 1.初始化 单总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。存在脉冲让总线控制器知道DS18B20 在总线上且已准备好操作。 2.ROM操作命令 一旦总线主机检测到从属器件的存在,它便可以发出器件ROM操作命令之一。所有ROM操作命令均为8位长。这些命令列表如下: Read ROM(读ROM)[33h] 此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。 Match ROM( 符合ROM)[55h] 此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。 Skip ROM( 跳过ROM )[CCh] 在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的从属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生线与的效果)。 Search ROM( 搜索ROM)[F0h] 当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。 Alarm Search(告警搜索)[ECh] 此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现告警的情况下,DS18B20才对此命令作出响应。告警的条件定义为温度高于TH 或低于TL。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。 3.存储器操作命令 Write Scratchpad(写暂存存储器)[4Eh] 这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。接下来写入的两个字节将被存到暂存器中的地址位置2和3。可以在任何时刻发出复位命令来中止写入。 Read Scratchpad(读暂存存储器)[BEh] 这个命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。 Copy Scratchpad(复制暂存存储器)[48h] 这条命令把暂存器的内容拷贝到DS18B20的E2存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又正在忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个“0”,如果拷贝结束的话,DS18B20 则输出“1”。如果使用寄生电源,总线控制器必须在这条命令发出后立即起动强上拉并最少保持10ms。 Convert T(温度变换)[44h] 这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。 Recall E2(重新调整E2)[B8h] 这条命令把贮存在E2中温度触发器的值重新调至暂存存储器。这种重新调出的操作在对DS18B20上电时也自动发生,因此只要器件一上电,暂存存储器内就有了有效的数据。在这条命令发出之后,对于所发出的第一个读数据时间片,器件会输出温度转换忙的标识:“0”=忙,“1”=准备就绪。 Read Power Supply(读电源)[B4h] 对于在此命令发送至DS18B20之后所发出的第一读数据的时间片,器件都会给出其电源方式的信号:“0”=寄生电源供电,“1”=外部电源供电。 4.处理数据 DS18B20的高速暂存存储器由9个字节组成。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。 表3-4 DS18B20温度数据表 温度 二进制 十六进制 +125℃ 0000 0111 1101 0000 07D0h +85℃ 0000 0101 0101 0000 0550h +25.0625℃ 0000 0001 1001 0001 0191h +10.125℃ 0000 0000 1010 0010 00A2h +0.5℃ 0000 0000 0000 1000 0008h 0.0℃ 0000 0000 0000 0000 0000h -0.5℃ 1111 1111 1111 1000 FFF8h -10.125℃ 1111 1111 0101 1110 FF5Eh -25.0625℃ 1111 1110 0110 1111 FE6Fh -55℃ 1111 1100 1001 0000 FC90h 上表是DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。 温度转换计算方法举例: 例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则: 实际温度=07D0H×0.0625=2000×0.0625=1250C。 例如当DS18B20采集到-55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则: 实际温度=370H×0.0625=880×0.0625=550C。 图3-11 DS18B20温度采集模块 3.4 键盘模块 按照键盘与CPU的连接方式可以分为查询按键和矩阵式键盘。由于程序操作简单,只需4个按键,所以选有查询式按键。查询式按键是各按键相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他I/O口线上按键的工作状态。查询式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,在按键数量较多时,I/O口线浪费较大,且电路结构显得繁杂。故这种形式适用于按键数量较少的场合。 此设计因为需要的按键少。决定选用4个按钮的小键盘,四个按钮的功能分别为:up键,具有向上和加1的功能。Down键,具有向下和减1的功能。Clear键,具有清除返回的功能。Function键具有运行进入的功能。它们与单片机的P0口相连,依次接P0.0,P0.1,P0.2,P0.3。 图3-12 键盘模块 3.5 LCD显示模块 就时钟而言,通常可采用液晶显示或数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且可视性相对较差,对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。因此,本设计采用LGM12641BS1R显示。LGM12641BS1R的指令可带一个、两个参数,或无参数。若指令中含有参数,则每条指令执行时均须先送入参数,再送入指令代码。由于状态位作用不一样,因此执行不同指令必须检测不同状态位。其引脚功能如下: VCC:电源。 GND:接地。 DB0~DB7:数据线。 :复位信号。 E:数据读写操作控制位,E线向LCD模块发送一个脉冲,LCD模块与单片机之间将进行一次数据交换。 R/W:读写控制线,R/W=0:写操作,R/W=1:读操作。 DI:显示指令控制端。 Vo:液晶显示器驱动电源。 Vout:LCD驱动负电压。 CS1:右半屏选屏信号。 CS2:左半屏选屏信号。 图3-13 LCD显示模块 第4章 软件设计 本系统的软件采用C语言编写,主要由时钟系统,温度采集系统,控制系统和显示系统组成。单片机向时钟芯片和测温元件发出命令使其完成读或写操作,将读出的信息转为BCD码,最后送入显示系统实现功能。软件系统框图如下: SHAPE \* MERGEFORMAT 图4-1 软件系统框图 4.1 温度采集软件 因为DS18B20温度传感器在测温时是通过累加来 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 温度的,为了温度传感器正常稳定的运行,需要加延时子程序。程序如下: void Sensor_Delay(uchar count) { while(count--); // count表示延时参数,值越大,延时时间越长 } 单总线上的所有处理都要从初始化开始。初始化序 图4-2 温度采集流程图 列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。存在脉冲让总线控制器知道DS18B20 在总线上且已准备好操作。初始化程序如下: uchar Sensor_Initial(void) { uchar i = 0; dq = 1; // DQ复位 Sensor_Delay(8); // 稍做延时 dq = 0; // 单片机将DQ拉低 Sensor_Delay(80); // 精确延时,大于480us dq = 1; // 拉高总线 Sensor_Delay(14); // 稍做延时后 i = dq; // 若x=0则初始化成功,若x=1则初始化失败 Sensor_Delay(20); return (~i); } 一旦总线主机检测到从属器件的存在,它便可以发出器件ROM操作命令之一,所有ROM操作命令均为8位长。ROM操作命令:Read T(读区温度寄存器)[BEh],Skip ROM( 跳过ROM )[CCh],Convert T(温度变换)[44h]。 Sensor_Write_Byte( 0xCC ); // 跳过读序号列号的操作 Sensor_Write_Byte( 0x44 ); // 启动温度转换 Sensor_Write_Byte( 0xCC ); // 跳过读序号列号的操作 Sensor_Write_Byte( 0xBE ); // 读取温度寄存器 4.2 阳历软件设计 因为使用了时钟芯片DS1302,阳历程序只需从DS1302各寄存器中读出年、周、月、日、时、分、秒等数据,再处理即可。 单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧。此命令帧是由八位二进制组成,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是 图4-3 阳历流程图 读操作抑或是写操作,详细格式可见表3-2。由此可定义位变量: sbit ACC0 = ACC ^ 0; //定义最低位 sbit ACC7 = ACC ^ 7; //定义最高位 #define second_address 0x80 //秒寄存器 #define minute_address 0x82 //分寄存器 #define hour_address 0x84 //小时寄存器 #define day_address 0x86 //日期寄存器 #define month_address 0x88 //月份寄存器 #define year_address 0x8C //年寄存器 首次对DS1302进行操作之前,必须对它进行初始化,然后从DS1302中读出数据,再经过处理后,送给显示缓冲单元。初始化相应程序如下: Clock_Write_Time(0x8e,0x00); //WP=0 写操作 //最高位为 0 时钟芯片工作 Clock_Write_Time( second_address, * clock_time ); //秒 clock_time ++; //指向分 Clock_Write_Time( minute_address, * clock_time ); //分 Clock_Write_Time( hour_address, * clock_time ); //时 Clock_Write_Time( day_address, * clock_time ); //日 Clock_Write_Time( month_address, * clock_time); //月 Clock_Write_Time( year_address, * clock_time ); //年 Clock_Write_Time( 0x8e,0x80); //WP=1 读保护 现在已经对程序进行了初始化并且定义了寄存器,可以从DS1302时钟芯片中读出时间与日期。例如: * clock_time = Clock_Read_Time( second_address ); //读秒 clock_time ++; //指向分 * clock_time = Clock_Read_Time( minute_address ); //读分 clock_time ++; //指向时 * clock_time = Clock_Read_Time( hour_address ); //读时 4.3 阴历软件设计 SHAPE \* MERGEFORMAT 图4-4 阴历转换流程图 阴历程序的实现是要靠阳历日期来推算。阳历一个月不是30天就是31天(2月除外,闰年2月为29天)。阴历一年有12个月或13个月(含闰月),一个月为30天或29天。根据阴历和阳历的关系可得出以下数据,公历年对应的农历数据,每年三字节。格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小。第二字节BIT7-0 对应农历第5-12 月大小。第三字节BIT7 表示农历第13 个月大小。月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天),第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期。格式如下: 0x04,0xAe,0x53,//1901 0x0A,0x57,0x48,//1902 0x55,0x26,0xBd,//1903 0x0d,0x26,0x50,//1904 0x0d,0x95,0x44,//1905 0x46,0xAA,0xB9,//1906 …… 0x0d,0x15,0x41,//2098 0x2d,0x92,0xB5,//2099 有了此数据之后,可以开始设计算法了。由于输入的年、月、日数据都为二进制(BCD码),换算很不方便,所以把它转换为十六进制(HEX码)。方法如下: temp1=year/16; //BCD->hex 先把数据转换为十六进制 temp2=year%16; //年与16求余 year=temp1*10+temp2; 转换为十六进制后可以根据公历年定位数据表地址,可从数据表内取得该年公历春节的日期。通过计算可取得公历日和春节距离元旦的天数,以计算2004年10月16号为例,对应数据为(0,0x4,0x10,0x16)其中第一位数0值21世纪,如果是1为19世纪。算法如下: //定位数据表位置 calendar_address = ( year + 99 ) * 3; //21世纪 calendar_address = ( year - 1 ) * 3; //19世纪 //取春节所在的阳历月份 temp1 = year_code[ calendar_address + 2 ] & 0x60; //Bit6~~Bit5 //取春节所在的阳历日期 temp2 = year_code[ calendar_address + 2 ] & 0x1f; //Bit4~~Bit0 //计算春节离当年元旦的天数;春节只会在阳历的1月 或 2月 temp3 = temp2 - 1; //春节在1月 temp3 = temp2 + 31 – 1 //春节在2月 //计算阳历月离当年元旦的天数 day_number = day_code1[ month - 1 ] + day - 1; //阳历月小于10月 day_number = day_code2[ month - 10 ] + day - 1; //阳历月大于10月 取得春节和阳历日离元旦的天数后,可求的阳历日离春节的天数,求的的天数记为A,然后判断该年是否为闰年或者有闰月。如果阳历的月大于2 且该年的2月为闰月,天数加1 。闰年指的就是阳历有闰日或阴历有闰月的一年。阳历四年一闰,在二月加一天,这一天叫做闰日。农历三年一闰,五年两闰,十九年七闰,每逢闰年所加的一个月叫做闰月。方法如下: if( ( month > 2 ) && ( year % 4 == 0) ) day_number ++ 然后再判断阳历日在春节之前还是之后。如果阳历日在春节之后或者春节当日,则农历年和公历年在一年相等,从数据表内取出农历天数记为B。如果A小于B,农历日等于A加1。如果A大于等于B且A等于A减B,再判断农历月是否等于闰月,如果不是农历月加1,如果是且当年没闰月,农历月加1。算法的主要语句如下: if( day_number >= temp3 ) //阳历在春节之后或春节当日 flag_month = get_moon_day( month_point, calendar_address ); //检查该阴历月的大小 大月返回1 小月返回0 if( flag_month ) // flag_month为阴历月 temp1 = 30; //大月30天 temp1 = 29; //小月29天 //闰月所在的月分 temp2 = year_code[ calendar_address ] & 0xf0;//calendar_address农历地址 temp2 >>= 4; //提取高四位 假如是0 表示没有闰月 while( day_number >= temp1 ) // day_number阳历日离春节的天数 如果阳历日在春节之前,与上面算法大体相同,但要注意农历年等于公历年减1。当A小于B时,农历日等于B减A加1。如果A大于B,判断是否为改年有闰月,没有的话农历月减1,最后判段农历月是否等于闰月,如果等于则闰月取反。该部分主要程序语句如下: if( year == 0 ) { year = 99; c_flag = 1; } //农历年等于公历年减1,定位前一年 while( temp3 > temp1 ) //temp3阳历日离春节的天数 if( flag_year == 0 ) //如果不是闰年 month -=1; //农历月减1 if( month == temp2 ) //农历月等于闰月 最后算出结果转为二进制码(BCD码)送入显示单元。 4.4 LCD显示系统 要使LCD液晶显示器显示内容,首先要对LCD进行初始化。程序如下: Lcd_Display_Off(); //关闭显示器 Lcd_Write_Command(0xb8); //页面地址 Lcd_Write_Command(0x40); //起始地址 Lcd_Write_Command(0xc0); //行开始 Lcd_Display_On(); //开启显示器 Lcd_Clear(); //清屏 图4-5 显示流程 此程序中开启显示器的主要语句port=0x3f;关闭显示器的主要语句为port=0x3e;通过数据读写操作控制位E向LCD模块发送脉冲,与单片机之间进行数据交换。 要使LCD液晶显示器显示文字有两种方法,文本显示和图形显示,这里重点介绍以图形方式显示汉字的方法。 256×256点阵的液晶显示模块能显示16×16个汉字。对于每个汉字的显示,首先应该计算该汉字在字库中的地址,然后读出该汉字的字型码。当显示至一行的末尾时要换行显示。显示汉字时,一个16×16的汉字字型码占32个字节,每显示一行要2个字节;第二行显示时,显示地址要在前一行首字节地址上加30,共需要16次循环才能完整地显示一个汉字。 例如年字的字型码为: /*-- 文字: 年 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00, 读出汉字后就能显示相应信息。例如显示小时: //显示 小时 i= * clock_time >> 4; Lcd_Character_16X8( 1, 2, 16 , letter_logo[i]); //显示 小时的高位 i= * clock_time & 0x0f; Lcd_Character_16X8( 1, 2, 24 , letter_logo[i]); //显示 小时的低位 Lcd_Character_16X16( 1, 2, 32 , time_logo[0]); //显示 小时 其中时间数组全为BCD码。 4.5 按键系统 此程序共有4个按键,每次按完键后应该使键松开,为此设定一个按键松开程序如下所示: void Key_Idle() { while( ( P0 & 0x0f ) != 0x0f ); } 要使按键实现相应的功能,应该设置一个按键扫描程序如下: 图4-6 控制流程图 switch ( P0 & 0x0f ) //将按键码转换成键值 { case 0x0e: return up_array; //UP键 case 0x0d: return down_array; //down键 case 0x0b: return clear_array; //clear键 case 0x07: return function_array; //function键 default : return null; //返回 } 确定按键后就能使其实现功能。 4.6 系统主流程图 系统的软件主流程图如图4-7所示 SHAPE \* MERGEFORMAT 图4-7 系统主流程图 详细系统主程序见附录2。 第5章 系统调试 本设计的核心采用是AT89C52单片机,外部连接电子电路,构成了一个电子万年历系统。本系统采用PROTEUS软件进行仿真。 5.1 调试过程 调试分为硬件调试和软件调试。硬件调试主要是检测硬件电路是否有短路、断路、虚焊等。DS1302的硬件电路很简单,只通过3根线于单片机相连,很容易检测,主要是检查其引脚,如晶振和电源等是否接好。另外可以通过软件来调试硬件,如为了测试显示电路连接是否正确,可以编写一个简单的显示程序来测量它。接下来可进行软件调试,可以编写只含DS1302的计时和读写程序、显示程序,测试DS1302是否正常工作。最后调试时间,调整程序。 图5-1 系统仿真图 按一下function键可进入调整界面,再按一下可切换调整内容,如下图所示: 图5-2 系统调试切换图 UP键和DOWN键分别起加1和减1的作用,CLEAR键起返回的作用。 5.2 仿真结果 此程序能稳定的运行,成功显示出公历和农历时间,还可显示小时温度及星期。经测试此程序比标准时间略慢,有一定误差。 总 结 随着科技的发展、时代的进步、人们的生活水平越来越高,现在已经是信息技术化的时代。而电子时钟在现在的应用非常广泛,已经成为人们生活必不可少的一部分。本设计正是大家熟悉的电子万年历。 本设计功能齐全适用于大众,以AT89C52单片机为控制核心,与外围的一些元件通过线路的连接构成电子万年历系统。可显示时间、日期及温度,还能进行阴历与阳历之间的转换。 论文详细的介绍了整个系统的工作原理、硬件结构的构成和软件程序的设计。 本系统主要由单片机向时钟芯片发出振荡信号,使时钟芯片振荡产生信号送入寄存器,经过处理后转换为BCD码,最后送人显示部分,显示出内容。 本系统软件程序部分采用的C语言,因为C语言语法简洁,书写格式方便、灵活,容易理解。如果出现错误,也利于修改。 参考文献 [1] 王新颖.单片机原理及应用.北京:北京大学出版社,2008 [2] 陈忠平.单片机基础与最小系统实践.北京:北京航空航天大学出版社,2006 [6] 沈庆阳.8051单片机实践与应用.北京:清华大学出版社,2003 [4] 侯玉宝.基于Proteus的51系列单片机设计与仿真.北京:电子工业出版社,2008 [5] 何立民.单片机应用技术选编.北京:北京航空航天出版社,2006 [6] 杨振江.流行单片机实用子程序及应用实例.西安:西安电子科技大学出版社,2007 [7] 王明顺.可涓流充电的串行实时时钟芯片DS1302.北京:电子工业出版社, 2009 [8] 刘和平.单片机原理及接口程序设计.北京:北京航天航空大学出版社,2008 [9] 李学海.PIC单片机使用教程-提高篇.北京:北京航天航空大学出版社,2009 [10] 耿长青.单片机应用技术.北京:化工出版社,2008 附录1 整机电路图 附录2 元件明细表 项目 代号 名 称 型号、规格 数量 备注 更改 R2 电阻 RT―0.125―b―470Ω―±10% 1 R3 电阻 RT―0.125―b―470Ω―±10% 1 R4 电阻 RT―0.125―b―470Ω―±10% 1 R5 电阻 RT―0.125―b―470Ω―±10% 1 LCD 液晶显示器 LGM12641BS1R 1 U1 集成芯片 AT89C52 1 U2 储存器 24C02C 1 U3 时钟芯片 DS1302 1 U4 温度采集器 DS18B20 1 按键开关 BUTTON 4 旧底图总号 更改 标记 数量 更改 单号 签名 日期 底图总号 拟 制 刘真 电子万年历元件明细表 审 校 日期 签名 等级标记 第1张 共1张 标准化 批 准 附录3 系统主程序 /*************************** 功 能:万年历( 阴历)**********************/ /*******************************文件包含*******************************/ #include < reg52.h > #include < character.h > #include < lcd.h > #include < clock.h > #include < sensor.h> #include < calendar.h > #include < key.h > /*****************预定义*****************/ #define uchar unsigned char #define uint unsigned int /******************函数名称main()*******************/ void main( void ) { uchar clock_time[7]={ 0x00,0x00,0x02,0x01,0x06,0x07 }; //定义时间变量 秒分时日月年 uchar alarm_time[2]={ 0,0}; //闹钟设置 alarm_time[0]: 分钟 alarm_time[1]: 小时 uchar temperature[2]; //定义温度变量 temperature[0] 低8位 temperature[1] 高8位 Lcd_Initial(); //LCD初始化 Clock_Initial( clock_time ); //时钟初试化 /***********************中断初始化***************************/ EA = 1; //开总中断 ET0 = 1; //Timer0 开中断 ET2 = 1; //Timer2 开中断 TMOD = 0x01 ; //Timer0 工作方式 1 RCAP2H = 0x3c; RCAP2L = 0xb0; //Timer2 延时 50 ms while( 1 ) { switch( Key_Scan() ) { case up_array: { Key_Idle(); } break; case down_array: { Key_Idle(); } break; case clear_array: { Key_Idle(); } break; case function_array:{ Key_Function( clock_time, alarm_time ); } case null: { Clock_Fresh( clock_time ); //时间刷新 Lcd_Clock( clock_time ); //时间显示 Sensor_Fresh( temperature ); //温度更新 Lcd_Temperture( temperature ); //温度显示 Calendar_Convert( 0 , clock_time ); Week_Convert( 0, clock_time ); } break; } } } 袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈 芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈 AT89C52 主控模块 键盘模块 DS18B20温度采集模块 LCD 显示模块 DS1302 时钟模块 T0 CPU 时钟电路 ROM 定时/计数器 RAM 中断系统 并行接口 串行接口 P3 TxD x P RxD INT0 INT1 P2 P1 P0 T1 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 RST/VPD 9 RXD P3.0 10 TXD P3.1 11 INT0 P3.2 12 INT1 P3.3 13 T0 P3.4 14 T1 P3.5 15 WR P3.6 16 RD P3.7 17 XTAL2 18 XTAL1 19 VSS 20 21 P2.1 22 P2.2 23 P2.3 24 P2.4 25 P2.5 26 P2.6 27 P2.7 28 PSEN 29 ALE/PROG 30 EA/VPP 31 P0.7 32 P0.6 33 P0.5 34 P0.4 35 P0.3 36 P0.2 37 P0.1 38 P0.0 39 VCC 40 电 源 控 制 输入移位 寄存器 振荡器与分频器 实时时钟 命令与控制 逻辑 31*8RAM Vcc1 Vcc2 GND I/O SCLK RST X1 X2 SCLK *RST I/O 高速缓存储存器 8位CRC生成器 储存器和控制器 温度灵敏器件 低温触发器TL 高温触发器TH 64位ROM和单线接口 电源检测 配置寄存器 VCC DQ GND 预置 低温度系数 振荡器 高温度系数 振荡器 减法计数器2 斜率累加器 减法计数器1 =0 =0 比较器 预置 温度寄存器 LSB置1/清零 +1 停止 控制系统 显示系统 时钟系统 温度采集系统 初始化模块 DS18B20取得温度值 存入储存器 处理温度值,换成BCD码 显示温度 子程序入口 初始化1302时钟芯片 从1302时钟芯片中读出时间和日期 读出数据为BCD码,送入显示缓冲单元 子程序入口 根据公历年,定位数据表地址 从数据表取得春节公历的日期,并通过计算公历日和春节离元旦的天数,算出公历日离春节的天数记为A 公历在春节以后? 农历年=公历年 取农历月信息 农历年=公历年-1,定位前一年,取农历月信息 农历月=12,闰月 C=0(非闰月) 农历月=1,闰月 C=0(非闰月) 取农历天数B 取农历天数B 农月=闰月? C取反 农历月加1 C=1? 农历月减1 C取反 农月=闰月? C=1? A>B? A=A-B A=A-B A>=B? 农历日=B-A+1 农历日=A+1 农历年、月、日数据标准化 子程序出口 Y N Y Y Y Y Y Y N N N N N N 子程序入口 初始化LCD 写指令数据或读显示数据 子程序出口 扫描按键 Function键有效,进入时钟调整程序 是否调整时间 Y 使用UP或DOWN进行调整 返回主程序 N 开始初始化 从DS1302读出信息 LCD液晶显示相关信息 判断是否有键按下 调整时间 没有键按下 N Y _1234567893.unknown _1234567895.unknown _1234567897.unknown _1234567899.unknown _1234567900.unknown _1234567898.unknown _1234567896.unknown _1234567894.unknown _1234567891.unknown _1234567892.unknown _1234567890.unknown
本文档为【基于单片机的电子万年历的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
北溟愚鱼
暂无简介~
格式:doc
大小:429KB
软件:Word
页数:45
分类:工学
上传时间:2018-09-22
浏览量:20