//-------------------------------------------------------------------------* //工程名: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; //接收正确帧标志 void main(void) { //变量定义 INT8U i,j,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码(首字节:帧头) //关总中断 DisableMCUint(); //芯片初始化 MCUInit(); //模块初始化 SCIinit(); //(1) 串行口初始化(波特率:9600,查询方式) IICinit(); //(2) IIC通信初始化(IIC波特率 = 62.5KHz) SCIsend1('9'); while (IICwriteN(0xA2, 0x00, WriteData, 15));//(3) 初始化时钟芯片PCF8563 //for(;;); //初始时间设置:2007.06.01 14:00 Mon //开放各模块中断 EnableMCUint(); //(1) 开放总中断 EnableSCIreInt(); //(2) 开放串行接收中断 SCIsend1('0'); //主循环 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] &= 0b01111111; //VL位清零 if (WriteData[7] == 0x19) //设置月寄存器的世纪位 WriteData[5] |= 0b10000000; else WriteData[5] &= 0b01111111; while(IICwriteN(0xA2, 0x02, WriteData, 7)); Flag = 0; } //从PCF8563读出时间的BCD码,存入ReadData while(IICreadN(0xA2, 0x02, ReadData, 7)); //SCIsend1('2'); if (Sec != (ReadData[0] & 0b01111111))//秒值发生变化就,转换数据格式并发送 { //处理ReadData中的7个时间数据 for (i = 0;i < 7;i++) { switch(i) { case 0://秒和分数据的最高位不用,清零 case 1: ReadData[i] &= 0b01111111; break; case 2://时和天数据的高两位不用,清零 case 3: ReadData[i] &= 0b00111111; break; case 4://星期数据的高五位不用,清零 ReadData[i] &= 0b00000111; break; case 5://月数据的6、5两位不用 if ((ReadData[i] & 0b10000000) == 0) { SendBuf[15] = '2'; SendBuf[16] = '0'; } else { SendBuf[15] = '1'; SendBuf[16] = '9'; } ReadData[i] &= 0b00011111; break; default: break; } //BCD码转为ASCII码 SendBuf[2*i+2] = (ReadData[i] & 0b00001111) + 0x30; SendBuf[2*i+1] = ((ReadData[i] & 0b11110000) >> 4) + 0x30; } SendBuf[0] = '#'; //'#'作为帧头 Sec = ReadData[0]; SCIsendN(17,SendBuf); } } }