📄 tmain.c
字号:
//工程模版
#include <Reg52.H>
#include <globe.h>
#include <const.h>
#include <function.h>
#define DEBUF_CLOCK
sbit SDA=P1^0;
sbit SCL=P1^1;
void IICStart(void)
{
SCL=0; //
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1; //
}
//-----------------停止IIC总线----------------/
void IICStop(void)
{
SCL=0;
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
}
//--------------检查应答位-------------------/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
CY=SDA; //因为返回值总是放在CY中的
SCL=0;
return(CY);
}
//---------------对IIC总线产生应答-------------------/
void IICACK(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=1;
}
//-----------------不对IIC总线产生应答---------------/
void IICNoAck(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}
//-------------------向IIC总线写数据---------------------/
void IICSendByte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
//----------------------从IIC总线上读数据子程序----------/
unsigned char IICReceiveByte(void)
{
register receivebyte,i=8;
SCL=0;
while(i--)
{
SCL=1;
receivebyte=(receivebyte<<1)|SDA;
SCL=0;
}
return(receivebyte);
}
//---------------一个简单延时程序------------------------/
void Delay(unsigned char DelayCount)
{
while(DelayCount--);
}
bit ReadIIC(unsigned char SlaveAddress,unsigned char raddr,unsigned char *rdata,unsigned char num)
{
unsigned char i;
bit errorflag=1;
i=ERRORCOUNT;
while(i--)
{
IICStart();
IICSendByte(SlaveAddress&0xFE);//Write
if(IICRecAck())
continue;
IICSendByte(raddr);
if(IICRecAck())
continue;
IICStart();
IICSendByte(SlaveAddress|0x01);//Read
if(IICRecAck())
continue;
while(--num)
{
*rdata++=IICReceiveByte();
IICACK();
}
*rdata=IICReceiveByte(); //read last byte data
IICNoAck();
IICStop();
errorflag=0;
break;
}
return(errorflag);
}
bit WriteIIC(unsigned char SlaveAddress,unsigned char waddr,unsigned char *wdata,unsigned char num)
{
unsigned char i;
bit errorflag=0;
i=ERRORCOUNT;
while(i--)
{
IICStart();
IICSendByte(SlaveAddress&0xFE);
if(IICRecAck())
continue;
IICSendByte(waddr);
if(IICRecAck())
continue;
while(num--)
{
IICSendByte(*wdata++);
if(!IICRecAck())
continue;
errorflag=1;
break;
}
if(!errorflag)
break;
}
IICStop();
Delay(255);
Delay(255);
Delay(255);
Delay(255);
if(i==0)
errorflag=1;
return(errorflag);
}
#define PCF8563_WRITE 0xA2
#define PCF8563_READ 0xA3
#define SetClock(startadd,wnum) WriteIIC(PCF8563_WRITE,startadd,Clock_buf,wnum)
#define ReadClock(startadd,wnum) ReadIIC(PCF8563_READ,startadd,Clock_buf,wnum)
//BCD
struct Ttime
{
unsigned int Year;
unsigned char Month;
unsigned char Date;
unsigned char Day;
unsigned char Hour;
unsigned char Minute;
unsigned char Second;
};
struct Ttime RealTime;
unsigned char idata Clock_buf[7];
unsigned int cdcread_msdelay;
main()
{
MCU_Init();
Val_Init();
#ifdef DEBUF_CLOCK
Clock_buf[0]=0x00;
Clock_buf[1]=0x00;
Clock_buf[2]=0x12;
Clock_buf[3]=0x06;
Clock_buf[4]=0x03;
Clock_buf[5]=0x01;
Clock_buf[6]=0x05;
SetClock(2,7);
#endif
while(1)
{
if(!cdcread_msdelay)
{
BUZZER=!BUZZER;
ReadClock(2,7);
if((Clock_buf[5]&0x80)==0x00)RealTime.Year=0x2000|Clock_buf[6];
else RealTime.Year=0x1900|Clock_buf[6];
RealTime.Month=Clock_buf[5]&0x1F;
RealTime.Date=Clock_buf[3]&0x3F;
RealTime.Day=Clock_buf[4]&0x07;
RealTime.Hour=Clock_buf[2]&0x3F;
RealTime.Minute=Clock_buf[1]&0x7F;
RealTime.Second=Clock_buf[0]&0x7F;
#ifdef DEBUF_CLOCK //测试 从串口发送日期时间数据
ES=0;
SBUF=Hi(RealTime.Year);
while(!TI);
TI=0;
SBUF=Lo(RealTime.Year);
while(!TI);
TI=0;
SBUF=RealTime.Month;
while(!TI);
TI=0;
SBUF=RealTime.Date;
while(!TI);
TI=0;
SBUF=RealTime.Day;
while(!TI);
TI=0;
SBUF=RealTime.Hour;
while(!TI);
TI=0;
SBUF=RealTime.Minute;
while(!TI);
TI=0;
SBUF=RealTime.Second;
while(!TI);
TI=0;
ES=1;
#endif
cdcread_msdelay=1000;//一秒钟读一次时间
}
}
}
//--------------------------------------------
//T0 Interrupt Time is 1ms
//#define TF0_VECTOR 1 /* 0x0B Timer 0 */
//
Timer0Interrupt(void) interrupt TF0_VECTOR using 3
{
TH0 = 0xFC;
TL0 = 0x66;
sys_ms_count++;
if(cdcread_msdelay)cdcread_msdelay--;
}
//-------------------------------------------
//#define UART_VECTOR 4 /* 0x23 UART */
SIOInterrupt(void) interrupt UART_VECTOR using 2
{
if(RI)
{
RI=0;
}
if(TI)TI=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -