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