51單片機串口通訊詳解

串口,作爲單片機程序開發中最常用、最方便,也是應用最廣泛的程序調試方法;無論是作爲調試工具,打印出調試信息,還是對功能模塊進行通信,串口是每個單片機開發人員最常用的單片機外設。
由於大部分51單片機不支持在線調試功能,所以串口作爲一種有效的調試功能,所以在51單片機程序開發時,無法進行在線調試,不妨可以多采用串口來進行調試。
1.串口配置

51單片機配置除了需要配置2個8位寄存器SCON、PCON外,還要配置定時器1的控制寄存器TMOD,因爲串口在進行收發需要使用定時器來採樣。
(1)狀態控制寄存器 SCON
SCON 是一個逐位定義的 8 位寄存器,用於控制串行通信的方式選擇、接收和發送,指 示串口的狀態,SCON 即可以字節尋址也可以位尋址,字節地址 98H,地址位爲 98H~9FH。 它的各個位定義如下:
在這裏插入圖片描述
SM0 和 SM1 是串口的工作方式選擇位,2 個選擇位對應 4 種工作方式,如下表,其中 Fosc 是振盪器的頻率。
在這裏插入圖片描述
(2)電源與波特率控制寄存器
控制寄存器 PCON 也是一個逐位定義的 8 位寄存器,目前僅僅有幾位有定義,如下所示:
在這裏插入圖片描述
僅最高位 SMOD 與串口的控制有關,其他位與掉電方式有關。PCON 的地址爲 87H 只能按 字節尋址,SMOD 是串行通信波特率係數控制位,當串口工作在工作方式 1、2 時,若使用 T1 作爲波特率發生器其 SMOD=1 則波特率加倍。
(3)定時器控制模式寄存器
TMOD是定時器、計數器模式控制寄存器,它是一個逐位定義的8爲寄存器,但只能使用字節尋址
在這裏插入圖片描述
當串口工作在工作方式0和2是,波特率固定,方式0時fosc/12;方式2時fosc/32或fosc/64(根據SMOD判斷)。當串口工作在方式1時,波特率=(2^SMOD/32)*(單片機時鐘頻率/(256-X)),X是初值;C/T#爲定時器和計數器選擇位,0爲定時器,1爲計數器

2.串口通用程序
爲了有較好的通用性,將串口程序配置爲一個H文件和C文件,往後只要開發51單片機程序,都可以將該兩個文件複製在工程中直接使用,無須修改。
(1)uart.H

#ifndef _UART_H_
#define _UART_H_

#include "reg52.h"

void UartInit(void);
void Send_string(unsigned char *c);
void Send_Data(unsigned char DAT);

#endif

(2)uart.c

#include "uart.h"

//串口初始化
void UartInit(void)
{
	/*串口初始化 */
	TMOD = 0x20;	  //定時器T1使用工作方式2
	SCON = 0x50;	  //工作方式1,,允許接收   
	PCON = 0x10;
	TH1 = 253;        // 設置初值,波特率9600bps
	TL1 = 253;
	TR1 = 1;          // 開始計時	
	ES = 1;         //打開接收中斷
	EA = 1;           // 打開所以中斷   
	TI = 0;
	RI = 0;
}

void Send_Data(unsigned char DAT)
{
	ES = 0;
	TI=0;
	SBUF = DAT ;
	while(TI==0);
	TI=0;
	ES = 1;
}

void Send_string(unsigned char  *c)
{
	while(*c != '\0')
	{
		Send_Data(*c++);
	}	
}

void RSINTR() interrupt 4 using 2
{
	EA=0;
	if(TI==1) //發送中斷	  
	{
		TI=0;
	}

	if(RI==1)	 //接收中斷		  
	{	

		RI=0;								 

	}
	EA=1;
}

如需串口參考例程, 請關注公衆號,首頁回覆“串口”獲取資料
在這裏插入圖片描述

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