本程序主要用作串口接收帧指令而产生的相应动作,本程序完全自已编写使用。比较可靠
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++;
}
|