51單片機--串口通信


基本介紹

  • 串口是一種應用十分廣泛的通訊接口,串口成本低、容易使用、通信線路簡單,可實現兩個設備的互相通信。
  • 單片機的串口可以使單片機與單片機單片機與電腦單片機與各式各樣的模塊互相通信,極大的擴展了單片機的應用范圍,增強了單片機系統的硬件實力。
  • 51單片機內部自帶UART(Universal Asynchronous Receiver Transmitter,通用異步收發器),可實現單片機的串口通信。

基本接線

  • 簡單雙向串口通信有兩根通信線(發送端TXD和接收端RXD)
  • TXD與RXD要交叉連接
  • 當只需單向的數據傳輸時,可以直接一根通信線
  • 當電平標准不一致時,需要加電平轉換芯片

電平標准

電平標准是數據1和數據0的表達方式,是傳輸線纜中人為規定的電壓與數據的對應關系,串口常用的電平標准有如下三種:

  • TTL電平:+5V表示1,0V表示0
  • RS232電平:-3-15V表示1,+3+15V表示0
  • RS485電平:兩線壓差+2+6V表示1,-2-6V表示0(差分信號)

常見通信接口比較

名稱 引腳定義 通信方式 特點
UART TXD、RXD 全雙工、異步 點對點通信
I²C SCL、SDA 半雙工、同步 可掛載多個設備
SPI SCLK、MOSI、MISO、CS 全雙工、同步 可掛載多個設備
1-Wire DQ 半雙工、異步 可掛載多個設備

51單片機的UART

  • STC89C52有1個UART
  • STC89C52的UART有四種工作模式:
    模式0:同步移位寄存器
    模式1:8位UART,波特率可變(常用)
    模式2:9位UART,波特率固定
    模式3:9位UART,波特率可變

串口模式圖

SBUF:串口數據緩存寄存器,物理上是兩個獨立的寄存器,但占用相同的地址。寫操作時,寫入的是發送寄存器,讀操作時,讀出的是接收寄存器

串口和中斷系統

串口相關寄存器

SCON配置

SCON:串行控制寄存器,可位尋址,用於選擇串行通信的工作方式和某些控制功能。

  • SM0,SM1按下列組合確定串行口的工作方式:


我們一般選擇方式1,所以SM0=0,SM1=1.

  • REN:1則啟動串行接收器RXD,開始接收信息,0為禁止接收,我們先設置為1。
  • TI:發送中斷請求標志位,發送數據時,由內部硬件自動置1,響應中斷后由軟件復位為0。
  • RI:接收中斷請求標志位,接收數據時,由內部硬件自動置1,響應中斷后由軟件復位為0。

這里配置SCON的八位分別為:01010000,十六進制0x50

PCON配置

PCON:電源控制寄存器,不可位尋址

這里配置PCON的八位分別為:10000000,十六進制0x50

中斷寄存器配置

程序配置

波特率可通過軟件進行生成

程序操作

串口向電腦發送數據

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char num;

void main(){
	
	UartInit();
	while(1){
		UART_SendBype(num++);
		Delay(1000);
	}
}

#include <REGX52.H>

void UartInit(void)		//4800bps@12.000MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x40;		//8位數據,可變波特率
	TMOD &= 0x0F;		//清除定時器1模式位
	TMOD |= 0x20;		//設定定時器1為8位自動重裝方式
	TL1 = 0xF3;		//設定定時初值
	TH1 = 0xF3;		//設定定時器重裝值
	ET1 = 0;		//禁止定時器1中斷
	TR1 = 1;		//啟動定時器1
}

void UART_SendBype(unsigned char Byte)
{
		SBUF=Byte;
		while(TI==0);
		TI=0;
}

電腦通過串口控制單片機

需要接受定時器SCON的REN為1,和發送不通,接收要配置串口中斷,串口中斷號為4

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

unsigned char num;

void main(){
	
	UartInit();
	while(1){
		
	}
}

void UART_Routine() interrupt 4
{
	//判斷是接收中斷
	if(RI==1)
	{	
		P1=~SBUF;//點亮LED
		UART_SendBype(SBUF);
		RI=0;//清除接收中斷標志
	}
	
}

數據顯示

HEX模式/十六進制模式/二進制模式:以原始數據的形式顯示
文本模式/字符模式:以原始數據編碼后的形式顯示,可發送ASCII編碼表字符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM