51单片机(三十二)—— 串口通信实例测试

         在《51单片机(三十一)—— 串口通信介绍》中,我们介绍了51单片机串口的工作原理及寄存器定义,在本文中,我们通过一个实例来熟悉51单片机的串口使用方法。本文的资源中有实例的源码。在源码中首先是串口的初始化代码,如下所示。

void init_UART(void)
{
    SCON  = 0x50;		        //串口工作方式1,8位数据位,使能接收
    TMOD |= 0x20;               //T1为方式2,8位自动重装
    TH1   = 0xFD;               //晶振11.0592MHz,0xFD对应波特率为9600  
    TR1   = 1;                  //打开T1定时                     
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}

        需要注意的是,在进行本文的实验时,需要将单片机的晶振换成11.0592MHz的晶振,这与串口的波特率直接相关。串口的初始化代码将串口的波特率设置为9600bit/s。

        代码中串口采用方式1。方式1的波特率采用下式计算,其中T1表示定时器T1的溢出频率

bitrate=\left ( 2^{SMOD}/32 \right )\times T1

其中SMOD=0,定时器T1采用方式2,为8位自动重装的方式。装载值为0xFD,即为253。则T1溢出率为11.0592MHz/12/3=307.2KHz,则串口的波特率为307.2KHz/32=9600。

        串口的发送函数如下所示

void send_Byte(unsigned char shuju)
{
	SBUF = shuju;    //赋值需要发送的数据
}

函数的形参为需要发送的数据,函数中直接将需要发送的数据赋值给数据寄存器。

        串口的接收函数如下所示

unsigned char receive_Byte(void)
{
	unsigned char temp;
	temp=SBUF;   //读取接收到的数据
	return temp;
}

接收函数直接将数据寄存器中的数据返回。

        这个实验中还将串口的接收设置为中断接收方式,中断处理函数如下所示。

void UART_ISR(void) interrupt 4 
{
	if(RI==1)   //接收到数据
	{
		receivedata=receive_Byte();
		if(receivedata=='O')
		{
			LED=0;	
			send_Byte('Y');
		}

		if(receivedata=='C')
		{
			LED=1;	
			send_Byte('V');
		}
		RI=0;        //清除标志位	
	}
	if(TI)           //如果是发送标志位,清除
		TI=0;
} 

        在中断函数中,判断接收中断标志,如果标志位置1,说明接收到数据,则读取数据,并判断数据是否为O或C,如果为O,点亮指示灯,并返回Y,如果为C,熄灭指示灯,并返回V。如果是发送中断标志,则将标志位清零,不处理。

        接下来我们来验证这个实例的代码,将程序烧写到单片机中,并接通电源。在上位机上需要用到串口助手sscom.exe,如下图所示,进行设置。其中COM5为串口号,需要根据实际计算机使用的串口号进行设置。

在字符串输入框中输入大写字母“O”,点击“发送”按钮,窗口返回“Y”,并且开发板上的LED1灯点亮。在字符串输入框中输入大写字母“C”,点击“发送”按钮,窗口返回“V”,并且开发板上的LED1灯熄灭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章