基于STC15系列单片机的串口中断例程

#include 


#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寄存器。但是在接收或发送第一个数据时,就不难发现发送(接收)函数是发挥不了作用的。这是因为发送(接收)允许位是在中断中置位为真的,而在未发送(接收)数据时,程序是无法进入中断的。所以在发送(接收)函数中,程序会一直处在空循环中,而不能实现相应的功能。因此,在初始化串口后,加入串口启动函数,实现串口的第一个数据的发送和接收,从而使程序可以顺利进入中断。

 

 

你可能感兴趣的:(嵌入式,单片机,单片机,c语言)