微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 89C52串口通信

89C52串口通信

时间:11-24 来源:互联网 点击:
#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只能手动软件清零,如果不清零则会反复进入中断服务程序,从而使程序进入循环发送或者接受的状态。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top