电子万年历设计报告.docx
《电子万年历设计报告.docx》由会员分享,可在线阅读,更多相关《电子万年历设计报告.docx(43页珍藏版)》请在冰点文库上搜索。
电子万年历设计报告
《单片机原理及应用》
课程设计说明书
设计题目:
基于单片机的电子万年历的设计
学院:
工学院
专业:
电气工程及其自动化
(1)班
设计者:
宋将年海龙
学号:
0917700909177010
指导老师:
周平
设计时间:
2012年5月21日~2012年6月2日
基于单片机的电子万年历系统的设计
作者:
宋将年海龙指导老师:
周平
(安徽农业大学工学院电气工程及自动化)
摘要:
该设计是基于AT89C52单片机的电子万年历系统,采用LCD1602液晶屏实现显示。
显示年月日星期温度等,双行显示,。
显示年、月、日、星期、时间,可设置,=显示环境温度,检测范围为-55℃~+125℃,精度为±0.5℃。
设置功能。
综上所述此时钟具有读取方便、显示直观、功能多样、电路简洁、等优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
关键词:
万年历系统单片机时钟电路液晶显示模块
1引言
本设计实现一个超级时钟,可以利用DS1302读取日期及时间、DS18B20读取环境温度并传至AT89C52,使之显示于LCD1602液晶显示屏上。
LCD1602可以显示年月日、时分秒星期、。
蜂鸣器可以实现按键音。
设有四个按键,可以进入设置菜单对时钟钟进行设置,,按键可以控制的内容包括年月日的修改,星期的修改,时分秒的修改。
2总体设计方案
2.1设计原理及相关说明
设计原理:
利用DS1302读取系统中的日期以及时间信息,利用DS18B20读取环境温度,并分别利用P1.1端口和P3.3端口将相关信息传送至AT89S52主芯片之中,利用P0端口使之显示于LCD1602液晶显示屏上,四个按键分别置于P1口的5、6、7端口可以对时间进行控制修改。
详细请参阅第三节的芯片介绍。
2.2总体设计框图
日历时钟系统设计框图如图1所示:
图1电子万年历系统设计框图
3各芯片的设计及其调用
3.1AT89C52单片机主控模块
AT89C52为8位通用微处理器,采用工业标准的C51内核,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
由图2可知,单片机的18和19管脚接时钟电路,19管脚接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,18管脚接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,9引脚是复位输入端,接上电容、电阻及开关后构成上电复位电路。
图2主控制器AT89C52
3.2DS1302时钟模块
图3DS1302时钟模块
现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。
这些电路的接口简单、价格低廉、使用方便,被广泛地采用。
本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768kHz晶振。
3.2.1DS1302的结构及工作原理
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
3.2.2引脚功能及结构
图4示出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.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向)。
SCLK始终是输入端。
图4DS1302的管脚图
3.2.3DS1302的控制字节
DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
3.2.4数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
3.2.5DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
表1日历、时间寄存器及其控制字
寄存器名称
命令字
取值范围
各位内容
写操作
读操作
76543210
秒寄存器
80H
81H
00-59
CH10SECSEC
分寄存器
82H
83H
00-59
010MINMIN
时寄存器
84H
85H
01-12
12/24010HRHR
日寄存器
86H
87H
00-23
0010DATEDATE
月寄存器
88H
89H
01-28.29
00010MMONTH
周寄存器
8AH
8BH
30.31
00000DAY
年寄存器
8CH
8DH
01-12
10YEARYEAR
3.3DS18B20温度传感器模块
图5DS18B20温度传感器模块
3.3.1DS18B20的主要特性
●适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
●在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
●测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
●负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作
3.3.2DS18B20的外形和内部结构
图6DS18B20外部结构
DS18B20外部结构如图6,本设计采用PR-35封装,各引脚定义如下:
●DQ为数字信号输入/输出端;
●GND为电源地;
●VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
图7DS18B20内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
3.3.3DS18B20工作原理
图8DS18B20测温原理框图
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图8所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图8中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
3.4LCD1602液晶显示模块
液晶显示模块
3.4.2引脚及接口说明
1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
1602LCD的特性
+5V电压,对比度可调 内含复位电路 提供各种控制命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM 内建有192个5X7点阵的字型的字符发生器CGROM 8个可由用户自定义的5X7的字符发生器CGRAM
1602LCD特征及应用
微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。
3.5蜂鸣器
图12蜂鸣器模块
本设计采用的是无源蜂鸣器如下图:
图13无源蜂鸣器
3.6键盘接口
键盘接口电路如图,本次设计中,按键有3个,每个按键各占用一根I/O线,各按键相互独立,彼此的工作状态互不影响,用查询法完成按键功能。
图1键盘接口电路
4系统软件设计
4.1时间程序
因为使用了时钟芯片DS1302,阳历程序只需从DS1302各个寄存器中读出年、月、日、时、分、秒等数据,在处理即可。
在首次对DS1302进行操作之前,必须对它进行初始化,然后从DS1302中读出数据,在经过处理后,送给显示单元,程序流程图如图:
4.2时间调整程序
调整时间用3个调整按钮,一个作为移位、另外两个做调整用,时间调整程序流程图下图:
图时间程序流程图
5调试
5.1调试步骤
调试分为硬件调试和软件调试。
硬件调试主要是检查硬件电路是否有短路、断路和虚焊等,首先接上电源,电源的指示灯亮了之后,检测一下单片机的电源脚有没有电源输入,如果有这说明焊接无误,然后可以用万用表检查各个元器件的管脚之间的焊接,检查过程中需要细心和耐心。
硬件调试无误后,进行软件调试。
软件调试可以针对子程序调试,测试其是否正常工作,例如DS1302的计时/写程序、显示程序等,然后调试时间调整程序和阴历推算程序,最后把所有的程序作为一个整体来测试。
5.2性能分析
将程序烧入单片机后,在proteus软件中进行仿真。
在这次电子万年历的设计中,DS1302上最好选用专用的晶振。
经过测试制作完成后的电子万年历,只有部分功能实现,它能显示年、月、日等,但显示不稳定,设计中硬件或软件有待修正。
结论
本设计硬件电路较简单,所用器件较少,电路中使用了AT89S52单片机、DS1302时钟芯片、LCD1602液晶显示器等主要芯片,实现了预计功能。
在对芯片的管脚功能和用法有充分的了解后,根据设计要求设计硬件电路,包括单片机控制电路、时钟电路、存储电路、键盘扫描电路、显示电路和闹铃电路。
然后通过软件编程,实现了对年、月、日、时、分、秒、星期的自动调整,用按键进行控制,用液晶模块进行显示。
电子万年历可以正常显示时间并进行时间调整,基本完成了预期要实现的目标。
参考文献
[1]吴金戌,沈庆阳.8051单片机实践与应用,北京:
清华大学出版社,2003.12,26-38.
[2]何立民.单片机应用文集,北京:
北京航空航天大学出版社,1991,53-72.
[3]公茂法.单片机人机接口实例集,北京:
北京航空航天大学出版社,1998.2,32-59.
[4]何立明.单片机高级教程——应用与设计,北京:
北京航天航空大学出版社,2000.4,149-173.
[5]李广弟,朱月秀.单片机基础,北京:
北京航空航天大学出版社,2001.8,36-85.
[6]楼然苗,李光飞.MCS-51系列单片机设计实例,北京:
北京航天航空大学出版社,2001.3,75-83.
[7]李华.单片机原理与接口技术,北京:
清华大学出版社,33-80.
[8]王伟.高性能、低功耗带RAM实时时钟芯片DS1302(上),电子世界:
第一期,
1995,26-35.
[9]王伟.高性能、低功耗带RAM实时时钟芯片DS1302(下),电子世界:
第四期,1995,32-41.
[10]刘光潭.中外集成电路简明速察手册,上海:
电子工业出版社,1991.
[11]一九九九年产品目录(第一期),武汉力源股份有限公司,1999.
[12]刘利.液晶显示原理,上海:
电子工业出版社,2002.5,52-70.
[13]李宏,张家田.液晶显示器件应用技术,北京:
机械工业出版社,2004,156-183.
[14]沈庆阳.汉字显示应用技术,上海:
电子工业出版社,2002.3,128-139.
致谢
不知不觉,两周的设计结束了。
首先我要感谢我的指导老师周平的大力帮助和支持。
在我完成毕业设计的过程中提供了很多指导性的意见,使我受益匪浅。
在此,我衷心感谢周老师给予我的帮助和教育。
附录1系统电路原理图
附录四:
实物图
附录2系统程序清单
/*******************************************************************************************
#include
#include"DS18B20_3.H"
#defineuintunsignedint
#defineucharunsignedchar
uchara,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
//flag用于读取头文件中的温度值,和显示温度值
#defineyh0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbitrs=P2^0;
sbiten=P2^2;
sbitrw=P2^1;//如果硬件上rw接地,就不用写这句和后面的rw=0了
sbitled=P2^6;//LCD背光开关
//DS1302时钟芯片与C51之间的引脚连接定义
sbitIO=P1^1;
sbitSCLK=P1^0;
sbitRST=P1^2;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
/************************************************************
ACC累加器=A
ACC.0=E0H
ACC.0就是ACC的第0位。
Acc可以位寻址。
累加器ACC是一个8位的存储单元,是用来放数据的。
但是,这个存储单元有其特殊的地位,
是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。
以后在学习指令时,
常用A来表示累加器。
但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
***************************************************************/
//校时按键与C51的引脚连接定义
sbitkey1=P1^5;//设置键
sbitkey2=P1^6;//加键
sbitkey3=P1^7;//减键
sbitbuzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响
/**************************************************************/
ucharcodetab1[]={"20--"};//年显示的固定字符
ucharcodetab2[]={":
:
"};//时间显示的固定字符
//延时函数,后面经常调用
voiddelay(uintxms)//延时函数,有参函数
{
uintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/********液晶写入指令函数与写入数据函数,以后可调用**************/
/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/
write_1602com(ucharcom)//****液晶写入指令函数****
{
rs=0;//数据/指令选择置为指令
rw=0;//读写选择置为写
P0=com;//送入数据
delay
(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay
(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
write_1602dat(uchardat)//***液晶写入数据函数****
{
rs=1;//数据/指令选择置为数据
rw=0;//读写选择置为写
P0=dat;//送入数据
delay
(1);
en=1;//en置高电平,为制造下降沿做准备
delay
(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
lcd_init()//***液晶初始化函数****
{
write_1602com(0x38);//设置液晶工作模式,意思:
16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示
write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
//delay(3);
}
write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
//delay(3);
}
}
/*********************over***********************/
/***************DS1302有关子函数********************/
voidwrite_byte(uchardat)//写一个字节
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
ucharread_byte()//读一个字节
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return(ACC);
}
//----------------------------------------
voidwrite_1302(ucharadd,uchardat)//向1302芯片写函数,指定写入地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
ucharread_1302(ucharadd)//从1302读数据函数,指定读取数据来源地址
{
uchartemp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
ucharBCD_Decimal(ucharbcd)//BCD码转十进制函数,输入BCD,返回十进制
{
ucharDecimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(b