基于AT89C51电子万年历的设计与仿真设计方案Word文档格式.docx
《基于AT89C51电子万年历的设计与仿真设计方案Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C51电子万年历的设计与仿真设计方案Word文档格式.docx(45页珍藏版)》请在冰豆网上搜索。
由于AT89C51单片机片有4K字节的在线编程Flash存储器,可以擦写1000次,具有掉电模式,而且具有掉电状态下的中断恢复功能,对设计开发非常实用。
从这三种电路设计方案的比较而言,利用单片微型计算机及外围电路编写软件程序来设计万年历,简单灵活,而且可扩展各种功能,能完全达到设计要求,体现了现代计算机工具的方便、简捷、准确性。
综上所述,选用AT89C51单片机作为电子万年历芯片的控制单片机。
2.显示模块选择方案和论证
方案一:
采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高。
采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍。
采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,对于电子万年历而言,一个1602的液晶屏即可,价格也还能接受,需要的接口线较多,但会给调试带来诸多方便。
本次电子万年历设计需要显示的参数多,数码管需要的数量较多,综合性价比,所以采用了LCD液晶显示屏。
3.时钟芯片的选择方案和论证
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。
采用DS1302时钟芯片实现时钟,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768kHz晶振。
本次设计在时间显示方面需要尽可能的减少误差,与现实时间同步,所以在时钟方面选用了DS1302芯片。
4.温度传感器的选择方案与论证
使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。
此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。
采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。
另外,数字式温度传感器还具有测量精度高、测量围广等优点。
本设计为尽可能的减少误差,所以采用DS18B20温度传感器作为温度采集模块。
5.电路设计最终方案决定
综上各模块的选择方案与论证,确定最后的主要硬件资源如下:
采用AT89C51作为主控制系统;
DS1302提供时钟;
DS18B20作为数字式温度传感器;
LCD1602液晶屏作为显示。
2.2系统设计结构图
根据系统设计的要求和设计思路,确定该系统的系统设计结构图。
如图2-1所示。
硬件电路主要由主控制器、键盘控制模块、温度传采集模块、DS1302时钟模块、液晶显示模块构成。
图2-1系统结构设计图
第三章硬件设计
3.1系统硬件概述
本电路是由AT89C51单片机作为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;
时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒等进行计时,具有闰年补偿功能,工作电压为2.5V-5.5V。
DS1302部有一个用于临时存放数据的RAM寄存器。
可产生年、月、日、时、分、秒等,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;
温度的采集由DS18B20构成,显示部分为LCD液晶显示屏,能够实现字符与数字同时显示的功能。
3.2系统的模块电路设计
3.2.1单片机最小应用系统电路
单片机系统是整个硬件系统的核心,它即协调整机工作,又是数据处理器,是软硬件系统连接的桥梁,AT89C51是一个低电压,高性能CMOS8位单片机带有4K字节的可反复擦写的程序存储器〔PENROM和128字节的存取数据存储器〔RAM,这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。
片含有8位中央处理器和闪烁存储单元,有较强的功能的AT89C51单片机能够被应用到控制领域中。
因此,我们选用AT89C51单片机来满足我们程序的要求。
单片机最小应用系统电路包括以下的两个部分:
时钟电路和复位电路。
如图3-1所示。
1、时钟电路
单片机的时钟信号用来提供单片机片各种微操作的时间基准,时钟信号通常用两种电路形式得到:
部振荡和外部振荡。
MCS-51单片机部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是此放大电器的输入端和输出端,由于采用部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式。
2、复位电路
为了初始化单片机部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。
单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位,但如果RST引脚上持续为高电平,单片机就处于循环复位状态。
复位后系统将输入/输出<
1/0>
端口寄存器置为FFH,堆栈指针SP置为07H,SBUF置为不定值,其余的寄存器全部清0,部RAM的状态不受复位的影响,在系统上电时RAM的容是不定的。
复位操作有两种情况,即上电复位和手动<
开关>
复位。
本系统采用上电复位方式。
图3-1单片机最小应用系统电路
3.2.2DS1302时钟模块设计
1.DS1302性能特性介绍
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电〔主电源和备用电源,可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
2.DS1302引脚介绍
图3-2DS1302实物图
实物图如图3-2所示,各引脚的功能为:
8脚Vcc1:
备用电池端;
1脚Vcc2:
5V电源。
当Vcc2>
Vcc1+0.2V时,
由Vcc2向DS1302供电,当Vcc2<
Vcc1时,
由Vcc1向DS1302供电。
7脚SCLK:
串行时钟,输入;
6脚I/O:
数据输入输出口;
5脚CE/RST:
复位脚
2脚3脚:
X1、X2是外接晶振脚〔32.768KHZ的晶振
4脚地〔GND
3.电路原理
①时钟芯片DS1302的工作原理:
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时,时钟开始运行。
WP"
是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。
当"
为1时,写保护位防止对任一寄存器的写操作。
②DS1302的控制字节
DS1302的控制字如表-1所示。
控制字节的高有效位〔位7必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;
最低有效位〔位0如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
表3-1DS1302的控制字格式
1
RAM
/CK
A4
A3
A2
A1
A0
RD
/WR
③数据输入输出〔I/O
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
如下图3-3所示。
图3-3DS1302读/写时序图
DS1302与CPU的连接需要三条线,即SCLK<
7>
、I/O<
6>
、RST<
5>
实际上,在调试程序时可以不加电容器,只加一个晶振即可。
如图3-4所示。
图3-4DS1302与单片机的接线图
3.2.3温度采集模块
1.DS18B202性能特性介绍
本设计中在温度模块中采用的是DS18B20温度传感器。
DS18B20是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。
独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压围为3.0V至5.5V无需备用电源测量温度围为-55度至+125度。
-10度至+85度围精度为±
0.5度温度传感器可编程的分辨率为9~12位。
表3-2DS18B20详细引脚功能描述
序号
名称
引脚功能描述
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VCC
电源,输入电压为3~5.5V
图3-5DS18B20实物图
3.DS18B20温度数据对应关系
DS18B20是单总线接口的数字温度传感器,MSC-51通过串口将数据和指令写入或读出。
该芯片的温度测量围是﹣55℃~﹢125℃,转换完的数据通过两字节输出,对应关系如下表所示:
表3-3温度与两字节数据对应关系
温度
数字输出
〔二进制
数字输入
〔十六进制
+125℃
000001111101
0000
07D0H
85℃
0000010101010000
0550H
+25.0625℃
0000000110010001
0191H
+10.125℃
0000000010100010
00A2H
+0.5℃
0000000000001000
0008H
0℃
0000000000000000
0000H
-0.5℃
1111111111111000
FFF8H
-10.125℃
1111111101011110
FF5EH
-25.0625℃
1111111001101111
FF6FH
-55℃
1111110010010000
FC90H
4.DS18B20的测温原理
图3-6DS18B20的测温原理
传感器数据采集电路主要指DS18B20温度传感器与单片机的接口电路。
此电路连接简单,DS18B20采用电源供电方式,如图3-7所示,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源,I/O口接单片P0.3口。
图3-7DS18B20温度传感器数据采集电路
3.2.4独立式键盘设计
实现键盘控制的方法有多种,它可以用FPGA来进行控制,也可以用单片机来进行控制。
在本系统中我们采用了单片机来进行控制,因为单片机可以很好的解决键抖动。
由若干个按键组成一个键盘,其电路结构可分为独立式键盘和矩阵式键盘两种。
独立式键盘每个键单独占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他I/O口线上的状态,矩阵式键盘按键排列为行列式矩阵结构,也称行列式键盘结构。
4行4列共16个键,只占用8根I/O口线,键数目较多,可节省口线。
本设计采用的是独立式键盘。
键盘的工作方式可分为编程控制方式和中断控制方式。
CPU在一个工作周期,利用完成其他任务的空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;
若有键操作,则进而判断是哪个键,并执行相应的键处理程序。
这种方式为编程扫描方式。
由于单片机在正常应用过程中可能会经常进行键操作,因而编程控制方式使CPU经常处于工作状态,在进行本次设计中,只涉及到了切换、设置、上调、下调、闹钟五个功能。
因此采用独立式键盘。
如下图3-8所示。
图3-8按键的设计
3.2.5显示模块的设计
本设计中由于要对时间、温度进行显示所以选择液晶显示屏1602模块作为输出。
如图3-9所示。
图3-9LCD1602实物图
1.LCD1602主要技术参数
①显示容量:
16×
2个字符
②芯片工作电压:
4.5—5.5V
③工作电流:
2.0mA<
5.0V>
④模块最佳工作电压:
5.0V
⑤字符尺寸:
2.95×
4.35<
W×
H>
mm
2.引脚功能说明
LCD1602采用标准的14脚〔无背光或16脚〔带背光接口,各引脚接口说明如下表所示。
表3-4引脚接口说明
编号
符号
引脚说明
VSS
电源地
9
D2
数据
VDD
电源正极
10
D3
VL
液晶显示偏压
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
LCD1602主要管脚介绍:
V0为液晶显示器对比度调整端,接正电源时对比度
最弱,接地电源时对比度最高,对比度过高时会产生鬼影使用时可以通过一个
10K的电位器调整对比度。
RS为寄存器选择端,高电平时选择数据寄存器,低电
平时选择指令寄存器。
R/W为读写信号线端,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址;
当RS为高电平R/W为低电平时可以写入数据。
E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
将LCD1602的RS端和P0.0,R/W端和P0.1,E端和P0.2相连,当RS=0时,对LCD1602写入指令;
当RS=1时,对LCD1602写入数据。
当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。
当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。
图3-10为1602液晶显示屏与单片机的硬件连接图。
图3-101602液晶显示屏与单片机的硬件连接图
3.3总硬件设计
本章主要介绍了系统硬件设计,其中对时钟芯片DS1302、1602液晶显示屏、DS18B20温度传感器和AT89C51最小系统的设计做了详细阐述。
此外还介绍了各模块和单片机的连接方法、其特性及电路原理最后确定系统的整体硬件设计方案。
图3-11总硬件设计电路图
第四章软件设计
4.1软件设计方案
软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。
因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C51编写。
电子万年历的程序主要包括3个方面的容:
一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间和温度的调整,三是LCD从单片机中读取数据显示时间和温度。
4.2各模块分析
1.主函数
主函数是整个程序运行的开始,主函数的容并不复杂,就是不断的循环调用子函数,把各个子函数的功能均实现,最后主函数实现的功能就是我们设计、万年历的要求和目的。
主程序流程图如下图4-1所示。
由于LCD1602,DS18B20,DS1302的数据读取及指令写入函数均已在各自的头文件中完成,在主程序中只须引用即可。
主函数是软件设计的核心,它是把各个模块函数连接起来的桥梁。
把各个功能通过模块在主函数里实现。
图4-1主程序流程图
流程图分析:
首先系统初始化,系统开始运行,当有设置键按下时进入修改时间模式,无按键按下时读取时间、温度等数据送入液晶屏显示;
在修改时间模式下设置时间完成后再送数据到液晶屏显示。
2.DS1302时钟模块
时钟流程图如图4-2所示。
DS1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片的数据送入液晶屏显示。
这时若有设置键按下时,进行时间修改,完成后将数据送入时钟芯片;
若没有按键按下,则直接存入EPROM,送入液晶屏显示。
图4-2时钟流程图
3.温度采集模块
温度采集流程图如图4-3所示。
开始进入初始化DS18B20,就是通过主线拉低单线产生复位脉冲然后释放该线,如果有应答脉冲,即发起ROM命令,当成功的执行操作命令后,就开始进行温度转换,当转换完成后又开始初始化DS18B20是否有应答脉冲,若有就发起命令,即能同时读出数据。
图4-3温度采集流程图
4.LCD显示模块
显示程序流程图如图4-4。
首先对1602显示屏进行初始化〔初始化大约持续10ms左右,然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;
若BF=1,则代表模块正在进行部操作,不接受任何外部指令和数据,直到BF=0为止。
图4-4显示程序流程图
3.键盘模块
键盘模块流程图如图4-5。
在这里采用是独立式按键,按键扫描其实很简单,也就是按键消抖,只需三步,一步是判断按键按下,是哪个按键按下;
二步是延时,大约10MS左右就可以了,三步是检测是否还是刚才按键按下。
按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1;
如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;
如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;
如果没有按下,就把时间显示出来。
判断有键按下的标志为:
读取的键值取反后不全为0,if<
test<
>
>
而判断按键是否释放的标志是:
读取的键值取反后为0。
图4-5键盘模块流程图
值得注意的是,软件延时去抖动这一步不要省略,否则对按键的判断可能会产生误判断。
在使用动态扫描显示的程序中,一般采用动态扫描显示程序作为去抖动的延时。
如图4-6所示。
图4-6按键抖动信号波形
第五章系统调试
本系统已符合设计课程基本要求,即可用LCD1602液晶显示屏显示年、月、日、时、分、秒以及温度等信息;
可使用按键开关可实现时间和日期的调整。
系统调试分为硬件调试、软件调试和软硬件联调。
调试时按模块调试,各模块逐个调试通过后再联调。
5.1硬件调试
〔1按键调试
对于按键电路我们在PROTEUS上先进行了仿真,仿真图如图5-1所示,通过给按键电路一段简单的程序,去测试按键电路是否正常。
程序如下:
#include<
reg51.h>
sbitks=P3^0;
voiddelay<
void>
;
voidleft<
voidmain<
{unsignedchari,t;
P3=0xff;
while<
1>
{if<
ks==0>
{for<
i=0;
i<
250;
i++>
for<
t=0;
t<
5;
t++>
if<