#include
unsigned char flag,a;
void main()
{
本文引用地址:
//m.amcfsurvey.com/article/201611/320634.htm
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd; //
TL1=0xfd; //用T1定时器设置波特率
TR1=1;//定时器1工作
REN=1;//串口允许接收
SM0=0;//
SM1=1;//串行口工作方式1
EA=1;//CPU中断允许
ES=1;//串行口中断允许
while(1)
{
if(flag==1)//中断法串口通信
{
ES=0;//单片机向PC发数据时应关掉串口中断,因为发数据时
//也会引起中断,会进入中断服务程序,从而引起死循环,这一步很重要
flag=0;
SBUF=1;//发字符1
while(!TI);//等待TI是否为1,TI=1时说明发送数据完成
TI=0;//手动清零TI
SBUF=a; //把a的值放入发送缓冲器;
while(!TI);
TI=0;
ES=1;//开串口中断
}
}
}
void ser()interrupt4//用中断方式接收串行数据,当RI=1或者TI=1时进入此中断服务程序
{
RI=0;//手动清零RI
a=SBUF;//把接受缓冲器的值赋给变量a
flag=1;//自己定义的标志位
}
上面给出了两种串口通信方法:查询法和中断法,一般用中断法(中断多好用啊!),注意用中断法时一定要注意软件清零 RI和 TI寄存器,因为串口中断服务程序进入的条件是RI=1或者TI=1,而只要接受完一帧数据后RI会自动置1(发送完一帧数据后TI会自动置1),RI,TI只能手动软件清零,如果不清零则会反复进入中断服务程序,从而使程序进入循环发送或者接受的状态。
评论