资源描述
串口通信示例程序:
该程序是用查询法控制串口,显示的结果为,通过串口发送一个数据,对应的发光二极管点亮。如发送数据0xfe,第一个二极管亮。
查询法
#include<reg52.h>
void main()
{
REN=1;//串口允许接收
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给T1 赋初值
TL1=0xfd;
TR1=1;//TCON中的TR1位置1
SM0=0;//设置SCON寄存器,设为方式1
SM1=1;
while(1)
{
if(RI==1) //查询法,看是否收到数据了
{
RI=0;//一旦收到数据了,清零RI必须软件清零
//P1=0x00;
P1=SBUF;//从串口读入数据
}
}
}
中断法
通过中断方式控制串口
#include<reg52.h>
void main()
{
REN=1;//串口允许接收
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给T1 赋初值
TL1=0xfd;
TR1=1;//TCON中的TR1位置1
SM0=0;//设置SCON寄存器,设为方式1
SM1=1;
EA=1;//开总中断
ES=1;//开串口中断
while(1)
{
}
}
//加上中断函数变为中断方式
void ser() interrupt 4
{
RI=0;//一旦收到数据了,清零RI必须软件清零
P1=SBUF;//从串口读入数据
}
修改程序,让串口发给单片机数据,然后让单片机再发回来:
#include<reg52.h>
unsigned char a,flag;
void main()
{
REN=1;//串口允许接收
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给T1 赋初值
TL1=0xfd;
TR1=1;//TCON中的TR1位置1
SM0=0;//设置SCON寄存器,设为方式1
SM1=1;
EA=1;//开总中断
ES=1;//开串口中断
while(1)
{
if(flag==1)
{
flag=0;
SBUF=a;//把a送给SBUF,调用接收缓存器,两个SBUF物理地址
//相同,但是意义不同
while(!TI); //发送完TI会置1,要手动清零
TI=0; //TI发送中断标志位
}
}
}
void ser() interrupt 4
{
RI=0;//一旦收到数据了,清零RI(接收中断标志位),必须软件清零
P1=SBUF;//从串口读入数据 SBUF赋给P1口
a=SBUF;//使用发送缓存器
flag=1;
}
这种情况的结果是单片机不停的在发数,串口一直收到数据。要在收数时关闭中断,让单片机停止发数。
将程序做如下修改
#include<reg52.h>
unsigned char a,flag;
void main()
{
REN=1;//串口允许接收
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给T1 赋初值
TL1=0xfd;
TR1=1;//TCON中的TR1位置1
SM0=0;//设置SCON寄存器,设为方式1
SM1=1;
EA=1;//开总中断
ES=1;//开串口中断
while(1)
{
if(flag==1)
{
ES=0; //发送数据时关掉串口
flag=0;
SBUF=a;//把a送给SBUF,调用接收缓存器,两个SBUF物理地址相同,但是意义不同。可以发字符串,比如SBUF=‘b’;
while(!TI); //发送完TI会置1,要手动清零
TI=0;
ES=1;// 发送完数据时打开串口
}
}
}
//加上中断函数变为中断方式
void ser() interrupt 4
{
RI=0;//一旦收到数据了,清零RI(接收中断标志位),必须软件清零
P1=SBUF;//从串口读入数据 SBUF赋给P1口
a=SBUF;//使用发送缓存器
flag=1;
}
展开阅读全文