基于STC89C52液晶显示数字万年历设计报告.docx
《基于STC89C52液晶显示数字万年历设计报告.docx》由会员分享,可在线阅读,更多相关《基于STC89C52液晶显示数字万年历设计报告.docx(26页珍藏版)》请在冰点文库上搜索。
基于STC89C52液晶显示数字万年历设计报告
西安邮电学院
开放实验设计报告
系部名称
电子与信息工程系
学生姓名
专业名称
电子与信息工程
班级
实习时间
基于STC89C52液晶显示数字万年历
1.引言
在51单片机应用系统中,常常需要记录实时的时间信息。
比如,在数据采集时,对默写重要的事件常常需要记录下准确的发生事件;又比如在银行营业大厅中使用的利率或汇率显示屏,上面除了显示利率或者汇率等数据外,还需要显示实时的时间信息,其中包括年,月,日,星期,时间等。
下面我们利用STC89C52和液晶显示器LCD1602和实时时钟芯片DS1302来实现实时时钟并利用液晶显示器进行显示。
1.单片机STC89C52
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
STC89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
8位微控制器8K字节在系统可编程Flash。
2.实时时钟芯片DS1302
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
带有IIC总线接口,便于同单片机进行通信。
外接32.768KHZ晶振,可实现年误差小于2分钟。
3.液晶显示模块LCD1602
LCD1602液晶显示模块是由字符型液晶显示屏(LCD),控制驱动主电路HD44780及其扩展驱动电路HD44100或与其兼容的IC,少量阻,容元件,结构件等装配在PCB板上而成。
它可以显示2行字符,每行16个字符。
2.所用硬件和软件系统的介绍,实施方案
数字时钟芯片DS1302
1.数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
2.DS1302的控制字节
DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
3.DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字如下。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作。
器。
日历、时间寄存器及控制字如表1所示:
寄存器名称
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
表1:
日历、时钟寄存器与控制字对照表
最后一位RD/W为“0”时表示进行写操作,为“1”时表示读操作。
DS1302内部寄存器列表如表2所示:
寄存器名称
命令字
取值范围
各位内容
写
读
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
表2:
DS14302内部主要寄存器分布表
4.DS1302与MCU的连接
DS1302与CPU的连接采用IIC总线协议,即SCLK、I/O、RST。
由于STC89C52无IIC总线,所以采用软件模拟IIC总线连接DS1302。
其SCLK、I/O、RST分别接单片机P1.6,P1.4,P1.5引脚。
如图所示:
5.DS1302的读写
DS1302与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。
若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。
其写数据与读数据操作时序
读数据操作时序
写数据操作时序
液晶显示模块LCD1602
LCD1602与单片机连接如图所示
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:
表3:
引脚接口说明表
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极
1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:
序号
指令
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
读出的数据内容
表4:
控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
HD44780相兼容的芯片时序表如下:
读状态
输入
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=高脉冲
输出
无
表5:
基本操作时序表
读写操作时序如图所示:
读操作时序
写操作时序
1602LCD各信号保持时间
1602LCD各信号保持时间如下表:
表6:
1602LCD各信号保持时间
1602LCD的RAM地址映射
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,如图,是1602的内部显示地址。
1602LCD内部显示地址
例如第二行第一个字符的地址是40H写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是
01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
电路硬件连接如图
3:
程序框图或硬件电路图(包括对各个模块的分析)
1.程序框图
开机
初始化DS1302
初始化LCD1602
从DS1302读取
时间数据
对输入做相应处理
将处理后数据写入DS1302
有调整输入
判断是否有调整
输入
无调整输入
对从DS1302读
取的数据进行处理
显示处理后的
时间数据
4:
实验结果
1.正常走时
:
Proteus仿真结果
2.调整分钟右下角显示min表示此刻处于分钟调整状态
Proteus仿真结果
3.调整小时右下角显示hour表示此刻处于小时调整状态
Proteus仿真结果
4.调整日期右下角显示day表示此刻处于日期调整状态
Proteus仿真结果
5.调整月份右下角显示moth表示此刻处于月份调整状态
Proteus仿真结果
6.调整年份右下角显示year表示此刻处于年份调整状态
Proteus仿真结果
7.调整星期右下角显示wk表示此刻处于星期调整状态
Proteus仿真结果
8.退出调整右下角的标示显示消失,即进入正常走时状态
Proteus仿真结果
5:
总结
在这次实验中,我学会用DS1302芯片和STC89C52单片机以及LCD1602液晶显示器来实现液晶显示数字万年历。
在这次试验中我发现并体会到以下在设计中需要注意的问题:
DS1302是通过基于IIC总线的串行接口方式去接收各种命令并读、写数据的。
芯片所规定的接口时序、操作指令以及寄存器对于整个系统的软件实现至关重要。
在一个项目中,不同功能模块所需单片机资源的合理分配,根据项目需求正确选择。
熟悉了IIC总线,在单片机没用IIC总线的情况下利用单片机的I/O来模拟并实现IIC总线的功能。
学会了使用单片机驱动简单的液晶显示模块,并成功的进行显示,完成了项目要求。
学会了在一个项目中使用多个不同的芯片以及模块实现项目的要求。
并能够正确无差错的协调好不同芯片、模块,使它们相互配合,没有资源及时序冲突,协同的完成项目要求。
感谢学校给我们提供这样的机会!
感谢靳老师给我们的指导!