电子万年历论文
2014届毕业生毕业设计(论文)
中 文 题 目
基于单片机的电子万年历设计
系 别:
专 业: 电气自动化
班 级: 电气11-1
学 号:
姓 名:指导教师:
完成日期:
河北交通职业技术学院
目录
第1 章 绪 论 . ................................................................................................................................................... 3
1.1 课题意义 . ............................................................................................................................................... 3
1.2国内外现状及水平: ............................................................................................................................. 3
第2章基于单片机万年历的方案研究 ............................................................................................................... 4
2.1 系统基本方案选择和论证 ................................................................................................................... 4
2.1.1 单片机芯片的选择 ................................................................................................................... 4
2.1.2 显示模块选择方案和论证 ....................................................................................................... 4
2.1.3 时钟芯片的选择方案和论证 ................................................................................................... 5
2.1.4 温度传感器的选择方案与论证 ............................................................................................... 5
2.2 电路设计最终方案决定 ....................................................................................................................... 6
2.3 DS1302,DS18B20和LCD1602的原理及说明 .................................................................................... 6
2.3.1 LCD1602工作原理及说明 ........................................................................................................ 6
2.3.2 DS1302原理及说明 .................................................................................................................. 7
2.3.3 DS18B20工作原理及说明 ........................................................................................................ 9
第3章 系统的硬件设计与实现 ......................................................................................................................... 9
3.1电路设计框图 . ....................................................................................................................................... 9
3.2系统硬件概述 . ..................................................................................................................................... 10
3.3 主要模块电路的设计 ......................................................................................................................... 10
3.3.1 STC89C52单片机主控制模块的设计 .................................................................................... 10
3.3.2时钟电路模块的设计 .............................................................................................................. 13
3.3.3温度采集模块设计 .................................................................................................................. 14
3.3.4 显示模块的设计 ..................................................................................................................... 14
3.4各模块电路原理图 .............................................................................................................................. 14
3.4.1电源电路 . ................................................................................................................................. 14
3.4.2复位电路 . ................................................................................................................................. 15
3.4.3振荡电路 . ................................................................................................................................. 15
3.4.4温度采集电路 .......................................................................................................................... 16
3.4.5通信电路 . ................................................................................................................................. 16
3.4.6显示电路 . ................................................................................................................................. 17
3.4.7键盘电路 . ................................................................................................................................. 18
第4章 系统的软件设计 . .................................................................................................................................. 19
4.1 程序流程框图: . ................................................................................................................................ 19
第5章 系统测试 . .............................................................................................................................................. 21
5.1 硬件测试 . ............................................................................................................................................ 21
5.2 软件测试 . ............................................................................................................................................ 21
结束语 . ................................................................................................................................................................ 22
参考文献 . ............................................................................................................................................................ 23
第1 章 绪 论
1.1 课题意义
电子万年历作为电子类小产品不仅是市场上的宠儿,也是是单片机设计培训中一个很实用的题目。因为这个课题有很好的开放性和可发挥性,对制作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且要求设计的电子万年历在操作上力求简洁,功能上尽量齐全,显示界面也要出色。所以,电子万年历制作无论从实用目的,还是从培养能力的角度来看都是很有价值的毕业设计课题。本电子万年历的设计在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCD 液晶显示屏显示。STC89C52单片机是由Atmel 公司推出的,功耗小,电压可选用4~6V 电压供电;DS1302时钟芯片是美国DALLAS 公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;数字显示是采用的LED 液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil 软件中进行调试,确定没有问题后,烧写到单片机上进行测试。最后在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。
1.2国内外现状及水平:
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。它可以对年、月、日、周日、时、分、秒进行计时,对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多
优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。近些年我国也开始重视对电子万年历的开发与设计,让更多的电子时钟能够走进人民生活,跟多人能够应用到功能强大,精度高的电子时钟。但是仍然存在很多问题。
中国电子万年历产业发展出现的问题中,许多情况不容乐观,如产业结构不合理、产业集中于劳动力密集型产品;技术密集型产品明显落后于发达工业国家;生产要素决定性作用正在削弱;产业能源消耗大、产出率低、环境污染严重、对自然资源破坏力大;企业总体规模偏小、技术创新能力薄弱、管理水平落后等.
从什么角度分析中国电子万年历产业的发展状况?以什么方式评价中国电子万年历产业的发展程度?中国电子万年历产业的发展定位和前景是什么?中国电子万年历产业发展与当前经济热点问题关联度如何……诸如此类,都是电子万年历产业发展必须面对和解决的问题——中国电子万年历产业发展已到了岔口;中国电子万年历产业生产企业急需选择发展方向。
中国电子万年历产业发展研究报告阐述了世界电子万年历产业的发展历程,分析了中国电子万年历产业发展现状与差距,开创性地提出了“新型电子万年历产业” 及替代品产业概念,在此基础上,从四个维度即“以人为本”、“科技创新”、“环境友好”和“面向未来”准确地界定了“新型电子万年历产业” 及替代产品的内涵。根据“新型电子万年历产业” 及替代品的评价体系和量化指标体系,从全新的角度对中国电子万年历产业发展进行了推演和精准预测,在此基础上,对中国的行政区划和四大都市圈的电子万年历产业发展进行了全面的研究。
第2章基于单片机万年历的方案研究
2.1 系统基本方案选择和论证
2.1.1 单片机芯片的选择
本设计采用STC89C52芯片作为硬件核心,该芯片采用Flash ROM,内部具有8KB ROM存储空间, 相对于本设计而言程序空间完全够用。能于5V 电压工作, 而且与MCS-51系列单片机完全兼容, 而且运用于电路设计中时具备ISP 在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,避免芯片的多次拔插对芯片造成的损坏。
2.1.2 显示模块选择方案和论证
方案一:
采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合, 如采用在显示数字显得太浪费, 且价格也相对较高, 所以也不用此种作为显示。
方案二:
采用LED 数码管动态扫描,LED 数码管价格虽适中, 对于显示数字也最合适, 而且采用动态扫描法与单片机连接时, 占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,所以不采用LED 数码管作为显示。
方案三:
采用LCD 液晶显示屏, 液晶显示屏的显示功能强大, 可显示大量文字, 图形, 显示多样, 清晰可见, 对于电子万年历而言,一个1602的液晶屏即可,价格也还能接受, 需要的接口线较多, 但会给调试带来诸多方便,所以此设计中采用LCD1602液晶显示屏作为显示模块。
2.1.3 时钟芯片的选择方案和论证
方案一:
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。
方案二:
采用DS1302时钟芯片实现时钟,DS1302是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V ~5.5V 。采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302内部有一个31×8的用于临时性存放数据的RAM 寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz 晶振。因此,本设计中采用DS1302提供时钟。
2.1.4 温度传感器的选择方案与论证
方案一:
使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。
此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。
方案二:
采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。因此,本设计DS18B20温度传感器作为温度采集模块。
2.2 电路设计最终方案决定
综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用STC89C52作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;LCD1602液晶屏作为显示。
2.3 DS1302,DS18B20和LCD1602的原理及说明
2.3.1 LCD1602工作原理及说明
(1)寄存器选择控制
1602字符型LCD 通常有14条引脚线或16条引脚线的LCD ,多出来的2条线是背光电源线。1602液晶模块内部的字符发生存储器(CGROM) 已经存储了160个不同的点阵字符, 图形寄存器选择控制表如表2.1所示:
表2.1 LCD1602寄存器选择控制表
RS
1
1 R/W 操作说明 0 1 0 1 写入指令寄存器(清屏指令等) 读busy flag,以及读取位址计数器(DB0~DB6)的值 写入数据寄存器(显示各字型等) 从数据寄存器读取数据
(2)指令集
1602通过D0~D7的8位数据端传输数据和指令。显示模式设置(初始
化)00111000[0x38]设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置:(初始化) 00001DCBD 显示(1有效) 、C 光标显示(1有效) 、B 光标闪烁(1有效) 。000001NS N=1(读或写一个字符后地址指针加1并且光标加1) ,N=0(读或写一个字符后地址指针减1并且光标减1) ,S=1且N=1(当写一个字符后,整屏显示左移) ,S=0当写一个字符后,整屏显示不移动。数据指针设置:数据首地址为80H ,所以数据地址为80H+地址码(0-27H,40-67H) 。其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。
2.3.2 DS1302原理及说明
(1) 时钟芯片DS1302的工作原理
DS1302在每次进行读、写程序前都必须初始化,先把SCLK 端置 “0”,接着把
RST 端置“1”,最后才给予SCLK 脉冲;读/写时序如下图2.2所示。图2.1为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表2.2为DS1302的日历、时间寄存器内容:“CH ”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP ”是写保护位,在任何的对时钟和RAM 的写操作之前,WP 必须为0。当“WP ”为1时,写保护位防止对任一寄存器的写操作。
(2) DS1302的控制字
DS1302的控制字如图2.1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM 数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
图2.1 DS1302的控制字
(3) 数据输入输出
在控制指令字输入后的下一个SCLK 时钟的上升沿时,数据被写入DS1302,数据输入
从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图2.2所示:
图2.2 DS1302读与写的时序图
(3) DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式, 其日历、时间寄存器及其控制字见表2.2。
表2.2 DS1302的日历、时间寄存器
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H ~FDH ,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM 寄存器,此方式下可一次性读写所有的RAM 的31个字节,命令控制字为FEH(写) 、FFH(读) 。
2.3.3 DS18B20工作原理及说明
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms 。 DS18B20测温原理如图2.3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2.3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图2.3 DS18B20测温原理框图
第3章 系统的硬件设计与实现
3.1电路设计框图
本系统的电路系统框图如图3.1所示。STC89C52单片机对DS1302和DS18B20写入控制字并读取相应的数据,继而控制LCD1602作出对应的显示。
图3.1 系统硬件框图 3.2系统硬件概述
本电路是由STC89C52单片机作为控制核心,能在5V 电压工作,STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8kBytes ISP(In-system programmable) 的可反复擦写1000次的Flash 只读程序存储器,器件采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C52引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V ~
5.5V 。采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302内部有一个31*8的用于临时性存放数据的RAM 寄存器。可产生年、月、日、周、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20完成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,测温范围 -55℃~+125℃,固有测温分辨率0.5℃,支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温,工作电源:3~5V/DC,在使用中不需要任何外围元件;显示部份由LCD1602液晶显示器完成,该显示器为工业字符型液晶,能够同时显示16x02即32个字符(16列2行)。
3.3 主要模块电路的设计
3.3.1 STC89C52单片机主控制模块的设计
S TC 系列单片机是由STMicroelectronics 公司生产,并有宏晶公司做大陆代理的。本设计使用STC89C52作为控制核心,其管脚兼容其他51系列的单片机,以下对STC89C52进行简单讲解。
STC89C52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。
采用40Pin 封装的双列直接DIP 结构,图3.2是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在对各引脚功能说明如下(图3.2):
(1)主电源引脚
Vcc :接+5V 电源正端。
Vss :接+5V 电源地端。
(2)输入/输出引脚
P.0~P0.7:P0口的8个引脚。在不接片外存
储器与不扩展I /O 接口时,可作为准双向输入/
输出接口。在接有片外存储器或扩展I /O 接口
时,P0口分时复用为低8位地址总线和双向数据
总线。
P1.0~P1.7:P1口的8个引脚。可作为准双向
I /O 接口使用。对于52子系列,P1.0 与 P1.1
还有第二种功能:P1.0 可用作定时器/计数器2
的计数脉冲输入端T2。P1.1可用作定时器/计数
器2的外部控制端T2EX 。
P2.0~P2.7:P2口的8个引脚。可作为准双向
I /O 接口;有接有片外存储器或扩展I /O 接口且寻址范围超过256个字节时,P2口用作高8位地址总线。
P3.0~P3.7:P3口的8个引脚。除作为准双向I /O 接口使用外,还具有第二种功能 ,详见表3.1。
表3.1 P3口第二功能表
图3.2 STC89C52单片机管脚图
(3)控制总线
ALE /PROG :地址锁存有效信号输出端。在访问片外程序存储器期间,每机器周期该信
号出现两次,其下降沿用于控制锁存P0口输出的低8位地址。对于片内含EPROM 的机型,在编程期间,此引脚用作编程脉冲PROG 的输入端。
PSEN :片外程序存储器读选通信号输出端,或称片外取指信号输出端。在向片外程序存储器读取指令或常数期间,每个机器周期该信号两次有效(低电平),以通过数据总线P0口读回指令或常数。在访问片外数据存储器期间,PSEN 信号将不出现。
RST /V :(RST 是 RETET 简略写法。)是复位端。单片机的振荡器工作时,该引脚上出现持续两个机器周期的高电平就可实现复位操作,使单片机回复到初始状态。上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续10ms 以上才能保证有效复位。
Vcc 掉电期间,该引脚如接备用电源VPD (电压范围+4.5V至+5.5V),可用于保存片内RAM 中的数据。当Vcc 下降到某规定值以下VPD ,便向片内RAM 供电。
EA /VDD :片外程序存储器选用端。该引脚有效(低电平)时只选用片外程序存储器,否则计算机上电或6复位后先选用片内程序存储器。
(4)外接晶振引脚
XTAL1:片内反相放大器输入端。
XTAL2:片内反相放大器输出端。外接晶体时,XTAL1和 XTAL2各接晶体的一端,借外接晶体与片内反相放大器构成振荡器。
图3.3单片机最小系统
3.3.2时钟电路模块的设计
DS1302 是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,工作电压为2.5V ~5.5V 。采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302内部有一个31×8的用于临时性存放数据的RAM 寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
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 为时钟输入端。DS1302的控制字节的最高有效位(位7) 必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM 数据; 位5至位1指示操作单元的地址; 最低有效位(位0) 如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 在控制指令字输入后的下一个SCLK 时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H ~FDH ,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM 寄存器,此方式下可一次性读写所有的RAM 的31个字节,命令控制字为FEH(写) 、FFH(读) 。DS1302与CPU 的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即
可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU 一个口线即可。
3.3.3温度采集模块设计
采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P3.5与DS18B20的I/O口连接加一个上拉电阻,Vcc 接电源,Vss 接地。独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V 至5.5V 无需备用电源 测量温度范围为-55度至+125度。-10度至+85度范围内精度为±0.5度温度传感器可编程的分辨率为9~12位。
3.3.4 显示模块的设计
采用LCD1602液晶显示器,单片机P0口作为数据输出口,通过10R 的上拉电阻连接到VCC ,VCC 接5V 电源,GND 接地。GND 为液晶显示器对比度调整端,可以通过滑动变阻器RH1调显示器的对比度(对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对比度)。RS 为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(或EN) 端为使能(enable)端,下降沿使能。DB0-DB7为双向数据总线,同时最高位DB7也是忙信号检测位。BLA 、BLK 分别为显示器背光灯的正、负极。
3.4各模块电路原理图
3.4.1电源电路
由USB 接口供5V 电压,此电源电路能够给单片机提供稳定的电压,使系统能够稳定工作如图3.7所示
图3.7电源电路
3.4.2复位电路
无论用户使用哪种类型的单片机
, 总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏, 直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统, 并在实验室调试成功后, 在现场却出现了“死机”、“程序走飞”等现象, 这主要是单片机的复位电路设计不可靠引起的,本电路设计采用可靠的手动复位方式,单片机复位电路如图3.8所示
图3.8复位电路
3.4.3振荡电路
对于一个高可靠性的系统设计,晶体的选择非常重要。在振荡回路中,晶体既不能过激励(容易产生高次谐波) 也不能欠激励(不容易起振) 。晶体的选择至少必须考虑:谐振频
点,负载电容,激励功率,温度特性,长期稳定性。
在本设计中采用了11.0592MHZ 的晶振。这样有利于得到没有误差的波特率。特别是用于串口通信时,选用这种晶振比较好。单片机振荡电路如图图3.9所示。
图3.9震荡电路
3.4.4温度采集电路
单片机使用VCC 与上拉电阻RDS1相连,再与DS18B20的2号引脚相接,上拉电阻取值
4.7K 。温度传感器采用外部供电方案,由1、3引脚提供电源。电路图如下图3.10:
图3.10温度采集电路
3.4.5通信电路
通信电路主要由MAX232芯片构成,如下图3.11所示。MAX232的T1IN 引脚接在
单片机TXD 的P3.1引脚控制。TTL 电平从单片机的TXD 端发出,经过MAX232转换为RS-232电平后从MAX232的T1OUT 引脚发出,再经过随板配送的交叉串口线后,连接至PC 机的串口座的第二引脚RXD 端,至此计算机收到数据。PC 机发送数据时从PC 机串口座第三脚TXD 端发出数据,再逆向流向单片机的RXD 端P3.0接收数据。
图3.11串口通信电路
3.4.6显示电路
显示电路由1602液晶接口插槽组成,如下图3.12所示。液晶显示器R/W端直接接地,表示只允许写入,而不可以从中读取。使能端E 由单片机P0.7引脚控制,数据/命令选择端由单片机的P2.6引脚控制。偏压信号VL 端与滑动变阻器RH1相连,通过RH1可以调节显示器的显示对比度。RD1主要用于限流作用,起到一定的保护作用。显示器数据端口与单片机的P0对应相连,单片机通过P0口可以向显示器中输入控制命令或要显示的字符。
图3.12显示电路
3.4.7键盘电路
按键电路由3个按键组
成,主要是用于调节时间,日期和星期如图3.13所示。
图3.13按键电路
第4章 系统的软件设计
4.1 程序流程框图:
图4.1主程序流程图
主程序流程图如上图4.1所示。由于LCD1602,DS18B20,DS1302的数据读取及指令写入函数均已在各自的头文件中完成,在主程序中只须引用即可。
由于在硬件电路方面上设计了时间调整按键和开关,因此应有对应的时间调整程序。时间调整程序的流程图如图4.2所示。
图4.2 时间调整程序流程图
第5章 系统测试
5.1 硬件测试
在调试硬件时遇到过很多问题,但只要细心、认真检查这些问题都是可以避免的,主要问题及解决办法现列如下:
(1) 认真检查电路是否有短路的地方,线与线之间,管脚刺破邻近的漆包线之间是否连接在一起,有的话要用刀划开,或者重新焊接。
(2) 检查完毕后接通电源后LCD1602没有正确的显示。在不通电状态下用万用表检测电路是否正常连接,在检查回路时发现有的点之间看似连接,但由于虚焊导致其并无电气连接,只能对焊脚进行在加工直到解决问题。
5.2 软件测试
由于本系统涉及到多个子程序,多个芯片的编程。首先必须对可编程芯片的控制字即其控制指令要熟记于心。其次,芯片很多都有时钟输入端,需要晶振支持。对芯片的读写都需要在相应的触发沿到来时才能进行。由于DS18B20是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,会对延时有较高要求。所以在调用温度子程序时,先关闭定时器1中断允许,在温度子程序反回时再打开定时器1中断允许。
结束语
以上所述即是基于单片机电子万年历的设计全过程,经过多次的反复测试与分析, 对电路的原理及功能更加熟悉, 同时提高了设计能力与及对电路的分析能力. 经过此设计,基本完成了设计任务的要求。硬件层面而言操作相对简单,界面比较友好。
在硬件电路方面,详尽解析了各个独立元件的选择依据,对数种方案进行了全面的比较。在时钟芯片的选择上,若直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。因此采用专业的时钟芯片DS1302, 它可以对年、月、日、周日、时、分、秒进行计时,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能;在显示模块的选择上,若采用LED 数码管动态扫描,LED 数码管价格虽适中, 对于显示数字也最合适, 而且采用动态扫描法与单片机连接时, 占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,因此本次设计选择了LCD1602,液晶显示屏的显示功能强大, 可显示大量文字, 图形, 显示多样, 清晰可见;在温度采集模块的选择上,没有采用热敏电阻,因为设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。最后选择了DS18B20, 此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。从元件性能和组装电路后的测试结果来看,硬件电路的设计是比较成功的, 各个功能都能实现了。
参考文献
[1]胡乾斌,李光斌,李玲,喻红.单片微型计算机原理与应用. 华中科技大学出版社,1996.
[2]刘勇.数字电路.电子工业出版社,2004.
[3]陈正振.电子电路设计与制作.广西交通职业技术学院信息工程系,2007.
[4]杨子文.单片机原理及应用.西安电子科技大学出版社,2006.
[5]王萍.电子技术实验教程.机械工业出版社,2009.
[6]沈红卫. 单片机应用系统设计实例与分析,北京:北京航空航天大学出版社.2003
[7]李光飞. 单片机课程设计实例指导,北京:北京航空航天大学出版社. 2004
[8]王法能. 单片机原理及应用,科学出版社. 2004
[9]楼然苗,李光飞.51系列单片机设计实例[M].北京航空航天大学出版社,2003.
[10]朱定华,戴汝平.单片微机原理与应用[M].清华大学出版社,2003.
[11]胡汉才. 单片机原理与接口技术[M].清华大学出版社,2004.
[12]余家春.Protel 99 SE电路设计实用教程[M].中国铁道出版社,2004.
[13]张培仁.基于汇编语言编程MCS-51单片机原理与应用.北京:清华大学出版社,2003.
[14]T.Someya ,J .Small ,P .Kim ,C .Nuckolls ,J .T .Yardley .Alcohol vapor sensors based on single-walled carbon nanotube field effect transistors[M].Nano Letters ,2003.
[15]M.Penza et al .Alcohol detection using carbon nanotubes acoustic and optical sensors[M].Applied Physics Letters,2004.
[16]F.Rettig ,R .Moos .Direct thermoelectric gas sensors Design aspects and first gas
sensors[M].Sens Actuators B,2007.
致谢
在河北交通学院的三年学习时间即将过去,三年时间并不算长,但对我而言,是磨砺青春、挥洒书生意气的三年,也是承受师恩、增长才干、提高学识的三年。我将以积极的面貌重新投入到火热的工作和事业中。在此,谨对培育我的母校、教导我的老师、帮助我的同学们致予最诚挚的谢意和敬意。
这次课程设计, 我一直很努力地去做, 过程中得到了老师的悉心指导和同学们大力支持和热心帮助,并对我的设计提出许多有益的建议,在此对他们表示衷心的感谢。同时也要感谢学校能给我这次机会去尝试自己设计一些东西,使自己所学专业知识与实践相结合。最后也要感谢有关我参考过的文献的作者,是他们为我提供知识的源泉,使我最终能顺利地完成这次课程设计。
在毕业之际,我衷心地同学和朋友们在以后的人生道路上越走越宽广,也深深相信在未来的日子里我们将一路携手前行,会遇到很多的碰撞和交流,我们将始终记得我们曾在广西工学院同窗学习,这将是我克服困难、不断前进的精神动力。
附录1:程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^4;//1602管脚定义
sbit lcdrs=P2^6;
sbit lcdws=P2^5;
sbit ds=P3^5;//ds18b20信号线
sbit beep=P2^3; //蜂鸣器管脚定义
sbit ACC_7 = ACC^7; //位寻址寄存器定义
sbit SCLK = P3^2; // DS1302时钟信号 sbit DIO= P3^3; // DS1302数据信号
sbit CE = P3^4; // DS1302片选 sbit key3=P1^0;//功能键定义
sbit key4=P1^1;//增大键定义
sbit key5=P1^2;//减小键定义
uchar shi,fen,miao,year,month,day,week;
uchar flag,s1num;
uint temp;
uint i;
uint d;
uchar code table2[]={0x20,0x20,0x2e,0x20,0xdf,0x43};
uchar code table[]="20 - - ";
uchar code table1[]=" : : ";
void delay(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
}
void write_com(uchar com)//1602写命令 for(y=110;y>0;y--); float f_temp;
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//1602写数据
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void dsreset(void) //DS18B20,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)//读1位数据函数
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;//i++起到延时作用
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void) //读一个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i
{
}
return(dat);
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数 {
uint i;
uchar j;
bit testb;
for(j=1;j
{
testb=dat&0x01; dat=dat>>1; if(testb)//写1 { } ds=0; i++;i++; ds=1; i=8;while(i>0)i--; j=tempreadbit(); dat=(j>1);
}
} else { } ds=0; //写0 i=8;while(i>0)i--; ds=1; i++;i++;
void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp() //获取温度
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读高8位
b=tempread(); //读低8位
temp=b;
temp
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05; //温度在寄存器中为12位,分辨率为0.0625^ return temp;
}
void display(uchar addr,uchar dat)
{
write_com(0x80+0x40+addr);
write_data(0x30+dat);
delay(5);
}
void dis_temp(uint t)
{
uchar i;
i=t/100;
display(10,i);
i=t%100/10;
display(11,i);
i=t%100%10;
display(13,i);
}
void init()//初始化程序
{
uchar num;
flag=1;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num
{ } write_data(table1[num]); delay(5);
write_com(0x80+0x40+10);
for(num=0;num
{
}
}
//地址、数据发送子程序
void write_1302( uchar addr,uchar dat )
{
uchar i,temp;
CE=0; //CE 引脚为低, 数据传送中止 SCLK=0; //清零时钟总线
CE = 1; //CE 引脚为高,逻辑控制有效 //发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0;
temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位
SCLK = 1;
}
//发送数据
for ( i=8; i>0; i-- )
{
SCLK = 0;
temp = dat;
DIO = (bit)(temp&0x01); write_data(table2[num]); delay(10);
dat >>= 1; SCLK = 1; }
CE = 0; }
//数据读取子程序
uchar Read1302 ( uchar addr ) {
unsigned char i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; //发送地址
for ( i=8; i>0; i-- ) // {
SCLK = 0; temp = addr;
DIO = (bit)(temp&0x01); // addr >>= 1; // SCLK = 1; }
//读取数据
for ( i=8; i>0; i-- ) {
ACC_7=DIO; SCLK = 1; ACC>>=1; SCLK = 0; } CE=0; dat1=ACC; dat2=dat1/16; // //十六进制转十进制
循环8次移位 每次传输低字节 右移一位数据进制转换
dat1=dat1%16; dat1=dat1+dat2*10; return (dat1); }
//初始化 DS1302
void Initial(void) //初始化1302 2010年09月30日23点58分56秒 星期一
{
write_1302 (0x8e,0x00); //允许写保护 write_1302 (0x80,0x56);
//秒位初始化
write_1302 (0x82,0x58); //分钟初始化 write_1302 (0x84,0x23); //小时初始化 write_1302 (0x86,0x30); //日初始化
write_1302 (0x88,0x09); //月初始化 write_1302 (0x8c,0x10); //年初始化 write_1302 (0x8a,0x01); //日期始化 write_1302 (0x8e,0x80); }
void di()//蜂鸣器响函数 {
beep=0; delay(100); beep=1; }
void write_sfm(uchar add,uchar date) {
uchar shi,ge; shi=date/10; ge=date%10;
write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge); }
//禁止写保护
void write_nyrz(uchar add,uchar date)//显示年,月,日,周 {
uchar shi,ge; shi=date/10; ge=date%10;
write_com(0x80+add); write_data(0x30+shi); write_data(0x30+ge); }
void display_week(uchar we) {
write_com(0x80+12); switch(we) {
case 1: write_data('M');delay(5);
write_data('O');delay(5); write_data('N'); break;
write_data('U');delay(5); write_data('E'); break;
write_data('E');delay(5); write_data('D'); break;
write_data('H');delay(5); write_data('U'); break;
write_data('R');delay(5); write_data('T');
case 2: write_data('T');delay(5);
case 3: write_data('W');delay(5);
case 4: write_data('T');delay(5);
case 5: write_data('F');delay(5);
}
write_data('A');delay(5); write_data('T'); break;
write_data('U');delay(5); write_data('N'); break;
case 6: write_data('S');delay(5);
case 7: write_data('S');delay(5);
}
void keyscan()//按键设置 {
if(key3==0)//功能键按下 {
flag=0; delay(5); if(key3==0) {
s1num++; while(!key3); di();
switch(s1num)//光标闪烁定位 {
case 1:write_com(0x80+0x40+7);//定位到秒的位置
write_com(0x0f); tempchange();
for(i=10;i>0;i--) { } break;
dis_temp(get_temp());
case 2:write_com(0x80+0x40+4);//定位到分的位置
}
}
break;
case 3:write_com(0x80+0x40+1);//定位到小时的位置
write_com(0x0f);
break;
case 4:write_com(0x80+0x0e);//定位到星期的位置
write_com(0x0f);
break;
case 5:write_com(0x80+0x9);//定位到日的位置
write_com(0x0f);
break;
case 6:write_com(0x80+0x6);//定位到月的位置
write_com(0x0f);
break;
case 7:write_com(0x80+0x3);//定位到年的位置
write_com(0x0f);
break;
write_com(0x0c); flag=1;
write_1302(0x8e,0x00);//允许写保护
write_1302(0x80,0x7f&miao);//将改变的值写入DS1302 break;
case 8: s1num=0;//复位,时钟走
}
if(s1num!=0)//只有功能键按下后,增大,增小建才有效 {
if(key4==0)//增大建 {
delay(5); if(key4==0) {
di();
switch(s1num) {
case 1: miao++;
if(miao==60)
miao=0;
write_sfm(6,miao);
//write_1302(write_second,miao); write_com(0x80+0x40+7); break;
case 2: fen++;
if(fen==60)
fen=0;
write_sfm(3,fen);
//write_1302(write_minute,fen); write_com(0x80+0x40+4); break;
case 3: shi++;
if(shi==24)
shi=0;
write_sfm(0,shi); write_com(0x80+0x40+1); break;
case 4: week++;
if(week==8)
week=1;
display_week(week); write_com(0x80+14); break;
case 5: day++;
if(day==31)
day=1;
}
}
}
write_com(0x80+9); break;
case 6: month++;
if(month==13)
month=1;
write_nyrz(5,month); write_com(0x80+6); break;
case 7: year++;
if(year==99)
year=0;
write_nyrz(2,year); write_com(0x80+3); break;
if(key5==0)//减小键 {
delay(5); if(key5==0) {
while(!key5); di();
switch(s1num) {
case 1: miao--;
if(miao==-1)
miao=59;
write_sfm(6,miao); write_com(0x80+0x40+7); break;
if(fen==-1)
fen=59;
write_sfm(3,fen); write_com(0x80+0x40+4); break;
case 3: shi--;
if(shi==-1)
shi=23;
write_sfm(0,shi); write_com(0x80+0x40+1); break;
case 4: week--;
if(week==-1)
week=7;
display_week(week); write_com(0x80+14); break;
case 5: day--;
if(day==0)
day=31;
write_nyrz(8,day); write_com(0x80+9); break;
case 6: month--;
if(month==0)
month=12;
write_nyrz(5,month); write_com(0x80+6); break;
case 7: year--;
if(year==-1)
year=99;
}
}
}
}
}
write_com(0x80+3); break;
void main()//主函数 {
Initial(); lcdws=0; init(); while(1) {
keyscan();//按键扫描 if(flag==1) { }
miao=Read1302(0x81);//显示秒 write_sfm(6,miao);
fen=Read1302(0x83);//显示分 write_sfm(3,fen);
shi=Read1302(0x85);//显示小时 write_sfm(0,shi);
day=Read1302(0x87);//显示日 write_nyrz(8,day);
month=Read1302(0x89);//显示月 write_nyrz(5,month);
year=Read1302(0x8d);//显示年 write_nyrz(2,year);
week=Read1302(0x8b);//显示日期 display_week(week);
}
{ }
tempchange(); for(i=10;i>0;i--) { }
dis_temp(get_temp());
write_1302(0x80,0x80);//时钟振荡器停止
}
本次设计的原理图
本次设计的原理图