串口通信的定时器实现方法

串口通信的定时器实现方法


之前使用了IO控制+软件延时的方法,模拟了串口的工作,更为重要的是了解了串口的工作原理.现在将使用定时器+中断来实现延时从而实现对延时更加精确的把控.

在这里首先提一下我们选择的定时器工作模式为 8位自动重装载 .因为避免了每次对定时器初始值的装载,所以时间也会相对准确些.
然后将提一下定时器初始值的计算方法.(这里以波特率BaudRate = 4800 为例进行计算);
当波特率为4800时,单片机的接受速率为  1/4800 s/bit, 所以定时器每隔 1/4800 s就要进入一次中断并且发送一位数据.定时器的初始值计算方法为     (256 - 初始值)* 12/11.0592M(晶振频率)  =  1/4800   ;所以可以求出初始值N;

下面给出我自己试验是的代码.是在晶振12.0M下波特率为4800下实现的;
/* 
	串口通信的定时器实现方式 
	通过定时器1,波特率4800
*/
#include 
#include 

sbit UartTransfer = P3^1;  //单片机接受
unsigned char myData,flag;
void Delay500ms();
void main()
{ 	
	ET1 = 1;				//打开定时器中断
	EA = 1;					//打开总中断
	TMOD &= 0x0f;
	TMOD |= 0x20;
	TH1 = TL1 = 0x30;  		//定时器的配置	
	flag = 0;				//标志位置零
	UartTransfer = 1;
	_nop_();	   
	_nop_();	
	while(1)
	{
	   myData = 'A';
	   UartTransfer = 0; 	//UartStart
	   TR1 = 1;				//打开定时器
	   while(TR1);
	   myData = 'B';
	   UartTransfer = 0; 	//UartStart
	   TR1 = 1;				//打开定时器
	   Delay500ms();
	}
}

void Time1_itr(void) interrupt 3
{
	if(flag<8) 				//send 8bit
	{
		if(myData&0x01) UartTransfer = 1;
		else UartTransfer = 0; 
		flag++;
		myData >>= 1;		
	}
	else
	{
		if(flag == 8)
		{
			UartTransfer = 1; //UartStop
			flag ++;
		}
		else
		{
			flag = 0;
			TR1 = 0;
		}
	}
}

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



你可能感兴趣的:(51系列单片机)