目錄
1.串口介紹
2。STC-ISP串口功能介紹
3.接口及引腳定義
4.串口知識點
4.1 硬件電路
4.2 電平標準
4.3 相關術語
4.4 常見通信接口比較
4.5 51單片機的UART
4.6?串口參數及時序圖
4.7 串口模式圖
4.8?串口和中斷系統
4.9?串口相關寄存器
5.串口向電腦發送信息代碼
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
最終代碼:
代碼模塊:
UART.c
UART.h
main.c
6.電腦通過串口控制LED代碼
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
最終代碼:
代碼模塊:
UART.c
UART.h
main.c
補充:波特率計算
1.串口介紹
串口是一種應用十分廣泛的通訊接口,串口成本低、容易使用、通信線路簡單,可實現兩個設備的互相通信。
單片機的串口可以使單片機與單片機、單片機與電腦、單片機與各式各樣的模塊互相通信,極大的擴展了單片機的應用范圍,增強了單片機系統的硬件實力。
51單片機內部自帶UART(Universal Asynchronous Receiver Transmitter,通用異步收發器),可實現單片機的串口通信。
2。STC-ISP串口功能介紹
向單片機發送數據(下面框),返回(上框)
3.接口及引腳定義
DB9串口傳輸數據(注意使用的電壓是否一致)使用RS232或RS485電平
4.串口知識點
4.1 硬件電路
簡單雙向串口通信有兩根通信線(發送端TXD和接收端RXD) TXD與RXD要交叉連接
當只需單向的數據傳輸時,可以直接一根通信線
當電平標準不一致時,需要加電平轉換芯片
4.2 電平標準
電平標準是數據1和數據0的表達方式,是傳輸線纜中人為規定的電壓與數據的對應關系,串口常用的電平標準有如下三種:
TTL電平:+5V表示1,0V表示0
RS232電平:-3~-15V表示1,+3~+15V表示0
RS485電平:兩線壓差+2~+6V表示1,-2~-6V表示0(差分信號)
4.3 相關術語
全雙工:通信雙方可以在同一時刻互相傳輸數據
半雙工:通信雙方可以互相傳輸數據,但必須分時復用一根數據線
單工:通信只能有一方發送到另一方,不能反向傳輸
異步:通信雙方各自約定通信速率
同步:通信雙方靠一根時鐘線來約定通信速率
總線:連接各個設備的數據傳輸線路(類似于一條馬路,把路邊各住戶連接起來,使住戶可以相互交流)
4.4 常見通信接口比較
4.5 51單片機的UART
STC89C52有1個UART STC89C52的UART有四種工作模式: ?? ?
模式0:同步移位寄存器 ?? ?
模式1:8位UART,波特率可變(常用) ??
?模式2:9位UART,波特率固定 ?? ?
模式3:9位UART,波特率可變
4.6?串口參數及時序圖
波特率:串口通信的速率(發送和接收各數據位的間隔時間)
檢驗位:用于數據驗證
停止位:用于數據幀間隔
4.7 串口模式圖
SBUF:串口數據緩存寄存器,物理上是兩個獨立的寄存器,但占用相同的地址。寫操作時,寫入的是發送寄存器,讀操作時,讀出的是接收寄存器
4.8?串口和中斷系統
4.9?串口相關寄存器
5.串口向電腦發送信息代碼
第一步:
將延遲函數復制過來并導入工程里面
第二步:
配置串口控制寄存器,配置模式1最常用,REN允許接收給1,不允許接收給0(也可以給1外面不給發就行)
第三步:
發送完置1(硬件只負責),但必須軟件復位置0
第四步:
將寄存器配置:
SCON=0x40(串行寄存器配置上面圖紅色字體部分);PCON=0(波特率)
下圖為定時器配置:
這里定時器1,沒有定時器0,所有要把高位修改(不影響高低位配置用“”& |“”這兩個方式)
第五步:
自動重裝:
第六步:
STC-ISP的串口功能,數據調節到我們這款單片機的適應的數據
第七步:
生成代碼復制過來修改一下配置
發送數據端
調用單項發送完成
模塊化串口設置(完整代碼)
串口初始化和單片機向電腦發送一個字節遞增數據數據
調用
最終代碼:
代碼模塊:
Delay.c和Delay.h可以在小編往期的博客里面找到
UART.c
#include <REGX52.H>/***@brief 串口初識化,4800bps@12.000MHz*@param 無*@retval 無*/
void UART_Init()
{SCON = 0x40;PCON |= 0x80; TMOD &= 0x0F; //設置定時器模式TMOD |= 0x20; //設置定時器模式TL1 = 0xF3; //設置定時初始值TH1 = 0xF3; //設置定時重載值ET1 = 0; //禁止定時器中斷TR1 = 1; //定時器1開始計時
}/***@brief 串口發送一個字節數據*@param Byte 要發送的一個字節數據*@retval 無*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}
UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif
main.c
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"unsigned char Sec;void main()
{UART_Init();while(1){UART_SendByte(Sec);Sec++;Delay(1000);}
}
6.電腦通過串口控制LED代碼
第一步:
復制一份一修改(收:要中斷系統,配置寄存器REN置1接收使能)
所有寄存器設置如下配置:
第二步:
配置中斷
中斷配置代碼如下:
第三步:
中斷寄存器修改后總如下,其他不用修改
第四步:
中斷號4:
第五步:
中斷驗證:
接收中斷標志RI
第六步:
函數不能在主函數又在中斷函數里面,調用,向單片機發送數據代碼:第二功能實現:
最終代碼:
代碼模塊:
UART.c
#include <REGX52.H>/***@brief 串口初識化,4800bps@12.000MHz*@param 無*@retval 無*/
void UART_Init()
{SCON = 0x50;PCON |= 0x80; TMOD &= 0x0F; //設置定時器模式TMOD |= 0x20; //設置定時器模式TL1 = 0xF3; //設置定時初始值TH1 = 0xF3; //設置定時重載值ET1 = 0; //禁止定時器中斷TR1 = 1; //定時器1開始計時EA = 1;ES = 1;
}/***@brief 串口發送一個字節數據*@param Byte 要發送的一個字節數據*@retval 無*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}/*串口中斷函數模板,要用的時候移到主函數里面
void UART_Routine() interrupt 4
{if(RI == 1){RI = 0;}
}
*/
UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif
main.c
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"void main()
{UART_Init();while(1){}
}void UART_Routine() interrupt 4 //中斷子函數
{if(RI == 1){P2 = ~SBUF;UART_SendByte(SBUF);RI = 0;}
}
補充:波特率計算
我們串口初識化位0xF3(十六進制數字)=243(十進制數字),寄存器每個256會溢出一次,也就是每隔13us會溢出一次,寄存器的溢出率位1/13約等于0.07692MHZ。根據串口模式圖計算 波特率:0.07692/16約等于0.00480769MHZ=4807.69HZ