萬年歷時鐘實驗
一. 實驗目的
進行一次實際開發的實驗,提高用戶實際開發的能力。
二. 實驗設備及器件
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)請用戶再思考一下,如果要降低功耗,軟件設計時應做那些措施。
評論
查看更多