概述
詳細
一、串口通信
串口通信(Serial CommunicaTIons)的概念非常簡單,串口按位(bit)發送和接收字節。串口用於ASCII碼字符的傳輸,通信使用3根線完成,分別是地線、發送線、接收線.由於串口通信是異步的,端口能夠在一根線上發送數據同時在另一根線上接收數據,其他線用於握手,但不是必須的。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對於兩個進行通信的端口,這些參數必須要匹配。
二、51單片機串口通信
51單片機實現串口通信時會用到的寄存器:SCON、TMOD、PCON
-
SCON:特殊功能寄存器,用以設定串行口的工作方式、接收/發送控制以及設置狀態標志
SCON寄存器中位的定義:

設置SM0和SM1確定串行口工作方式:

-
TMOD:用於設置定時/計數器的工作方式,低四位用於T0,高四位用於T1
TMOD寄存器中位的定義:

定時/計數器的工作方式主要有以下四種:

-
PCON:電源管理寄存器
PCON寄存器中位的定義:

在串口通信時,我們主要使用SMOD位將波特率翻倍,當:
1. SMOD=0:串口方式1,2,3時,波特率正常。
2. SMOD=1:串口方式1,2,3時,波特率翻倍。
三、51單片機串口控制LED燈
//UsartInit()對串口進行初始化
void UsartInit() //設置串口
{
SCON=0X50; //設置為工作方式1
TMOD=0X20; //設置計數器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF4; //計數器初始值設置,波特率:4800
TL1=0XF4;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計數器
}
這里TH1和TL1的初始值,使用了軟件進行計算:

void Usart() interrupt 4 //進入中斷服務函數
{
char receiveData;
receiveData=SBUF;//出去接收到的數據,此時SBUF存放接收數據
RI = 0;//清除接收中斷標志位
if(receiveData=='1')
{
led=0; //接收1時,打開LED燈
}
if(receiveData=='0')
{
led=1; //接收0時,關閉LED燈
}
SBUF=receiveData;
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
}
打開串口調試助手 -- 修改波特率、停止位、數據位等

接着,通過串口調試助手,你可以發送任意你想發送的東西給單片機,這里:
1. 輸入1 ----- LED燈亮
2. 輸入0 ----- LED燈滅
四、Arduino串口控制LED燈
-
設置波特率:Serial.begin(9600);
-
發送數據到串口:Serial.println(data);
-
從串口接收數據:Serial.read();
測試代碼如下:
char var;
void setup()
{
pinMode(13, OUTPUT); //設置IO口13輸出模式
Serial.begin(9600); //設置波特率
Serial.println("Hello!PC,I'm arduino!"); //發送數據到串口
}
void loop()
{
if (Serial.available())
{
var = Serial.read(); //從串口接收數據
if (var == '1')
{
digitalWrite(13, HIGH);
Serial.println("LED is on!");
}
if (var == '0')
{
digitalWrite(13, LOW);
Serial.println("LED is off");
}
}
}
打開右上角--->串口調試器 -- 修改波特率等

1. 發送1 ----- LED燈亮
2. 發送0 ----- LED燈滅
五、總結
本文通過串口點燈實驗介紹了51單片機和Arduino串口的使用,后續文章會講解傳感器的使用,並使用串口打印傳感器信息,感謝你的支持。
六、項目結構圖

