单片机实验
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 进行校时处理,用户可以自行添加代码以实现此功能。
全部0条评论
快来发表一下你的评论吧 !