#include <reg51.h>
#define uch unsigned char
#define uint unsigned int
/*=========================================*/
bit com_over;
bit com_ok;
bit T;
uch data com_buf[30];
uch data com_num=0;
uch data send_num=0;
uch data com_delay;
uch data temp[5];
void System_init(void)
{
TMOD=0x21;
SCON=0x70;//SM0=0,SM1=1,SM2=1,REN=1,TB8=0,RB8=0,TI=0,RI=0
PCON=0x80;//波特率加倍
TH0=0xb8;//for 11.0592 定时10MS
TL0=0x00;
P1 = 0X00;
TH1=TL1=0xfa; // 9600 for 11.0592
TR0=1;
TR1=1;
ET0=1;
REN=1;
ES=1;
EA=1;
com_over=0;
com_delay=0;
com_num=0;
}
void main(void)
{
System_init();
while(1)
{ if(com_ok)
{
ES=0;
com_ok=0;//表明串口接受数据成功,这里先清标读
//这里可以加一些需要处理的子程序
//下面可以对收到的数据进行处理,这里收到的数据会通过串口发送出去,
//==================================================================================
//这里发送数据采用查询方式来做,
send_num=0;
do
{
temp[0]=com_buf[send_num];
SBUF=com_buf[send_num];//SBUF赋值后,会自动进入中断去判断有没有发送成功,
while(!TI);//通过TI是不是1来判断
TI=0;
send_num++;
}while(temp[0]!=0x0d);
REN=1;
ES=1;
//==================================================================================
/* //这里发送数据采用中断方式来做,
send_num=0;
ES=1; //开启串口中断
SBUF=com_buf[send_num];//SBUF赋值后,会自动进入中断去判断有没有发送成功,
*/
//==================================================================================
}
}
}
void timer0() interrupt 1 //定时器0中断
{
TH0=0xb8; //10ms,11.0592MHz
TL0=0x00;
if(com_over)
{ com_delay++;
if(com_delay>=3)
{ com_delay=0x00;
com_over=0;
com_num=0;
}
}
}
void serial0() interrupt 4
{
if(RI)
{ RI=0;//表示收到数据,这里先清RI
com_over=1;com_delay=0;//开启通信超时
com_buf[com_num]=SBUF;//把收到数据放进数组里
if(com_buf[com_num]==0x0d) //判断是不是收到最后一个数据
{ com_over=0;com_delay=0;//串口数据已经收完,关闭通信超时
com_num=0;
REN=0;//关闭串口接受,到主程序里面判断是否还要重新打开
if(com_buf[0] == 0x32)
{
if(com_buf[1] == 0x32)
{
if(com_buf[2] == 0x39)
{
if(com_buf[3] == 0x36)
{
if(com_buf[4] == 0x39)
{
P1 = 0xff;
}
}
}
}
}
com_ok=1;//置数据接受标志
}
else
com_num++;//不是最后一个数据,+1,方便接收下一个数据
}
else if(TI)
{ TI=0;//表示数据已经发送成功,这里先清TI
if(com_buf[send_num]==0x0d) //数据是不是最后一个字节
{ send_num=0;REN=1;//发送数据完成,开启串口接收
}
else
{ send_num++;//不是最后一个字节,继续发送数据
SBUF=com_buf[send_num];
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>