万年历时钟实验
一. 实验目的
进行一次实际开发的实验,提高用户实际开发的能力。
二. 实验设备及器件
IBM PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台
三. 实验内容
结合I2C 总线控制的实时时钟、ZLG7290 键盘LED 控制器进行万年历时钟的设
计。
四. 实验要求
熟练掌握I2C 总线的控制,灵活运用I2C 主控器软件包,深刻理解实时时钟、
ZLG7290 键盘LED 控制的各种功能,并能把它们相结合,组成具有实际功能的万年历
时钟。
五. 实验步骤
1. 用导线连接D5 区的SCL、SDA 到A2 区的P16、P17(SCL~P16、SDA~P17),
连接D5 区的RST_L、INT_KEY 到A2 区的P10、INT0(/RST~P10、
INT_KEY~INT0),短接D5 区的JP1 跳线。
2. 模拟I2C 软件包“VIIC_C51.C”文件加入到Keil C51 的项目中,开头包含
“VIIC_C51.H”头文件。修改VIIC_C51.C 文件中的sbit SDA=P1^7;和 sbit
SCL=P1^6;。另外还要增加ZLG7290 软件包“ZLG7290.C”文件加入到Keil
C51 的项目中,开头包含“ZLG7290.H”头文件。
3. 先编写显示的子函数,可以分别显示日期和显示时间。用按键来切换显示的内容(初
步设计用D5 区的S1 按键来切换)。
4. 然后再进行整体编程,如果还有困难可以先画流程图,再编写程序。
5. 显示结果为:上电运行时,8 位数码管显示时间,时分秒;按一下S1 切换到显示
年月日,再按一下S1 又切换回时分秒。
六. 实验预习要求
认真阅读PCF8563T、ZLG7290 的数据手册和模拟I2C 软件包使用手册,理解硬
件结构,还可以先把程序编好,然后在Keil C51 环境下进行软件仿真。
七. 实验参考程序
实时时钟程序:
#include "reg52.h"
#include "VIIC_C51.H" //包含VI2C 软件包
#include "zlg7290.h"
#define PCF8563 0xA2 //定义器件地址
#define WRADDR 0x00 //定义写单元首地址
#define RDADDR 0x02 //定义读单元首地址
sbit KEY_INT=P3^2;
sbit RST=P1^0;
unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
unsigned char KEY; //保存键值
bit swich_date=0;
unsigned char display_time(unsigned char *sd)
{
sd[0]=sd[0]&0x7f;//秒屏蔽保留位
sd[1]=sd[1]&0x7f;//分屏蔽保留位
sd[2]=sd[2]&0x3f;//时屏蔽保留位
disp_buf[0] =(sd[0]%16);
disp_buf[1] =(sd[0]/16);
disp_buf[2] = 31;
disp_buf[3] =(sd[1]%16);
disp_buf[4] =(sd[1]/16);
disp_buf[5] = 31;
disp_buf[6] =(sd[2]%16);
disp_buf[7] =(sd[2]/16);
ZLG7290_SendBuf(disp_buf,8);
return 0;
}
unsigned char display_date(unsigned char *sd)
{
sd[0]=sd[0]&0x3f;//日屏蔽保留位
sd[2]=sd[2]&0x1f;//月屏蔽保留位
disp_buf[0] =(sd[0]%16);
disp_buf[1] =(sd[0]/16);
disp_buf[2] =(sd[2]%16)+0x80;//后面加小数点
disp_buf[3] =(sd[2]/16);
disp_buf[4] =(sd[3]%16)+0x80;//后面加小数点
disp_buf[5] =(sd[3]/16);
disp_buf[6] =0;
disp_buf[7] =2;
ZLG7290_SendBuf(disp_buf,8);
return 0;
}
unsigned char DelayNS(unsigned char no)
{
unsigned char i,j; //延时参数
for(; no>0; no--)
for(i=0; i<100; i++)
for(j=0; j<100; j++);
return 0;
}
void main()
{
unsigned char code td[9]={ 0x00,0x12,0x00,0x30,0x12,
0x06,0x05,0x02,0x04};//定义初始化字
unsigned char rd[7]; //定义接收缓冲区
RST=0;
DelayNS(1);
RST=1;
//初始化PCF8563,如果需要的话可以去掉
ISendStr(PCF8563,WRADDR,td,0x5);
DelayNS(1);
//初始化PCF8563,如果需要的话可以去掉
ISendStr(PCF8563,WRADDR+5,&td[5],0x4);
while(1)
{
DelayNS(1);
IRcvStr(PCF8563,RDADDR,rd,0x7); //读现在的时、分、秒
DelayNS(1);
if(swich_date)
display_date(rd+3); //调显示日期子程序
else
display_time(rd); //调显示时间子程序
if(KEY_INT==0)
{
KEY=ZLG7290_GetKey();
if(KEY==1)
swich_date=~swich_date;
}
}
}
八. 实验思考题
(1)请用户思考一下,如果要断电还能不丢失时间应该做那些措施。
(2)请用户再思考一下,如果要降低功耗,软件设计时应做那些措施。
评论
查看更多