编译过程中,总是提示不能打开"UART.h",但是"UART.h"文件是存在的
#define _RTC_C
#include "reg52.h"
#include "intrins.h"
#include "Uart.h"
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}
sbit RTC_INT = P1^3;
sbit RTC_SDA = P1^4;
sbit RTC_SCL = P1^5;
void DateCheck();
void InitINS8130();
unsigned char INSReadByte(unsigned char addr);
void INSWriteByte(unsigned char addr, unsigned char dat);
void I2CStart();
void I2CStop();
bit I2CWrite(unsigned char dat);
unsigned char I2CReadNAK();
unsigned char I2CReadACK();
void DateCheck()
{
unsigned char i;
unsigned char time[8];
unsigned char flag;
flag = INSReadByte(0x1D); //读取Flag registers寄存器
if((flag & 0x20) != 0) //判断UF位是否为1,1表示有时间更新
{
for(i=0;i<7;i++) //time6-0存放年、月、日、周、时、分、秒
{
time[i] = INSReadByte(0x10 + i);//0x10为SEC起始地址
UartSend(time[i]); //发送年月日时分秒
}
INSWriteByte(0x1D,0x06);//UF位清零,写入寄存器默认值0x06
}
}
void InitINS8130()
{
unsigned char i;
unsigned char code InitTime[] = {0x00,0x30,0x12,0x01,0x01,0x01,0x24};
for(i=0; i<7; i++) //设置初始时间为24年01月01日 周1 12点30分00秒
{
E2WriteByte(0x10 + i, InitTime[i]);
}
}
unsigned char INSReadByte(unsigned char addr)
{
do{
I2CStart();//步骤1:发送起始条件
if(I2CWrite(0x32<<1)) //步骤2和3:发送写模式和地址,验证ACK信号
{
break;
}
I2CStop();
}while(1);
do
{
if(I2CWrite(addr))//步骤4和5:发送8130读取地址,验证ACK信号
{
break;
}
}while(1);
I2CStart(); //步骤6:发送RESTART
do{
if(I2CWrite((0x32 << 1) | 0x01))//步骤7和8:发送读模式和地址;验证ACK信号
{
break;
}
}
dat = I2CReadNAK();//步骤9:CPU读取数据
I2CStop();
return dat;
}
void INSWriteByte(unsigned char addr, unsigned char dat)//单字节写入
{
do{
I2CStart();//步骤1:发送启动条件
if(I2CWrite(0x32<<1))//步骤2和3:发送从地址和写模式,验证ACK信号。RTC地址0b0110010
{
break;
}
I2CStop();
}while(1);
do{
if(I2CWrite(addr))//步骤4和5:发送写地址,验证ACK信号
{
break;
}
}while(1);
do{
if(I2CWrite(dat))//步骤6和7:写入数据到addr
{
break;
}
}while(1);
I2CStop();
}
void I2CStart()
{
RTC_SDA = 1; //首先确保SDA、SCL都是高电平
RTC_SCL = 1;
I2CDelay();
RTC_SDA = 0; //先拉低SDA
I2CDelay();
RTC_SCL = 0; //再拉低SCL
}
void I2CStop()
{
RTC_SCL = 0; //首先确保SDA、SCL都是低电平
RTC_SDA = 0;
I2CDelay();
RTC_SCL = 1; //先拉高SCL
I2CDelay();
RTC_SDA = 1; //再拉高SDA
I2CDelay();
}
/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */
bit I2CWrite(unsigned char dat)
{
bit ack; //用于暂存应答位的值
unsigned char mask; //用于探测字节内某一位值的掩码变量
for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{
if ((mask&dat) == 0) //该位的值输出到SDA上
RTC_SDA = 0;
else
RTC_SDA = 1;
I2CDelay();
RTC_SCL = 1; //拉高SCL
I2CDelay();
RTC_SCL = 0; //再拉低SCL,完成一个位周期
}
RTC_SDA = 1; //8位数据发送完后,主机释放SDA,以检测从机应答
I2CDelay();
RTC_SCL = 1; //拉高SCL
ack = RTC_SDA; //读取此时的SDA值,即为从机的应答值
I2CDelay();
RTC_SCL = 0; //再拉低SCL完成应答位,并保持住总线
return (~ack); //应答值取反以符合通常的逻辑:
//0=不存在或忙或写入失败,1=存在且空闲或写入成功
}
unsigned char I2CReadNAK()
{
unsigned char mask;
unsigned char dat;
RTC_SDA = 1;
for(mask=0x80; mask!=0; mask>>=1)
{
I2CDelay();
RTC_SCL = 1;
if(RTC_SDA == 0)
dat &= ~mask;
else
dat |= mask;
I2CDelay();
RTC_SCL = 0;
}
RTC_SDA = 1;
I2CDelay();
RTC_SCL = 1;
I2CDelay();
RTC_SCL = 0;
return dat;
}
unsigned char I2CReadACK()
{
unsigned char mask;
unsigned char dat;
RTC_SDA = 1;
for(mask=0x80; mask!=0; mask>>=1)
{
I2CDelay();
RTC_SCL = 1;
if(RTC_SDA == 0)
dat &= ~mask;
else
dat |= mask;
I2CDelay();
RTC_SCL = 0;
}
RTC_SDA = 0;
I2CDelay();
RTC_SCL = 1;
I2CDelay();
RTC_SCL = 0;
return dat;
}