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燈熄滅。

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