PCF8563驱动程序演示实验

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 进行校时处理,用户可以自行添加代码以实现此功能。

甲烷一氧化碳双气传感器保护家庭用气安全
如何清洁平板电视脏屏幕
DIY:牛人教你改造魅族MX2 实现无线充电
三星研发折叠屏手机,价格会更便宜
华为与岚图签署战略合作,推动智能化技术商业化
PCF8563驱动程序演示实验
解读电动汽车转子油冷电机方案
首个使用独立标准的B2B用户社区在亚太地区成立
小米10换芯版要来了,外观与小米10至尊纪念版相似
在中国经济转型、消费升级和供给侧变革中,新零售扮演着举足轻重的作用
VL817以及迭代型号VL817S原理图规格书示例
解析wlan与wifi的区别
使用单片机实现彩灯设计的资料概述
人工智能该有道德观?阿里罗汉堂的数字经济十个问题
日本科技巨头NEC将支援英国的5G建设
三星将推一款智能机械混合手表
功率放大器在微纳颗粒磁场驱动控制系统的应用
湖南为防疫引进移动直线马达方舱CT
构建一个简单的廉价电缆示踪电路
顶级分析师预测2020年苹果手机重点在5G 2021年在高端手机上取消充电插头