单片机AT89S52液晶1602显示数字万年历.docx
- 文档编号:30411477
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:50
- 大小:1.68MB
单片机AT89S52液晶1602显示数字万年历.docx
《单片机AT89S52液晶1602显示数字万年历.docx》由会员分享,可在线阅读,更多相关《单片机AT89S52液晶1602显示数字万年历.docx(50页珍藏版)》请在冰豆网上搜索。
单片机AT89S52液晶1602显示数字万年历
摘要
电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。
本系统选用DALLAS公司生产的日历时钟芯片DS12C887来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有定时和时间校准等功能。
该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
本系统硬件部分由AT89S52单片机、DS12C887时钟芯片、1062液晶显环境下用C51语言编写,包括时间设置、时间显示、定时设置、定时闹钟、温度显示。
没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。
在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在老师和同学的帮助下才完成了程序部分的编写。
文章后附有电路原理图、程序清单,以供读者参考。
因水平有限,难免有疏落不足之处,敬请老师和同学能给与批评指正。
关键词:
时钟芯片DS12C887;温度采集DS18B20;单片机AT89S52;液晶显示1602
第一章概述
§1.1实时时钟研究的背景及意义
在现实我们生活中每个人都可能有自己的时钟,光阴在永不停息的流逝,有了时钟人们就能随着时间有计划的过着每一天。
然而现在绝大部分的时钟有的需要不断地跟换电池,有些时钟需要外接电源,如果一旦电池没电时钟日历芯片DS12C887就能解决这一问题。
该器件能提供实时时钟(RTC)/日历、定时闹钟。
少于31天的月份,月末日期可自动调整,其中包括闰年补偿。
该器件还可以工作于24小时货代/PM指示的12小时格式。
一个精密的温度补偿电路用来监视Vcc的状态。
如果检测到主电源故障,该器件可以自动振荡器和寄存器供电长达10年之久。
本时钟还具有环保、走时无噪音、低功耗等非实时时钟不具有的功能。
该实时时钟不但可以作为家用,而且更可以在公共场合使用,如车站、码头、商场等场所。
§1.2论文主要研究内容
1.2.1系统设计实现的目标
本文是以实时时钟芯片DS12C887和AT89S52单片机为主要研究对象,着重进以及运用18B20进行实时温度检测。
主要内容包括:
实时温度显示;
年月日星期时分秒显示;
年月日星期时分秒调整;
闹钟定时小时分钟和秒;
1.2.2系统的总体设计
采用AT89S52作为主控单片机,时钟模块选用DS12C887作为时钟芯片,温度模块选用DS18B20作为温度传感器,显示模块选用LCD1602,设置部分选用按键电路。
AT89S52与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33Hz、三级加密程序存储器、双数据指针、掉电标识符。
DS12C887实时时钟芯片功能丰富,可以用来直接代替IBMPC上的时钟日历芯片DS12887,同时,它的管脚也和MC146818B、DS12887相兼容。
由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887中一天内的时间记录,有12小时制和24小时制两种模式。
用户还可对
DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,可编程的分辨率为9~12位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
第二章硬件电路设计
§2.1单片机最小系统
本系统以AT89S52单片机为核心,本系统选用11.0592MHZ的晶振,,使得单片机有合理的运行速度。
起振电容30pF对振荡器的频率高键高电平复位。
AT89S52单片机最小系统电路设计如图2.1所示。
图2-1单片机最小系统
§2.2时钟芯片电路
2.2.1时钟芯片引脚介绍
时钟芯片DS12C887,其引脚分布图如下所示
图2-2时钟引脚分布
MOT(1脚):
总线时序模式选择脚。
接高电平,选择MOTOROLA总线时;序;接低电平或悬空,择选择INTEL总线时序。
NC(2,3,16,20,21,22脚):
悬空脚。
AD0~AD7(4~11脚):
地址/地址数据复用总线引脚。
CS(13脚):
片选脚,低电平有效。
AS(14脚):
地址锁存输入脚。
下降沿时,地址被锁存,紧接着的上升沿来时地址被清除。
R/W(15脚):
读/写输入脚。
在选择MOTOROLA总线时序模式时,此引脚用于指示当前的读写周期,高电平指示当前为读周期,低电平指示当前为写周期;选择INTEL中线时序模式时,能信号(/WE)
DS(17脚):
选择MOTOROLA总线时序模式时,此引脚为数据锁存脚;选择INTEL总线时序模式时,此引脚为读输入脚,低电平有效,相当于典型的内存的输出使能信号(/OE)
RESET(18脚):
复位脚,低电平有效,复位不会影响到时钟、日历和RAM。
IRQ(19脚):
中断申请输出脚,低电平有效,可作为微处理器的中断输入。
SQW(23脚):
方波信号输出脚。
可通过设置寄存器位SQWE关断此信器编程予以改变。
VCC(24脚):
+5v电源端。
2.2.2时钟芯片DS12C887,其内存空间介绍
图2-3时钟、日历和闹钟数据模式——BCD模式(DM=0)
图2-4时钟、日历和闹钟数据模式——二进制模式(DM=1)
2.2.34个控制寄存器介绍
DS12C887有4个控制寄存器,在任何时间都可以进行访问,即使处于更新周期。
寄存器A字节的内容如下。
MSBLSB
UIP
DV2
DV1
DV0
RS3
RS2
RS1
RS0
UIP:
更新标志位。
为只读位且不受复位操作的影响,为1时,表示即将发生的数据更新;为0时,表示至少244US不会更新数据。
当UIP为0时,可以获得所有时钟、日历、闹钟信息。
将寄存器B中的SET位置1可以限制任何
DV2、DV1、DV0:
此3位为010时将打开晶振,并开始计时。
RES3、RES2、RES1、RES0:
用于设置周期性中断产生的时间周期和输出方波的频率。
寄存器B字节的内容如下。
MSBLSB
SET
PIE
AIE
UIE
SQWE
DM
24/12
DSE
SET:
设置位,可读写,不受复位操作影响。
为0时,不处于设置状态,芯片进行正常时间数据更新;为1时,抑制数据更新,可以通过程序设定时间和日历信息。
PIE:
周期性中断使能位,可读写,复位时清除此位。
为1时,允许寄存器C中的周期中断标志位PF,驱动/IRQ引脚为低产生中断信号输出,中断信号产生的周期由RS3~RE0决定。
志位AF、闹钟发生时就会通过/IRQ引脚产生中断输出。
UIE:
数据更新结束中断使能位,可读写。
复位或者SET位为1时清除此位。
为1时允许寄存器C中的更新结束标志UF,更新结束时就会通过/IRQ引脚产生中断输出。
低电平;为1时,SQW引脚输出方波信号,其频率由RS3~RS0决定。
DM:
数据模式位,可读写,不受复位操作影响。
为0时,设置时间、日历信息为二进制数据;为1时,设置为BCD码数据。
为12小时模式;为1时,设置为24小时模式。
DSE:
为1时,会引起两次特殊的时间更新;4月的第一个星期日凌晨1:
59:
59会直接更新到3:
00:
00,10月的最后一个星期日凌晨1:
59:
59会直接更新到1:
00:
00;为0时,时间信息正常更新,此位可读写,不受复位操作影响。
寄存器C字节内容如下。
MSBLSB
IRQF
PF
AF
UF
0
0
0
0
IQRF:
中断申请标志位。
为1时,/IRQ引脚为低,产生中断申请。
当PF、PIE为1时或者AF、ATE为1或者UF、UIE为1时,此位为1,否则置0.
PF:
中期中断标志位。
为1时,它是只读位,和PIE位状态无关,由复位操作或者寄存器C操作清除。
AF:
闹钟中断标志位。
为1时,表示当前时间和闹钟设定时间一至,由复位操作或读寄存器C操作清除。
UF:
数据更新结束中断标志位。
每个更新周期后此位都会置1,当UIE位位置1时,UF若为1就会引起IRQF置1,将驱动/IRQ引脚为低电平,申请中
寄存器D字节的内容如下。
MSBLSB
0
0
0
0
0
0
0
0
VRT;RAM和时间有效位。
用于指示和VBAT引脚连接的电池状态。
此位不可写,也不受操作为影响,正常情况下读取时总去为1,如果出现读取为0的情况,则表示电池耗尽,时间数据和RAM中的数据就会出现问题。
专门用于某些特别功能,而是可以在未处理器程序中作为非易失性内存空间使用。
§2.4温度采集电路设计
2.4.1DS18B20的主要特性
适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电。
②独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
③DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温④DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
⑥可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
⑦在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最⑧测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
⑨负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.4.2DS1820的基本操作指令
DS1820的操作指令分为ROM操作命令和存储器操作命令。
(1)、ROM操作命令及其含义
ReadROM指令代码(33h):
如果只有一片DS1820,可用此命令读出其序列号,若在线DS1820多于一个,将发生冲突。
MatchROM指令代码(55h):
多个DS1820在线时,可用此命令匹配一个给定序列号的DS1820,此后的命令就针对该DS1820。
所有DS1820。
SearchROM指令代码(F0h):
用以读出在线的DS1820的序列号。
AlarmSearch指令代码(ECh):
当温度值高于TH或低于TL中的数值
(2)、存储器操作指令代码及其含义
WriteScratchpad指令代码(4Eh):
写两个字节的数据到温度寄存器。
ReadScratchpad指令代码(BEh):
读取温度寄存器的温度值。
CopyScratchpad指令代码(48h):
将温度寄存器的数值拷贝到EERAM中,保证温度值不丢失。
ConvertT指令代码(44h):
启动在线DS1280做温度A/D转换。
RecallE2指令代码(B8h):
将EERAM中的数值拷贝到温度寄存器中。
ReadPowerSupply指令代码(B4h):
在本命令送到DS1280之后的每一个读数据间隙,指出电源模式:
“0”为寄生电源;“1”为外部电源。
2.4.3温度测量的步骤
(1).ReadROM(33 h),每次对DS1820进行操作之前都要对它进行初始化,主要目的在于确定传感器已经连接到单总线上。
(2).SearchROM(F0h),这条指令使处理器用排除的方法去辨别总线上的DS1820。
响应其后的指令,当然,单点测温时可以使用Skip ROM(CCh)指令来跳过这一步。
时温度转换完成。
(5).ReadScratchpad(BEh),将读指令发出后,就可从总线上读得表示温度的2字节二进制数。
2.4.4DS18B20的操作时序
由于采用单总线数据传输方式,DS18B20的数据I/O均由同一条线完成,因此,对读写的操作时序要求严格。
它的各种时序如图2-5所示
图2-5DS18B20的操作时序
为了保证DS18B20的严格I/O时序。
需要做较精确的延时。
在DS18B20操作中,用到的延时有15μS,90μS,270μS,540μS等。
因这些延时均为15μS的整倍,因此在程序中可以编写一个以15μS为基准的延时函数。
图2-6温度采集电路
§2.51602LCD液晶显示屏
2.5.11602字符型LCD简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本设计采用16列*2行的字符型LCD1602带背光的液晶显示屏。
1602LCD主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
2.5.21602引脚功能说明
各引脚接口说明如表所示:
表2-1
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
表2-1:
引脚接口说明:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
2.5.31602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表2-2所示:
表2-2
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
表2-2字符控制命令说明:
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
芯片时序表如下:
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
表2-3
基本操作时序表
读写操作时序如图2-7和2-8所示:
图2-7读操作时序
图2-8写操作时序
2.5.41602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认入显示字符地址,也就是告诉模块在哪里显示字符,图2-9是1602的内部显示地址。
图2-9液晶内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?
这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
是自动右移的,无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
图2-10字符代码与图形对应图
2.5.51602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
2.4.61602LCD的电路连接
液晶5端为读/写选择端,因为我们不从液晶中读取数据,只向其写入命能信号,是操作时必须的信号。
其电路如图2-11所示:
图2-111602的电路连接
§2.6蜂鸣器闹铃电路
当单片机给蜂鸣器一个低电平时,三极管导通驱动蜂鸣器发出声音作为定时闹铃,其电路图如图2-12所示:
图2-12蜂鸣器连接电路
§2.7按键调整电路
系统四个独立键盘均采用查询方式,S2用于设置年、月、日、时、分、秒、星期的数值加,以及闹钟开,S3用于设置年、月、日、时、分、秒、星其电路图如2-13所示:
图2-13按键电路连接
§2.8电源模块
电子钟的电源为5伏直流电源,本设计中我使用的是5V的充电电池,电源模块的原理图如图2-15所示:
图2-14电源模块
第三章软件部分设计
本系统主要包括五个模块编程:
蜂鸣器闹铃响编程
时钟芯片12C887的编
液晶显示屏1602的编程
按键编程
DS18B20温度采集编程
§3.1主程序流程
主程序开始初始化,并打开中断,然后执行扫描闹钟、键盘及读取18B20值。
当有S1键按下时,执行时钟设置,当有S4键按下时,则进入闹钟设置,无论是时钟还是闹钟,设置完后退出,温度、时钟恢复实时显示。
主程序流程图如图3-1所示:
图3-1主程序流程图
§3.2时间设置子程序流程
通过单片机判断S1按下的次数来设置,由s1num标志位来记录次数,用if语句判断执行命令。
系统程序不断扫面键盘,当s1键按下后产生一个低电时间,同时为读取数据作准备。
当s1=1时进入秒的设置,地址指针指向miao显示位置处,通过两个if语句分别循环控制显示秒数的加和减。
当s1=2时,shi显示位置处,变量最大值设为23。
当s1=4时,地址指针指向week显示位置处,最大值设为7,1至7分别用MON、TUE、WED、THU、FRI、SAT、SUN字指向day显示位置,变量最大值为31。
当s1=6时,地址指针指向month显示位置,变量最大值为12。
当s1=7时,地址指针指向year显示位置,最大值为99。
图3-2时间设置流程图
§3.3闹钟设置子程序流程
时间设置程序流程图如图3-3所示。
在开始时间设置之前程序会关闭全局中断,直至设置结束,中断又会重新开启,进入计时状态。
闹钟的设置时通过S1键的按下次数来判断的。
当单片机检测到S4键按下一次时则进入闹钟设置界面,光标并自动跳到秒设置位置,可以对秒进行设置,当S1键依次按下1、2、3次时,则分别进入闹钟的秒、分、时关的设置。
:
图3-3闹钟设置流程图
§3.4程序设计问题
3.4.1按键抖动问题
按键在按下时因为机械原因会产生抖动,抖动的后果就是当按下一次按键时因为抖动的原因让系统读取到多次的按键按下的次数,由此导致设置时出现错误。
解决的方法如下:
当按键按下时读取按键键值,若5ms后键值和按下是相等,则确认为有效按键,以此消除按键抖动带来的问题。
3.4.2蜂鸣器设置
蜂鸣器报警时,设置响100毫秒,停100毫秒,循环响应,产生滴滴的声音。
3.4.3液晶显示的设置
初始化设置
显示模式设置
写入指令码write_com(0x38),设置功能16*2显示,5*7点阵,8位数据接口
显示/开关及光标设置
写入指令码write_com(0x0c),设置开显示,不显示光标,光标不闪烁。
写入指令码write_com(0x06),设置当读或写一个字符后地址指针加一,且光标加一。
当写一个字符,整屏显示不移动。
显示清屏,写入指令码write_com(0x01)。
写入指令码函数write_com()写指令过程:
输入:
rs=0,D0-D7=指令码,E=高脉冲
写入数据函数write_date()写指令过程:
输入:
rs=1,D0-D7=数据,E=高脉冲
写入指令和数据时rw端已经接地。
数据指针设置指令码80H+地址码(0-27H)显示第一行的字符
指令码80H+地址码(40H-67H)显示的第二行字符
3.4.4中断设置
EA=1;//打开总中断
EX1=1;//打开外部中断
IT1=1;//设置负跳变沿触发中断
当闹钟到点时响应外部中1时间到时IRQ端从
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 AT89S52 液晶 1602 显示 数字 万年历