波特率就是發送二進位數據位的速率, 習慣上用 baud 表示, 即我們發送一位二進位數據的持續時間=1/baud。 在通信之前, 單片機 1 和單片機 2 首先都要明確的約定好它們之間的通信波特率, 必須保持一致, 收發雙方纔能正常實現通信, 這一點大家一定要記清楚。約定好速度後, 我們還要考慮第二 ...
波特率就是發送二進位數據位的速率, 習慣上用 baud 表示, 即我們發送一位二進位數據
的持續時間=1/baud。 在通信之前, 單片機 1 和單片機 2 首先都要明確的約定好它們之間的通
信波特率, 必須保持一致, 收發雙方纔能正常實現通信, 這一點大家一定要記清楚。
約定好速度後, 我們還要考慮第二個問題, 數據什麼時候是起始, 什麼時候是結束呢?
不管是提前接收還是延遲接收, 數據都會接收錯誤。 在 UART 通信的時候, 一個位元組是 8 位,
規定當沒有通信信號發生時, 通信線路保持高電平, 當要發送數據之前, 先發一位 0 表示起
始位, 然後發送 8 位數據位, 數據位是先低後高的順序, 數據位發完後再發一位 1 表示停止
位。 這樣本來要發送一個位元組的 8 位數據, 而實際上我們一共發送了 10 位, 多出來的兩位
其中一位起始位, 一位停止位。 而接收方呢, 原本一直保持的高電平, 一旦檢測到了一位低
電平, 那就知道了要開始準備接收數據了, 接收到 8 位數據位後, 然後檢測到停止位, 再準
備下一個數據的接收。
#include<reg52.h>
sbit PIN_RXD = P3^0;
sbit PIN_TXD = P3^1;
bit RxdEnd = 0;
bit RxdOrTxd = 0;
bit TxdEnd = 0;
unsigned char RxdBuf = 0;
unsigned char TxdBuf = 0;
void ConfigUART(unsigned int baud);
void StartRXD();
void StartTXD(unsigned char dat);
void main()
{
EA = 1;
ConfigUART(9600);
while(1)
{
while(PIN_RXD);
StartRXD();
while(!RxdEnd);
StartTXD(RxdBuf+1);
while(!TxdEnd);
}
}
void ConfigUART(unsigned int baud)
{
TMOD &= 0xF0;
TMOD |= 0x02;
TH0 = 256 - (11059200/12)/baud;
}
void StartRXD()
{
TL0 = 256 - ((256 - TH0)>>1);
ET0 = 1;
TR0 = 1;
RxdEnd = 0;
RxdOrTxd = 0;
}
void StartTXD(unsigned char dat)
{
TxdBuf = dat;
TL0 = TH0;
ET0 = 1;
TR0 = 1;
PIN_TXD = 0;
TxdEnd = 0;
RxdOrTxd = 1;
}
void InterruptTimer0() interrupt 1
{
static unsigned char cnt = 0;
if(RxdOrTxd)
{
cnt++;
if(cnt <= 8)
{
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}
else if(cnt == 9)
{
PIN_TXD = 1;
}
else
{
cnt = 0;
TR0 = 0;
TxdEnd = 1;
}
}
else
{
if(cnt == 0)
{
if(!PIN_RXD)
{
RxdBuf = 0;
cnt++;
}
else
{
TR0 = 0;
}
}
else if(cnt <= 8)
{
RxdBuf >>= 1;
if(PIN_RXD)
{
RxdBuf |= 0x80;
}
cnt++;
}
else
{
cnt = 0;
TR0 = 0;
if(PIN_RXD)
{
RxdEnd = 1;
}
}
}
}