目錄
- 串口的介紹
- 串口硬體電路
- 串口電平標準
- 常用通信介面比較
- 51單片機的UART
- UART引數及時序圖
- UART模式圖
- 串口和中斷
- 串行口相關暫存器
- 串口發送資料
- 代碼
- usart.h
- usart.c
- main.c
- 串口中斷控制燈開關
- 代碼
- uart.h
- uart.c
- main.c
串口的介紹
串口是一種十分廣泛的通訊介面,串口成本低,容易使用,通信線路簡單,可實作兩個設備的互相通信,
單片機的串口可以使單片機與單片機,單片機與電腦,單片機與各式各樣的模塊相互通信,極大的擴展了單片機的應用范圍,增強了單片機系統的硬體實力,
51單片機內部自帶UART(),可實作單片機的串口通信,

串口硬體電路

簡單雙向串口通信有兩根通信線(發送端TXD和接收端RXD)
TXD與RXD要交叉連接
當只需單向的資料傳輸時,可以直接一根通信線
當電平標準不一致時,需要加電平轉換芯片
串口電平標準
電平標準是與資料的對應關系資料1與資料0的表達方式,是傳輸線纜中認為規定的電壓,串口常用的電平標準有三種:
1.TTL電平:+5V 表示1,0V表示 0
2.RS232電平:-3 ~-15V表示1,+3 ~ +15V表示0
3.RS485電平:兩線壓差 +2 ~ +6V 表示1, -2 ~ -6V表示0(差分信號)
常用通信介面比較

全雙工:通信雙方可以在同一時刻互相傳輸資料
半雙工:通信雙方可以互相傳輸資料,但某一時刻,只能一個狀態
單 :通信只能有一方發送到另一方,不能反向純屬
異步 :通信雙方各自約定通信速率
同步 :通信雙方靠一根時鐘線來約定通信速率
總線 : 連接各個設備的資料傳輸線
(類似于一條阿魯,把路邊各住戶連接起來,使住戶可以相互交流)
51單片機的UART
STC89C52有一個UART
STC89C52的UART有四種作業模式:
模式0: 同步移位暫存器
模式1: 8位UART,波特率可變(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可變

UART引數及時序圖

波特率 : 串口通信的速率(發送和接收各資料位的間隔時間)
校驗位: 用于資料驗證
停止位: 用于資料幀的間隔
奇校驗:讓1的個數為奇數,例如:0100 1001 這時候有三個1了,校驗位就為0
偶校驗:讓1的個數為偶數,例如:0100 1001 這時候有三個1了,校驗位就為1
UART模式圖

SUBF: 串口資料快取暫存器,物理上是兩個獨立的暫存器,但占用相同的地址,
寫操作時,寫入的是發送暫存器,讀操作時,讀出的是接收暫存器,
串口和中斷

串行口相關暫存器

SUBF: 串口資料快取暫存器,物理上是兩個獨立的暫存器,但占用相同的地址,
寫操作時,寫入的是發送暫存器,讀操作時,讀出的是接收暫存器,
這是C52的,C51只有一個中斷優先級暫存器
串口發送資料




代碼
usart.h
#ifndef _UART_H_
#define _UART_H_
void UART_Init(void);
void UART_SendByte(unsigned char Byte);
#endif
usart.c
#include <REGX52.h>
#include "uart.h"
/**
*1|?ü£o′??ú3?ê??ˉ
*2?êy£ovoid
*·μ???μ£ovoid
*2¨ì??ê£o4800£?D£?é??£o?T£?í£?1??£o1
*/
void UART_Init(void)
{
SCON = 0x40; //0100 0000 ′??ú??????′??÷
PCON |= 0x80; //????2¨ì??ê?ó±?
TMOD &= 0x0F; //μí????2?±?£?????????á?
TMOD |= 0x20; //?????¨ê±?÷?£ê?1£?0010 0000 ,μí????2?±?£?μúèy???a1
TR1 = 1; //?a???¨ê±?÷1
TL1 = 0xF4;
TH1 = 0xF4;
ET1 = 0;
}
/**
*1|?ü£o′??ú·¢?íêy?Y
*2?êy£oByte Dèòa·¢?íμ?êy?Y
*·μ???μ£ovoid
*/
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI == 0);//?D??ê?·?·¢?ííê3é
TI = 0;//?′??
}
main.c
#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"
/**
*1|?ü£o?óê±500ms
*2?êy£ovoid
*·μ???μ£ovoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
UART_Init();
while(1)
{
UART_SendByte(0x66);
Delay500ms();
}
}

串口中斷控制燈開關
注意:我LED燈是P2,輸入0和1都會讓燈亮,其他會讓燈暗,如果是P1,輸入0亮,其他暗,具體為啥還不清楚,
代碼
uart.h
#ifndef _UART_H_
#define _UART_H_
void UART_Init(void);
void UART_SendByte(unsigned char Byte);
#endif
uart.c
#include <REGX52.h>
#include "uart.h"
/**
*1|?ü£o′??ú3?ê??ˉ
*2?êy£ovoid
*·μ???μ£ovoid
*2¨ì??ê£o4800£?D£?é??£o?T£?í£?1??£o1
*/
void UART_Init(void)
{
SCON = 0x40; //0101 0000 ′??ú??????′??÷
PCON |= 0x80; //????2¨ì??ê?ó±?
TMOD &= 0x0F; //μí????2?±?£?????????á?
TMOD |= 0x20; //?????¨ê±?÷?£ê?1£?0010 0000 ,μí????2?±?£?μúèy???a1
TR1 = 1; //?a???¨ê±?÷1
TL1 = 0xF4;
TH1 = 0xF4;
ET1 = 0;
}
/**
*1|?ü£o′??ú3?ê??ˉ(?D??)
*2?êy£ovoid
*·μ???μ£ovoid
*2¨ì??ê£o4800£?D£?é??£o?T£?í£?1??£o1
*/
void UART_InterruptInit(void)
{
SCON = 0x50; //0101 0000 ′??ú??????′??÷
PCON |= 0x80; //????2¨ì??ê?ó±?
TMOD &= 0x0F; //μí????2?±?£?????????á?
TMOD |= 0x20; //?????¨ê±?÷?£ê?1£?0010 0000 ,μí????2?±?£?μúèy???a1
TR1 = 1; //?a???¨ê±?÷1
TL1 = 0xF4;
TH1 = 0xF4;
ET1 = 0;
ES = 1; //′ò?a′??ú?D??
EA = 1; //′ò?a×ü?D??
PS = 1; //?D??ó??è??
}
/**
*1|?ü£o′??ú·¢?íêy?Y
*2?êy£oByte Dèòa·¢?íμ?êy?Y
*·μ???μ£ovoid
*/
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI == 0);//?D??ê?·?·¢?ííê3é
TI = 0;//?′??
}
/**
*1|?ü£o?D??·t??oˉêy
*2?êy£ovoid
*·μ???μ£ovoid
*/
//×¢òa£o?ò?aê?P2£?ê?è?0oí1???áè?μ?áá£?????°μ£?è?1????aP1μ??°£?0áá1°μ
void UART_Routine(void) interrupt 4
{
if(RI == 1){ //?D??ê?·?ê??óê??D??
P2 = SBUF;//??êy?Y?á3?
RI = 0; //??RI??0£?·?±???′??áè?
}
}
main.c
#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"
/*?ìμ??÷μ?*/
sbit LED = P2^1;
/**
*1|?ü£o?óê±500ms
*2?êy£ovoid
*·μ???μ£ovoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
UART_InterruptInit();
while(1)
{
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290960.html
標籤:其他
