|
本程序主要用作串口接收幀指令而產(chǎn)生的相應(yīng)動(dòng)作,本程序完全自已編寫使用。比較可靠
bit Uart1_RX_OK_Flag=0; //串口1接收數(shù)據(jù)正確標(biāo)志
bit Uart1_flagTxd = 0; //單字節(jié)發(fā)送完成標(biāo)志,用來替代 TXD 中斷標(biāo)志位
u16 xdata Uart1_cntRxd = 0; //接收字節(jié)計(jì)數(shù)器
u8 xdata Uart1_Rxd_buff[200]={0}; //串口1接收緩沖區(qū)串口數(shù)據(jù),接收中斷中使用
u8 Uart1_flagFrame_50ms = 0; //串口1幀接收完成標(biāo)志,即接收到一幀新數(shù)據(jù) 串口1幀標(biāo)志時(shí)間為50MS,超過50MS為1幀完
bit Uart1_flag_en = 0;
//串口1指令使能標(biāo)志
void Uart1_Init() //115200bps@24MHz
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
TL1 = 0xCC; //設(shè)定定時(shí)初值
TH1 = 0xFF; //設(shè)定定時(shí)初值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
ES=1;
TI=0;
}
/* 串口中斷服務(wù)函數(shù) */
void InterruptUART() interrupt 4
{
static u8 i=0;
u16 temchar=0;
if (RI) //接收到新字節(jié)
{
Uart1_flagFrame_50ms = 0; //串口1幀接收完成標(biāo)志清零,即接收到一幀新數(shù)據(jù) 串口1幀標(biāo)志時(shí)間為50MS,超過50MS為1幀完
Uart1_flag_en = 1; ////接收貞處理標(biāo)志
temchar=SBUF; //清零接收中斷標(biāo)志位
RI = 0; //清零接收中斷標(biāo)志位
if(temchar==0x7f)
{
i++;
if(i>=16)
{ i=0;IAP_CONTR |= 0x60; } //這個(gè)作用用于自動(dòng)重啟,自動(dòng)燒錄,不用重新上電
}
else
{ i=0;}
if (Uart1_cntRxd <Uart1_bufcnt) //接收緩沖區(qū)尚未用完時(shí),
{
Uart1_Rxd_buff[Uart1_cntRxd++] = temchar;
} //保存接收字節(jié),并遞增計(jì)數(shù)器
}
if (TI) //字節(jié)發(fā)送完畢
{
TI = 0; //清零發(fā)送中斷標(biāo)志位
Uart1_flagTxd = 1; //設(shè)置字節(jié)發(fā)送完成標(biāo)志
}
}
void Uart1_Action() //串口功能函數(shù),Uart1_drive()中調(diào)用
{
u8 *pbuf; u16 Len=0;
pbuf=&Uart1_Rxd_buff[0]; //接收緩沖區(qū)指針轉(zhuǎn)換,長(zhǎng)度轉(zhuǎn)換。
if(CmpMemory(pbuf,&cmd1[0], sizeof(cmd1)-1)) //指令比較,
{
}
}
void Uart1_drive() //串口功能函數(shù),主循環(huán)中調(diào)用
{
if(Uart1_flagFrame_50ms>=50&&Uart1_flag_en) //串口1指令使能標(biāo)志 ==0) //接收幀計(jì)時(shí)到,并且未處理數(shù)據(jù)指令
{
Uart1_Action();
Clear_array(Uart1_Rxd_buff, Uart1_bufcnt ); //清空RXD接收緩沖區(qū)
Clear_array(DATA_BUFF_RXD, 8); //清空臨時(shí)數(shù)據(jù)緩沖區(qū)
Uart1_cntRxd=0; //接收字節(jié)清零
Uart1_flag_en=0; //幀功能處理標(biāo)志,處理為標(biāo)志1
Uart1_flagFrame_50ms=0;
}
}
void TM0_Isr() interrupt 1 //定時(shí)器0中斷函數(shù)1mS
{
if(Uart1_flagFrame_50ms<50&&Uart1_flag_en) //串口1幀接收完成標(biāo)志,即接收到一幀新數(shù)據(jù) 串口1幀標(biāo)志時(shí)間為50MS,超過50MS為1幀完
Uart1_flagFrame_50ms++;
}
|
評(píng)分
-
查看全部評(píng)分
|