萬年歷時(shí)鐘實(shí)驗(yàn)
一. 實(shí)驗(yàn)?zāi)康?br>進(jìn)行一次實(shí)際開發(fā)的實(shí)驗(yàn),提高用戶實(shí)際開發(fā)的能力。
二. 實(shí)驗(yàn)設(shè)備及器件
IBM PC 機(jī) 一臺(tái)
DP-51PROC 單片機(jī)綜合仿真實(shí)驗(yàn)儀 一臺(tái)
三. 實(shí)驗(yàn)內(nèi)容
結(jié)合I2C 總線控制的實(shí)時(shí)時(shí)鐘、ZLG7290 鍵盤LED 控制器進(jìn)行萬年歷時(shí)鐘的設(shè)
計(jì)。
四. 實(shí)驗(yàn)要求
熟練掌握I2C 總線的控制,靈活運(yùn)用I2C 主控器軟件包,深刻理解實(shí)時(shí)時(shí)鐘、
ZLG7290 鍵盤LED 控制的各種功能,并能把它們相結(jié)合,組成具有實(shí)際功能的萬年歷
時(shí)鐘。
五. 實(shí)驗(yàn)步驟
1. 用導(dǎo)線連接D5 區(qū)的SCL、SDA 到A2 區(qū)的P16、P17(SCL~P16、SDA~P17),
連接D5 區(qū)的RST_L、INT_KEY 到A2 區(qū)的P10、INT0(/RST~P10、
INT_KEY~INT0),短接D5 區(qū)的JP1 跳線。
2. 模擬I2C 軟件包“VIIC_C51.C”文件加入到Keil C51 的項(xiàng)目中,開頭包含
“VIIC_C51.H”頭文件。修改VIIC_C51.C 文件中的sbit SDA=P1^7;和 sbit
SCL=P1^6;。另外還要增加ZLG7290 軟件包“ZLG7290.C”文件加入到Keil
C51 的項(xiàng)目中,開頭包含“ZLG7290.H”頭文件。
3. 先編寫顯示的子函數(shù),可以分別顯示日期和顯示時(shí)間。用按鍵來切換顯示的內(nèi)容(初
步設(shè)計(jì)用D5 區(qū)的S1 按鍵來切換)。
4. 然后再進(jìn)行整體編程,如果還有困難可以先畫流程圖,再編寫程序。
5. 顯示結(jié)果為:上電運(yùn)行時(shí),8 位數(shù)碼管顯示時(shí)間,時(shí)分秒;按一下S1 切換到顯示
年月日,再按一下S1 又切換回時(shí)分秒。
六. 實(shí)驗(yàn)預(yù)習(xí)要求
認(rèn)真閱讀PCF8563T、ZLG7290 的數(shù)據(jù)手冊(cè)和模擬I2C 軟件包使用手冊(cè),理解硬
件結(jié)構(gòu),還可以先把程序編好,然后在Keil C51 環(huán)境下進(jìn)行軟件仿真。
七. 實(shí)驗(yàn)參考程序
實(shí)時(shí)時(shí)鐘程序:
#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;//時(shí)屏蔽保留位
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;//后面加小數(shù)點(diǎn)
disp_buf[3] =(sd[2]/16);
disp_buf[4] =(sd[3]%16)+0x80;//后面加小數(shù)點(diǎn)
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; //延時(shí)參數(shù)
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]; //定義接收緩沖區(qū)
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); //讀現(xiàn)在的時(shí)、分、秒
DelayNS(1);
if(swich_date)
display_date(rd+3); //調(diào)顯示日期子程序
else
display_time(rd); //調(diào)顯示時(shí)間子程序
if(KEY_INT==0)
{
KEY=ZLG7290_GetKey();
if(KEY==1)
swich_date=~swich_date;
}
}
}
八. 實(shí)驗(yàn)思考題
(1)請(qǐng)用戶思考一下,如果要斷電還能不丟失時(shí)間應(yīng)該做那些措施。
(2)請(qǐng)用戶再思考一下,如果要降低功耗,軟件設(shè)計(jì)時(shí)應(yīng)做那些措施。
評(píng)論
查看更多