液晶显示数字时钟C语言Word下载.docx
《液晶显示数字时钟C语言Word下载.docx》由会员分享,可在线阅读,更多相关《液晶显示数字时钟C语言Word下载.docx(71页珍藏版)》请在冰豆网上搜索。
随着半导体技术的飞速发展,以及移动通信、网络技术、多媒体技术在嵌入式系统设计中的应用,单片机从4位、8位、16位到32位,其发展历程一直受到广大电子爱好者的极大关注。
单片机功能越来越强大,价格却不断下降的优势无疑成为嵌入式系统方案设计的首选,同时单片机应用领域的扩大也使得更多人加入到基于单片机系统的开发行列中,推动着单片机技术的创新进步。
而数字钟正是一种用数字电路技术与单片机技术实现计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用[1]。
数字时钟是指以微处理器为核心,充分利用数字技术和软件技术,与各类脉冲信号的传感器配合,记录时间等的智能仪表。
数字时钟是日常生活、工业生产中常用的一种工具,社会拥有量和需求量都很大。
功能上要求能够完成准确走时、调时,性能上要求抗干扰能力强,稳定可靠,同时在价格上具备竞争力[2]。
结合以上几点,设计了一款数字时钟,达到了可靠和经济的双重要求,同时易于与其它产品结合使用,是非常必要的。
本设计主要着眼于数字钟的可靠性与实用性,把工业用单片机技术、与微型机技术应该在数字时钟设计中,开辟了单片机技术与现代计时方法相结合的一条新路。
该数字时钟设计工作原理为:
单片机上电后,从芯片DS1302上讲读取时间数据,计时开始。
通过按钮进行调时,上电复位进行校正时间,通过LCD显示其值。
日常生活中对单片机数字钟的问题要求越来越高,本设计仅针对简单的数字钟进行研究,能够实现数字时钟的正确走时。
2基于单片机的数字时钟设计
本系统由控制时钟芯片DS1302、STC89C52RC单片机和字符点阵型LCD1602液晶显示器等器件构成。
用DS1302产生时钟信号,再由单片机负责接收并且对其进行控制,然后通过编写程序实现具体的功能,如年、月、日、星期、时、分、秒,以及时间的校准、闹钟的设置等。
再通过编写液晶器件的驱动程序,使其信息显示在LCD1602液晶显示器上,最后测试电路完成所有功能后制成样机,系统方框图如图2-1所示。
图2-1系统方框图
键盘是为了完成时钟、日历的校对和日历的显示功能。
由于此电子时钟要求具有闹铃功能,所以设计有闹铃电路,进行声音响铃。
整个电路使用了两种电源,+5V电源将为整个电路供电。
而+3V电源仅作为DS1302的备用电源。
当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。
当+5V电源恢复供电,LCD依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。
2.1主要芯片选择
2.1.1STC89C52RC单片机简介
STC系列单片机是由STMicroelectronics公司生产,并有宏晶公司做大陆代理的。
STMicroelectronics即意法半导体公司是1987年6月在意大利的SGS微电子公司和法国的汤姆逊微电子公司合并后产生的。
1998年5月,公司由原来的SGS汤姆逊(SGSTHOMSON)微电子公司改名为意法半导体公司(STMicroelectronics),简称ST公司[3]。
2.1.2STC89C52RC引脚简介
STC89C52RC可以代替AT89C51,功能更强,速度更快,寿命更长,价格更低。
将AT89C51中的程序直接烧录到STC89C52RC中后,STC89C52RC就可以代替AT89C51直接工作(一般都不需要做任何改动即可正常工作)。
STC89C52RC的内核和AT51系列单片机一样,故引脚相同,外形及引脚排列也相同。
管脚说明:
VCC——供电电压。
GND——接地。
P0口——8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口——带内部上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口——带内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口——带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
在编程/校验时,P3口可接收某些控制信号。
具体的P3口功能,如表2-1所示。
表2-1P3口的特殊功能
引脚替代功能说明
P3.0RXD串行数据接收
P3.1TXD串行数据发送
P3.2INT0外部中断0申请
P3.3INT1外部中断1申请
P3.4T0定时器0外部事件计数输入
P3.5T1定时器1外部事件计数输入
P3.6WR外部RAM写选通
P3.7RD外部RAM读选通
RST——复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG——当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN——外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP——当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)[5]。
XTAL1——反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2——来自反向振荡器的输出。
2.2时钟芯片DS1302
在数字时钟设计中,常用的实时时钟芯片有DS12887、DS1216、DS1643、DS1302。
每种芯片的主要时钟功能基本相同,只是在引脚数量、备用电池的安装方式、计时精度和扩展功能等方面略有不同。
DS12887与DS1216芯片都有内嵌式锂电池作为备用电池;
X1203引脚少,没有嵌入式锂电池,跟DS1302芯片功能相似,只是相比较之下,X1203与AT89S51搭配使用时占用I/O口较多。
DS1643为带有全功能实时时钟的8K×
8非易失性SRAM,集成了非易失性SRAM、实时时钟、晶振、电源掉电控制电路和锂电池电源,BCD码表示的年、月、日、星期、时、分、秒,带闰年补偿。
同样,DS1643拥有28只管脚,硬件连接起来占用微处理器I/O口较多,不方便系统功能拓展和维护。
故而从性价比和货源上考虑,本设计采用时钟芯片DS1302。
2.2.1DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。
需要强调的是,DS1302需要使用32.768KHz的晶振[6]。
2.2.2DS1302引脚说明
DS1302引脚图参照图2-2。
图2-2DS1302芯片引脚图
其的引脚功能参照表2-2。
表2-2DS1302管脚的功能描述
管脚名
功能说明
X1,X2
32.768KHz晶振管脚
GND
地
RST
复位脚
I/O
数据输入/输出引脚
SCLK
串行时钟
Vcc1,Vcc2
电源供电管脚
在编程过程中要注意DS1302的读写时序。
DS1302是SPI总线驱动方式。
它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首要先了解DS1302的控制字。
DS1302的控制字如表2-3。
表2-3DS1302控制字(即地址及命令字节)
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
1
RAM
A4
A3
A2
A1
A0
RD
控制字的作用是设定DS1302的工作方式、传送字节数等。
每次数据的传输都是由控制字开始。
控制字各位的含义和作用如下:
BIT7:
控制字的最高有效位,必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
BIT6:
如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
BIT5至BIT1(A4~A0):
用A4~A0表示,定义片内寄存器和RAM的地址。
定义如下:
当BIT6位=0时,定义时钟和其他寄存器的地址。
A4~A0=0~6,顺序为秒、分、时、日、月、星期、年的寄存器。
当A4~A0=7,为芯片写保护寄存器地址。
当A4~A0=8,为慢速充电参数选择寄存器。
当A4~A0=31,为时钟多字节方式选择寄存器。
当BIT6=1时,定义RAM的地址,A4~A0=0~30,对应各子地址的RAM,地址31对应的是RAM多字节方式选择寄存器。
BIT0(最低有效位):
如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
DS1302的数据读写方式有两种,一种是单字节操作方式,一种是多字节操作方式。
每次仅写入或读出一个字节数据称为单字节操作,每次对时钟/日历的8字节或31字节RAM进行全体写入或读出的操作,称其为多字节操作方式。
当以多字节方式写时钟寄存器时,必须按数据传送的次序依次写入8个寄存器。
但是,当以多字节方式写RAM时,不必写所有31字节。
不管是否写了全部31字节,所写的每一个字节都将传送至RAM。
为了启动数据的传输,RST引脚信号应由低变高,当把RST驱动至逻辑1的状态时,SCLK必须为逻辑0,数据在SCLK的上升沿串行输入。
无论是读周期还是写周期,也无论送方式是单字节传送还是多字节传送,都要通过控制字指定40字节中的哪个将被访问。
在开始8个时钟周期把命令字(具有地址和控制信息的8位数据)装入移位寄存器之后,另外的时钟在读操作时输出数据,在写操作时输入数据,所有的数据在时钟的下降沿变化。
所有写入或读出操作都是先向芯片发送一个命令字节。
对于单字节操作,包括命令字节在内,每次为2个字节,需要16个时钟;
对于时钟/日历多字节模式操作,每次为7个字节,需要72个时钟;
而对于RAM多字节模式操作,每次则为32字节,需要多达256个时钟。
这里仅给出单字节读写时序。
多字节操作方式与其类似,只是后面跟的字节数不止一个。
2.2.3DS1302的片内寄存器
表2-4日历、时间寄存器及其控制字
寄存器名称
写操作
读操作
取值范围
7
654
321
秒寄存器
80H
81H
00~59
CH
10SEC
SEC
分寄存器
82H
83H
10MIN
MIN
时寄存器
84H
85H
00~23
12/24
10HR
HR
日寄存器
86H
87H
01~31
10DATE
DATE
月寄存器
88H
89H
01~12
010M
MONTH
周寄存器
8AH
8BH
01~07
000
DAY
年寄存器
8CH
8DH
00~99
10YEAR
YEAR
通过控制字对DS1302片内寄存器进行寻址之后,即可就所选中寄存器的各位进行操作。
片内各寄存器及各位的功能定义如表2-4所示。
DS1302有关日历、时间的寄存器共有10个,时钟/日历包含在其中的7个写/读寄存器内,这7个寄存器分别是秒、分、小时、日、月、星期和年。
小时寄存器(85H、84H)的位7用于定义DS1302是运行于12小时模式还是24小时模式。
当为12小时制式时,位5为“0”表示AM;
为“1”表示PM。
在24小时制式下,位5是第二个10小时位(20~23时)。
秒寄存器(81H、80H)的位7定义为时钟暂停标志(CH)。
当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;
当该位置为0时,时钟开始运行。
一般在设置时钟时,可以停止其工作,设定完之后,再启动其工作。
控制寄存器(8FH、8EH)的位7是写保护位(WP),其它7位均置为0。
在任何片内时钟/日历寄存器和RAM,在写操作之前,WP位必须为0,否则将不可写入。
当WP位为1时,写保护位防止对任一寄存器的写操作。
因此,通过置写保护位,可以提高数据的安全性。
另外,还有慢速充电控制寄存器和RAM寄存器。
慢速充电寄存器控制着DS1302的慢速充电特性。
寄存器的BIT4~BIT7(TCS)决定是否具备充电性能:
仅在编码为1010的条件下才具备充电性能,其他编码组合不允许充电。
2.3LCD液晶显示器
2.3.1液晶显示器LCD1602简介
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
本系统使用是是LCD1602液晶显示器,它可以显示两行,每行16个字符,采用单+5V电源电,外围电路配置简单,价格便宜,具有很高的性价比[7]。
LCD1602封装图如图2-3所示。
图2-3LCD1602封装图
LCD1602采用标准的16脚接口,其中VSS为地电源,VDD接5V正电源,VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
D0~D7为8位双向数据线。
BLA背光源正极,BLK背光源负极。
2.3.2LCD的基本指令
LCD1602液晶模块内部的控制器共有11条控制指令,具体的命令见表2-5所示。
表2-5LCD1602控制指令
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
清屏
2
光标复位
*
3
光标和显示模式设置
I/D
S
4
显示开关控制
D
C
B
5
光标或字符移位
S/C
R/L
6
置功能
DL
N
F
置字符发生存贮器地址
字符发生存贮器地址(AGG)
8
置数据存贮器地址
显示数据存贮器地址(ADD)
9
读忙标志或地址
BF
计数器地址(AC)
10
写入CGRAM/DDRAM
要写的数
11
读CGRAM/DDRAM数
读出的数据
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
1.清屏指令
功能:
(1)清除液晶显示器,即将DDRAM的内容全部填入“空白”的ASCII码20H;
(2)光标归位,即将光标撤回液晶显示屏的左上方;
(3)将地址计数器(AC)的值设为0。
2.光标复位指令
(1)把光标撤回到显示器的左上方;
(2)把地址计数器(AC)的值设置为0;
(3)保持DDRAM的内容不变。
3.光标和显示模式设置指令
设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。
4.显示开关控制指令
控制显示器开/关、光标显示/关闭以及光标是否闪烁。
5.设定显示屏或光标移动方向指令
使光标移位或使整个显示屏幕移位。
6.功能设定指令
设定数据总线位数、显示的行数及字型。
7.设定CGRAM地址指令
设定下一个要存入数据的CGRAM的地址。
8.设定DDRAM地址指令
设定下一个要存入数据的DDRAM的地址。
9.读取忙信号或AC地址指令
(1)读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;
当BF=0时,液晶显示器可以接收单片机送来的数据或指令;
(2)读取地址计数器(AC)的内容