实时时钟显示实例.docx
《实时时钟显示实例.docx》由会员分享,可在线阅读,更多相关《实时时钟显示实例.docx(32页珍藏版)》请在冰豆网上搜索。
实时时钟显示实例
实时时钟显示例程设计目录
1.需求分析2
1.1实验目的2
1.2实验内容2
1.3实验要求2
2.实验设备2
2.1实验仪器2
2.2主要芯片简介3
2.2.1CH451芯片3
2.2.289S52芯片4
2.2.3CD4052芯片5
2.2.4PCF8563芯片(实验原理)7
3.I2C协议12
4.实验步骤15
4.1硬件连接15
4.2软件设计17
5.主程序18
5.1主程序流程图18
5.2主程序源代码18
6.实际测试22
7.实验心得25
8.参考文献26
1.需求分析
1.1实验目的
●掌握IO口操作;
●掌握显示及键盘芯片的运用;
●了解中断的运用;
●了解I2C总线操作。
1.2实验内容
●学习使用ZG211硬件综合实验平台,程序设计集成开发环境;
●查阅和学习需要的接口芯片资料,掌握接口芯片的使用方法和编程要领,查阅和学习课程设计题目需要的辅助芯片以及器件资料;
●设计接口芯片和辅助芯片以及器件与8051单片机连接硬件电路原理图
●设计与硬件电路原理图对应的C语言程序(或8051汇编语言)。
给出程序流程图。
在集成开发环境中调试程序。
给出程序的详细注释。
能够解释使用程序模拟电路时序信号和数据。
1.3实验要求
●能正常操作LED数码显示
●能通过中断方式接收按键信息
●能通过I2C总线方式与PCF8563芯片交换数据
●能正确解释并显示从PCF8563芯片取出的日期和时间数据
2.实验设备
2.1实验仪器
●PC机一台;
●ZG-211单片机系统实验板一块;
●实验连接线若干
●芯片:
CH451,89S52,CD4052,PCF8563
●配套并口编程线一根
●配套电源一
2.2主要芯片简介
2.2.1CH451芯片
CH451是一个整合了数码管显示驱动和键盘扫描控制以及μP监控的多功能外围芯片。
CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描;CH451通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。
CH45主要特点如下:
①显示驱动
●内置大电流驱动级,段电流不小于30mA,字电流不小于160mA。
●动态显示扫描控制,直接驱动8位数码管或者64位发光管LED。
●可选数码管的段与数据位相对应的不译码方式或者BCD译码方式。
●字数据左移、右移、左循环、右循环。
●各数字独立闪烁控制。
●通过占空比设定提16级亮度控制。
●支持段电流上限调整,可以省去所有限流电阻。
●扫描极限控制,支持1到8个数码管,只为有效数码管分配扫描时间。
②键盘控制
●内置64键键盘控制器,基于8×8矩阵键盘扫描。
●内置去抖动电路。
●键盘中断,低电平有效输出。
●提供按键释放标志位。
③外部接口
●高速的4线串行接口,支持芯片级联,时钟速度从0到10MHz。
●串行接口中的DIN和DCLK信号线可以与其它接口电路共用。
●完全内置RC阻容振荡电路,根据需要可以外接阻容振荡。
●内置上电复位和看门狗Watch-Dog,提供高电平有效和低电平有效复位输出。
④其它杂项
.●可选多种封装:
DIP28、SOP28、DIP24S。
●经过授权用了2项专利技术,低成本,简便易用。
2.2.289S52芯片
(1)主要性能
●与MCS-51单片机产品兼容
●8K字节在系统可编程Flash存储器
●1000次擦写周期
●全静态操作:
0Hz~33Hz
●三级加密程序存储器
●32个可编程I/O口线
●三个16位定时器/计数器
●八个中断源
●全双工UART串行通道
●低功耗空闲和掉电模式
●掉电后中断可唤醒
●看门狗定时器
●双数据指针
●掉电标识符
(2)功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
(3)AT89S52方框图
2.2.3CD4052芯片
CD4052是一个差分4通道数字控制模拟开关,有A0、A1两个二进制控制输入端和INH输入,具有低导通阻抗和很低的截止漏电流。
幅值为4.5~20V的数字信号可控制-峰值20的模拟信号。
例如,若VDD=+5V,VSS=0,VEE=-13.5V,则0~5V的数字信号可控制-13.5~4.5V的模拟信号。
这些开关电路在整个VDD-VSS和VDDVEE电源范围内具有极低的静态功耗,与控制信号的逻辑状态无关。
当INH输入端=“1”时,所有的通道截止。
二位二进制信号选通4通道中的一通道,可连接该输入端至输出。
CC4052提供了16引线多层陶瓷双列直插(D)、熔封陶瓷双列直插(J)、塑料双列直插(P)和陶瓷片状载体(C)4种封装形式。
推荐工作条件:
极限值:
电源电压
-0.5V~18V
输入电压
-0.5V~VDD+0.5V
输入电流
±10mA
储存温度
-65℃~150℃
电源电压范围
3V~15V
输入电压范围
0V~VDD
工作温度范围
M类
-55℃~125℃
E类
-40℃~85℃
引出端符号:
A0~A1
地址端
1I0/O0~1I3/O3
输入输出端
2I0/O0~2I3/O3
输入输出端
INH
禁止端
1O/I
公共输出/输入端
2O/I
公共输出/输入端
VDD
正电源
VEE
模拟信号地
Vss
数字信号地
逻辑符号
注:
在对PCF8563进行操作时,先将CD4052的通道选为0,将cpu与PCF8563进行物理连接。
2.2.4PCF8563芯片(实验原理)
在单片机应用系统中的实时时钟信号,一般都由专门的时钟芯片来提供,单片机只需要定期读取时钟芯片中固定地址中的时钟信息即可。
本实验板采用的是PCF8563时钟芯片。
PCF8563芯片的引脚说明见下表:
该芯片有16个8位寄存器:
一个可自动增量的地址寄存器,一个内置32.768KHZ的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC提供源时钟),一个可编程时钟输出,一个定时器,一个报警器和一个掉电检测器。
所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。
前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H~08H用于时钟计数器(秒~年计数器),地址09H~0CH用于报警寄存器(定义报警条件),地址0DH控制CLKOUT管脚的输出频率,地址0EH和0FH分别用于定时器控制寄存器和定时器寄存器。
PCF8563芯片在第一次运行时需要设置控制寄存器和状态寄存器,见下表,一般均设置为0。
在PCF8563芯片中,秒、分钟、小时、日、月、年编码格式为BCD。
星期不以BCD格式编码。
具体格式见下表:
地址
说明
BIT
符号
描述
02H
秒/VL寄存器
7
VL
VL=0:
保证准确的时钟/日历数据
VL=1:
不保证准确的时钟/日历数据
6~0
<秒>
代表BCD格式的当前秒数值,值为00~99
例如:
<秒>=1011001,代表59秒
03H
分钟寄存器
7
-
无效
6~0
<分钟>
代表BCD格式的当前分钟数值,值为00~59
04H
小时寄存器
7~6
-
无效
5~0
<小时>
代表BCD格式的当前小时数值,值为00~23
05H
日寄存器
7~6
-
无效
5~0
<日>
代表BCD格式的当前日数值,值为01~31。
当年计数器的值是闰年时,PCF8563自动给二月增加一个值,使其成为29天
06H
星期寄存器
7~3
-
无效
2~0
<星期>
代表当前星期数值0~6,这些位也可由用户重新分配
07H
月寄存器
7
C
世纪位;C=0指定世纪数为20××,C=1指定世纪数为19××,“××”为年寄存器中的值。
当年寄存器中的值由99变为00时,世纪位会改变。
6~5
-
无用
08H
年寄存器
7~0
年
代表BCD格式的当前年数值,值为00~99
实验只使用PCF8563的时间读取功能,只需对该芯片地址02H-08H的内存进行读写操作,其它地址的内存保持为默认值,实验板上提供电池,可以在掉电后保持时钟正常工作。
读、写PCF8583流程图如下:
(1)写PCF858子程序流程图
(2)读PCF8583子程序流程图
实验板上PCF8563的相关连接原理图如下图所示:
3.I2C协议
I2C总线是应用最广的一种单片机串行扩展总线,以同步串行2线方式进行通信:
时钟线SCL和数据线SDA,是Philips公司推出的串行总线协议;他最显著的特点就是规范的完整性,结构的独立性。
用户使用相当方便,具有I2C总线接口的器件,无论他们的功能有多大的差别,在操作模式上却几乎是一模一样的,所以实现了软件开发的模块化。
I2C总线用两条线(SDA和SCL)在芯片和模块间传递信息。
SDA为串行数据线,SCL为串行时钟线。
1.只有在总线空闲时才允许启动数据传送。
2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态不允许。
有跳变时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
I2C总线时序如下:
开始信号在SCL保持高电平状态下,SDA出现下降沿。
出现开始信号以后,总线被认为“忙”。
停止信号在SCL保持高电平状态下,SDA出现上升沿出现停止信号以后,总线被认为“空闲”。
开始和结束时序
器件寻址:
主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址。
8位从器件地址的高4位固定为1010。
接下来的3位A2A1A0为器件的地址位,用来定义哪个器件以及器件的哪个部分被主器件访问。
从器件8位地址的最低位,作为读写控制位。
“1”表示对从器件进行读操作,“0”表示对从器件进行写操作。
在主器件发送起始信号和从器件地址字节后,PCF8563监视总线并当其地址与发送的从地址相符时响应一个应答信号(通过SDA线)。
PCF8563再根据读写控制位(R/W)的状态进行读或写操作。
应答信号:
I2C总线数据传送时每成功地传送一个字节数据后,接收器都必须产生一个应答信号,应答的器件在第9个时钟周期时将SDA线拉低,表示其已收到一个8位数据。
PCF8563在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作,则在每接收一个8位字节之后响应一个应答信号。
当PCF8563工作于读模式时,在发送一个8位数据后释放SDA线并监视一个应答信号,一旦接收到应答信号,PCF8563继续发送数据,如主器件没有发送应答信号,器件停止传送数据并,等待一个停止信号主器件。
应答时序图
从器件地址位
注:
其中A0、A1和A2对应24C02的管脚1、2和3,PCF8563的从地址读操作时为0A3H,写操作时为0A2H。
写操作:
1.字节写
在字节写模式下,主器件发送起始命令和从器件地址信息(R/W位置零)给从器件,在从器件产生应答信号后,主器件发送PCF8563的字节地址,主器件在收到从器件的另一个应答信号后,再发送数据到被寻址的存储单元。
PCF8563再次应答,并在主器件产生停止信号后开始内部数据的擦写,在内部擦写过程中PCF8563不再应答主器件的任何请求。
字节写时序图
2.页写
用页写,PCF8563可以一次写入16个字节的数据,页写操作的启动和字节写一样,不同在于传送了一字节数据后并不产生停止信号。
主器件被允许发送P(PCF8563:
P=15;)个额外的字节。
每发送一个字节数据后PCF8563产生一个应答位并将字节地址低位加1,高位保持不变。
如果在发送停止信号之前主器件发送超过P+1个字节,地址计数器将自动翻转,先前写入的数据被覆盖。
接收到P+1字节数据和主器件发送的停止信号后,芯片启动内部写周期将数据写到数据区,所有接收的数据在一个写周期内写入PCF8563。
页写时序图
应答查询:
可以利用内部写周期时禁止数据输入这一特性,一旦主器件发送停止位指示主器件操作结束时,PCF8563启动内部写周期,应答查询立即启动,包括发送一个起始信号和进行写操作的从器件地址。
如果PCF8563正在进行内部写操作,不会发送应答信号。
如果PCF8563已经完成了内部自写周期,将发送一个应答信号,主器件可以继续进行下一次读写操作。
写保护:
写保护操作特性可使用户避免由于不当操作而造成对存储区域内部数据的改写,当WP管脚接高时整个寄存器区全部被保护起来而变为只可读取。
读操作:
PCF8563读操作的初始化方式和写操作时一样,仅把(R/W)位置为1,有三种不同的读操作方式:
立即地址读、选择读和连续读。
立即地址读:
PCF8563的地址计数器内容为最后操作字节的地址加1。
也就是说,如果上次读/写的操作地址为N,则立即读的地址从地址N+1开始。
如果N=E(这里对24C02,E=255;对PCF8563,E=16),则计数器将翻转到0且继续输出数。
PCF8563接收到从器件地址信号后(R/W位置1),它首先发送一个应答信号,然后发送一个8位字节数据。
主器件不需发送一个应答信号,但要产生一个停止信号。
选择性读:
操作允许主器件对寄存器的任意字节进行读操作,主器件首先通过发送起始信号、从器件地址和它想读取的字节数据的地址执行一个伪写操作。
在PCF8563应答之后,主器件重新发送起始信号和从器件地址,此时R/W位置1,PCF8563响应并发送应答信号,然后输出所要求的一个8位字节数据,主器件不发送应答信号但产生一个停止信号。
选择读时序图
连续读:
连续读操作可通过立即读或选择性读操作启动。
在PCF8563发送完一个8位字节数据后,主器件产生一个应答信号来响应,告知PCF8563主器件要求更多的数据,对应每个主机产生的应答信号PCF8563将发送一个8位数据字节。
当主器件不发送应答信号而发送停止位时结束此操作。
从PCF8563输出的数据按顺序由N到N+1输出。
读操作时地址计数器在PCF8563整个地址内增加,这样整个寄存器区域在可在一个读操作内全部读出。
当读取的字节超过E(对于PCF8563,E=16;对24C02,E=255)计数器将翻转到零并继续输出数据字节。
连续读时序图
4.实验步骤
4.1硬件连接
将并口线插在实验板与PC机的并口插座上,按下图连接实验线路,仔细检查无误后,接通电源。
(图中箭头表示需要接线的地方)
实物连接图如下所示:
4.2软件设计
进入KEILC开发环境编写程序。
首先根据I2C协议内容,编写I2C函数。
在编写I2C函数时,应注意代码的可重用性,方便其它函数调用。
例如:
编写起始信号函数时,可以将它独立出来,
VOIDBEGIN()
{
程序代码
}
PCF8563的I2C接口最大频率是400KHZ,在程序中对一个IO口操作完后,需要延时2.5毫秒(本实验板CPU晶振为11.0592MHZ,一个指令周期为1.08毫秒)。
写好I2C读写函数后,可对PCF8563进行操作。
先将CD4052的通道选为0,这样CPU与PCF8563物理联接起来了。
第一次操作需要对PCF8563进行初始化设置。
先将0X00分别写入PCF8563中地址为0X0,0X01的寄存器中,接着将要设置的时间按:
年、月、星期、日、小时、分、秒的顺序,以BCD码格式写入地址为0X08--0X02的寄存器中。
在将时间按:
年、月、星期、日、小时、分、秒读出后,按“XX-XX-XX”格式分两屏显示出来,显示接口的应用见显示、键盘实验。
在进行I2C总线操作时,请将所有中断关闭,以防中断程序,打乱其时序,操作完成再将中断恢复。
实际测试程序编译成功后,打开联机下载软件,将HEX文件下载到89S52中,观看程序运行结果,如有问题则修改程序,再次下载。
调试成功后,请将I2C读写程序、设置时间程序和读取时间程序,各写成一个函数,以供其他模块调用。
5.主程序
5.1主程序流程图
N
Y
5.2主程序源代码
#include
#include"reg52.h"
#include"def.h"
#include"sub.h"
#include"beep.h"
#include"func.h"
#include"display.h"
#include"time.h"
unsignedcharkey_data=0;
main()
{
unsignedchartemp=0;
unsignedcharTimeFLAG=0;
//MCU初始化
InitMCU();
//开关蜂鸣器,表示开始工作
speak_on();
delay_1ms(50);
speak_off();
Set_8563_Register();
Display_TEST();
while
(1)
{
if(key_data!
=0)//若有键按下
{
temp=key_data;
key_data=0;
switch(temp)
{
case0x40:
disp_time(0);
break;
case0x49:
disp_time
(1);
break;
default:
break;
}
}
}
}
主要函数的功能说明:
1.send_disp_data(unsignedcharcomm,unsignedchar_data)向CH451芯片发送命令
2.send_comm(unsignedcharcomm)向CH451芯片发送命令
3.disp_initialize()向CH451芯片发送初始化命令
4.Key()中断函数,获取当前按键状态
5.Display_TEST()测试显示LED数码管
6.InitMCU()初始化MCU
7.delay_1ms(unsignedint_1ms)毫秒级延时
8.chang_4052(unsignedchari)选择4052的通道
9.PCF8563Start()向时钟芯片发送开始信号
10.PCF8563Stop()向时钟芯片发送停止信号
11.PCF8563Clock()从总线接受一BIT数据
12.PCF8563Ack()向总线发送一个数据接受完成信号
13.PCF8563Nack()检PCF8563芯片是否接受到一字节的数据
14.PCF8563OutByte(unsignedcharbyte)向总线发送一个字节的数据
15.PCF8563GetByte()从总线接受一个字节的数据
16.PCF8563DummyWrite(unsignedcharaddr)向总线发送开始信号和从地址
17.PCF8563Read(unsignedchar*_data,unsignedcharaddr,unsignedcharleng)从PCF8563读取数据
18.PCF8563Write(unsignedchar*_data,unsignedcharaddr,unsignedcharleng)从PCF8563读取数据
19.Set_8563_Register()设置PCF8563控制/状态寄存器
20.Get_Time(unsignedchar*time)读取时钟
21.disp_time(unsignedcharn)显示时钟
注:
为了使时钟具有自动计时进位的功能,将disp_time(unsignedcharn)改写如下:
voiddisp_time(unsignedcharn)
{
unsignedchartime_disp_buf[12]={1,3,0,7,0,4,0,0,0,0,0,0};
//Get_Time(time_disp_buf);
if(n==0)
{
unsignedintk=0;
send_disp_data(CH451_LOAD0,time_disp_buf[6]);
send_disp_data(CH451_LOAD1,time_disp_buf[7]);
send_disp_data(CH451_LOAD2,0x12);
send_disp_data(CH451_LOAD3,time_disp_buf[8]);
send_disp_data(CH451_LOAD4,time_disp_buf[9]);
send_disp_data(CH451_LOAD5,0x12);
send_disp_data(CH451_LOAD6,time_disp_buf[10]);
send_disp_data(CH451_LOAD7,k);
while
(1){
unsignedsign=k;
delay_1ms(1000);
if