#include <STC15F2K60S2.H>
#define FOSC 12000000 //晶振频率
#define BAUD 9600 //设置波特率
unsigned char ruart(); //串口接收一个字节数据
void tuart(unsigned char trdate); //串口发送一个字节数据
void init(); //串口初始化函数
void Staruart(); //启动串口函数
bit Rflag=0; //接收数据标志
bit Tflag=0; //发送数据标志
void main()
{
unsigned char i;
init();
Staruart();
while(1)
{
i=ruart();
tuart(i);
}
}
void uart() interrupt 4 //串口中断
{
if(RI) //判断串口是否完成接收一个字节数据
{
RI=0;
Rflag=1;
}
if(TI) //判断串口是否完成发送一个字节数据
{
TI=0;
Tflag=1;
}
}
unsigned char ruart()
{
unsigned char redate;
while(~Rflag);
if(Rflag)
{
Rflag=0;
redate=SBUF;
}
return redate;
}
void tuart(unsigned char trdate)
{
while(~Tflag);
if(Tflag)
{
Tflag=0;
SBUF=trdate;
}
}
void init()
{
SCON=0X50;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0X14;
AUXR|=0X01;
ES=1;
EA=1;
}
void Staruart()
{
unsigned char i;
i=0x0f;
SBUF=i;
i=SBUF;
}
上图所示例程为全部代码
该例程采用串口中断的方式实现数据的接收。相比较轮询模式而言,中断方式占用资源较少,不需要隔一段时间就访问SBUF寄存器,只要完成接收或者发送数据之后,就会产生中断,因此我们可以在中断中继续发送或者接收数据。
在例程中,使用发送(接收)函数,当发送(接收)允许位(Tflag)为假时,程序就会进入空循环中,当允许位(Tflag)为真时,程序就会跳出空循环,从而进入发送(接收)部分,即写(读)SBUF寄存器。但是在接收或发送第一个数据时,就不难发现发送(接收)函数是发挥不了作用的。这是因为发送(接收)允许位是在中断中置位为真的,而在未发送(接收)数据时,程序是无法进入中断的。所以在发送(接收)函数中,程序会一直处在空循环中,而不能实现相应的功能。因此,在初始化串口后,加入串口启动函数,实现串口的第一个数据的发送和接收,从而使程序可以顺利进入中断。