概述
詳細
一、串口通信
串口通信(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串口的使用,后續文章會講解傳感器的使用,並使用串口打印傳感器信息,感謝你的支持。
六、項目結構圖