×
单片机 > 单片机程序设计 > 详情

89C52串口通信

发布时间:2020-09-02 发布时间:
|
#include

unsigned char flag,a;
void main()
{

 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() interrupt 4     //用中断方式接收串行数据,当RI=1或者TI=1时进入此中断服务程序
{
 RI=0;            //手动清零RI
 a=SBUF;          //把接受缓冲器的值赋给变量a
 flag=1;          //自己定义的标志位
}

上面给出了两种串口通信方法:查询法和中断法,一般用中断法(中断多好用啊!),注意用中断法时一定要注意软件清零 RI和 TI寄存器,因为串口中断服务程序进入的条件是RI=1或者TI=1,而只要接受完一帧数据后RI会自动置1(发送完一帧数据后TI会自动置1),RI,TI只能手动软件清零,如果不清零则会反复进入中断服务程序,从而使程序进入循环发送或者接受的状态。

 

关键字:89C52 串口通信 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机的定时器与计数器