?? serial
字號:
#include <AT89X52.H>
#define UCHAR unsigned char
#define RLEN 4
UCHAR data r_buf[RLEN]; //串行接收緩存區的大小(非循環)
UCHAR r_in,check; //定義緩沖區的隊列指針,校驗指針
bit read_flag=0; //定義接收區取數標志位
bit rbuf_flag=0; //定義接收數據是否放入緩存區標志
void serial(void) interrupt 4
{
UCHAR ch;
RI=0;
ch=SBUF;
if(~rbuf_flag&ch==0x55)
{
rbuf_flag=1;
r_in=0;
}
if(rbuf_flag)
{
r_buf[r_in]=ch;
r_in=r_in++;
if(r_in==RLEN)
{
rbuf_flag=0;
read_flag=1;
r_in=0;
}
}
}
/******* 接收數據包有效函數*********/
bit valid(void)
{ UCHAR check=0x55;
UCHAR i;
if(read_flag&&r_buf[2]==slave)
{
for(i=0;i<3;i++)
{
check|=r_buf[i];
}
if(check==r_buf[3])
{return(1);
}
else return(0);
}
/*********數據打包發送程序*******/
viod packet(UCHAR c)
{UCHAR data *p,i,check;
check=0x55 | c | slave;
if(c==0xD8)
{
p=(&collectdata);
}
if(c==0x49)
runDog();
ctrl485=0; //置位485總線處于發送
for(i=0;i<1000;i++); //延時一會
SBUF=0xAA;
while(TI==0);
TI=0;
SBUF=c;
while(TI==0);
TI=0;
SBUF=slave;
while(TI==0);
TI=0;
if(c==0xD8)
{
p=(&collectdata);
for(i=0;i<9;i++)
{SBUF=*p;
check|=*p;
while(T==0);
T=0;
}
if(c==0x49){}
SBUF=check;
while(T==0);
T=0;
for(i=0;i<1000;i++); //延時一會
ctrl485=1; //置位485為接收狀態
}
/********接受數據包處理函數*****/
viod Process(viod)
{ UCHAR data c;
UCHAR xdata *p;
if(valid())
{
swith(r_bluf[0])
{case 01:{c=0xD8;
packet(c);
}
break;
case 02:{c=r_bluf[2]; //c為開關位
runDog(); //喂狗
while(valid()); //等待接收命令為03的數據包
if(r_bluf[0]==0x03)
{p=0x1000;
/*對開關位的操作*/
packet(c);
}
break;
default: break;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -