PCF8563驅動程序演示實驗
一、實驗目的
PCF8563是一款性價比極高的時鐘芯片。它已被廣泛用于電表、水表、氣表、電話、傳
真機、便攜式儀器以及電池供電的儀器儀表等產品領域。本實驗示例展示了如何在Small
RTOS 51 中編寫PCF8563 的驅動程序。
二、實驗設備及器件
PC 機 一臺
DP-51PROC 單片機綜合仿真實驗儀 一臺
三、 實驗步驟
1、 使用導線連接D5 區的SCL、SDA 和A2 區的P16、P17(SCL~P16、SDA~P17),
短接D5 區的JP1 跳線;
2、 下載PCF8653.hex 文件到DP-51PRO.NET 中并運行;
四、實驗參考程序主要部分
/*************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
** (c) Copyright 2002-2004, chenmingji
** All Rights Reserved
** V1.20
***************************************************************/
#include "CONFIG.h"
uint8 code td[9]={0x00,0x12,0x00,0x30,0x12,0x06,0x05,0x02,0x04}; //定義初始化字
uint8 disp_buf[8]={0,0,0,0,0,0,0,0}; //顯示緩存
uint8 rd[7]; //定義接收緩沖區
void TaskA(void);
void TaskB(void);
/*************************************************************
*函數名稱:unsigned char display_time(unsigned char *sd)
*功能描述:驅動ZLG7290 進行時間顯示。顯示格式: 時、分、秒
*************************************************************/
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;
}
/*************************************************************
*函數名稱:void Init_PCF8563(void)
*功能描述:初始化PCF8563 芯片
*************************************************************/
void Init_PCF8563(void)
{
RST=0;
_nop_();
_nop_();
_nop_();
RST=1;
ISendStr(PCF8563,WRADDR,td,0x5);
_nop_();
_nop_();
_nop_();
ISendStr(PCF8563,WRADDR+5,&td[5],0x4);
}
/******************************************************
*時間顯示任務
******************************************************/
void TaskA(void)
{
OSTaskCreate(TaskB,NULL,1);
while(1)
{
OS_ENTER_CRITICAL();
display_time(rd);
OS_EXIT_CRITICAL();
OSWait(K_TMO,1);
}
}
/*************************************************************
* 取時間任務
*************************************************************/
void TaskB(void)
{
while(1)
{
OS_ENTER_CRITICAL();
IRcvStr(PCF8563,RDADDR,rd,0x7);
OS_EXIT_CRITICAL();
OSWait(K_TMO,1);
}
}
void main()
{
OSInit();
TMOD = (TMOD & 0XF0) | 0X01;
// 每10ms 發生一次T0 中斷
TL0 = (65536 - (11059200 / 12) / 100) % 256;
TH0 = (65536 - (11059200 / 12) / 100) / 256;
TR0 = 1;
ET0 = 1;
TF0 = 0;
Init_PCF8563();
OSTaskCreate(TaskA,NULL,0);
while(1)
{
PCON = PCON | 0x01; /* CPU 進入休眠狀態 */
}
}
五、實驗示例程序簡析
有關PCF8563 芯片的應用和ZLG7290 的使用,這里不再詳述。用戶可以閱讀
DP-51PROC 的相關的實驗例子和文檔資料。
本實驗程序使用動態創建任務的方法創建了兩個任務:TaskA 和TaskB 。方法如下:
OSTaskCreate (TaskA, NULL, 0);
OSTaskCreate (TaskB, NULL, 1);
注意,TaskB 任務是在TaskA 任務內部創建的。并且TaskA 的優先級比TaskB 的高。
由于對I2C 總線驅動程序的操作不具有可重入性,所以使用了以下宏
OS_ENTER_CRITICAL ( );
OS_EXIT_CRITICAL ( );
把display_time(rd)和IRcvStr(PCF8563,RDADDR,rd,0x7) 變成臨界代碼區,從而確保I2C
總線驅動程序的互斥操作。使用信號量也可以實現I2C 總線驅動程序的互斥操作。若要使用
信號量,則必須在OS_cfg.h 的EN_OS_SEM 置為1,把SmallRTOS 配置為允許使用信號量。
示例程序中未對PCF8563 進行校時處理,用戶可以自行添加代碼以實現此功能。
評論
查看更多