📄 main.c
字号:
//-------------------------------------------------------------------------*
//工程名:IIC.prj *
//硬件连接: *
// (1) MCU的串口与PC方的COM相连(参见"SCI.c"文件) *
// (2) MCU的IIC接口与时钟芯片的IIC接口相连(参见"IIC.c"文件) *
//功能说明:MCU与时钟芯片PCF8563通过IIC总线通信,MCU从PCF8563获得时间,并通过 *
// 串口发给PC.该程序可以与相由VB编写的配套的显示程序一起使用 *
//-------------------------------------------------------------------------*
//总头文件
#include "Includes.h" //头文件(具体型号在头文件的第一行)
INT8U ReBuf[17]; //存放从PC接收的从秒到年的ASCII码(首字节:帧头)
INT8U Flag = 0; //接收正确帧标志
//主函数
int main(void)
{
INT8U i,k; //(1) 循环控制变量
INT8U Sec = 0xff; //(2) 记录秒值
//(3) 初始写入PCF8563寄存器的值:CSR1,2, 秒, 分钟,小时,天, 星期,月,
INT8U WriteData[15] = {0x00,0x00,0x00,0x00,0x14,0x01,0x01,0x06,
// 年, 分钟报警,小时报警,日期报警,周报警,
0x07,0x80, 0x80, 0x80, 0x80,
// CLKOUT频率,定时器控制
0x00, 0x00};
INT8U ReadData[7]; //(3) 依次存放秒,分,小时,日,星期,月,年数值的BCD码
INT8U SendBuf[17]; //(4) 存放要发送的从秒到年的ASCII码(首字节:帧头)
//(1)关总中断
DISABLE_INTERRUPTS;
//(2)芯片初始化
MCUInit();
//(3)模块初始化
SCIInit(); //(1) 串行口初始化(波特率:9600,查询方式)
IICInit(); //(2) IIC通信初始化(IIC波特率 = 62.5KHz)
while (IICwriteN(0xA2, 0x00, WriteData, 15));//(3) 初始化时钟芯片PCF8563
//初始时间设置:2007.06.01 14:00 Mon
//(4)开放各模块中断
EnableSCIReInt; //(1) 开放串行接收中断
//(5)开放总中断
ENABLE_INTERRUPTS;
//主循环
while (1)
{
if (Flag == 1) //接收到正确的一帧
{
//处理从秒到年数据(2字节ASCII合为1字节的压缩BCD)
for (i = 0;i < 8;i++)//最后一个字节为世纪字节
{
k = (ReBuf[2*i+1] - '0') << 4;
WriteData[i] = k | (ReBuf[2*i+2] - '0');
}
//按照时间寄存器格式,进一步处理WriteData中的时间数据
WriteData[0] &= 0x7F; //VL位清零
if (WriteData[7] == 0x19) //设置月寄存器的世纪位
WriteData[5] |= 0x80;
else
WriteData[5] &= 0x7F;
while(IICwriteN(0xA2, 0x02, WriteData, 7));
Flag = 0;
}
//从PCF8563读出时间的BCD码,存入ReadData
while(IICreadN(0xA3, 0x02, ReadData, 7));
if (Sec != (ReadData[0] & 0x7F))//秒值发生变化就,转换数据格式并发送
{
//处理ReadData中的7个时间数据
for (i = 0;i < 7;i++)
{
switch(i)
{
case 0://秒和分数据的最高位不用,清零
case 1:
ReadData[i] &= 0x7F;
break;
case 2://时和天数据的高两位不用,清零
case 3:
ReadData[i] &=0x3F;
break;
case 4://星期数据的高五位不用,清零
ReadData[i] &= 0x07;
break;
case 5://月数据的6、5两位不用
if ((ReadData[i] &0x80) == 0)
{
SendBuf[15] = '2';
SendBuf[16] = '0';
}
else
{
SendBuf[15] = '1';
SendBuf[16] = '9';
}
ReadData[i] &= 0x1F;
break;
default:
break;
}
//BCD码转为ASCII码
SendBuf[2*i+2] = (ReadData[i] & 0x0F) + 0x30;
SendBuf[2*i+1] = ((ReadData[i] & 0xF0) >> 4) + 0x30;
}
SendBuf[0] = '#'; //'#'作为帧头
Sec = ReadData[0];
SCISendN(17,SendBuf);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -