HC6800-ESV2.0 串口通信
說明
平臺:windows 10 64位
開發(fā)工具:普中科技 HC6800-ES V2.0 、keil uVision2
原理
教程:串口通信原理
文檔:普中科技51單片機(jī)教程
步驟
1、確定定時器T1的工作方式(TMOD)
這里我們用的是T1定時器的工作方式2,自動重裝初值
2、計算T1的初值(TH1,TH2)
計算公式:
SMOD = 0波特率正常。SMOD = 1波特率增倍。T1溢出率就是T1定時器溢出一次的時間T的倒數(shù),T1溢出率 = 1/T;
設(shè)X為初值,因為8位數(shù)據(jù),所以,一次溢出時間 = 【256-X】*12/晶振頻率,得出T1的溢出率再運(yùn)用之前的公式,就可以算出定時器 初值。
這里給出一個常用的表格:
需要注意的是,普中這塊開發(fā)板用的晶振是12Mhz的,所以選擇值的時候要注意,另外因為用的是12Mhz的晶振,不是11.0592Mhz,計算出來的T1定時的初值將不是一個整數(shù),這樣進(jìn)行通信時會產(chǎn)生累計誤差。在實(shí)踐過程中,筆者發(fā)現(xiàn),在4800及以下波特率通信時,因為誤差較小,所以產(chǎn)生的影響很小,在通信時沒有發(fā)生過異常現(xiàn)象,但是高于4800時,則會產(chǎn)生明顯誤差,通信時傳輸?shù)臄?shù)據(jù)會嚴(yán)重失真,建議采用4800以下的波特率。
3、啟動定時器T1
4、確定串行口工作方式(SCON)
之類可以有兩種代碼:
一是按位設(shè)置,而是整塊設(shè)置,但其實(shí)本質(zhì)都是按位設(shè)置。
第一種:
按位設(shè)置
1 SM0 = 0;
2 SM1 = 1;
第二種
1 SCON = 0X50;
5、中斷設(shè)置
這里我們用到的串口通信的中斷,雖然我們用到了T1定時器,但其中斷我們并不進(jìn)行操作,所以我們不寫T1定時器的中斷服務(wù)程序,串口通信的中斷號為4;
詳細(xì)代碼
#include<reg52.h>
#define uchar unsigned char
void init();
void main()
{
init();
while(1);
}
void init()
{
TMOD = 0x20; //定時器T1,工作方式2
// SCON = 0X50; //第二種設(shè)置方式
// PCON = 0X80; //波特率倍增
TH1 = 0Xe6; //初值,設(shè)置波特率為1200
TL1 = 0Xe6;
REN = 1; //允許串口接收數(shù)據(jù)
SM0 = 0; //設(shè)置串口方式1
SM1 = 1;
TR1 = 1;
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
}
void ser()interrupt 4
{
uchar mes;
mes = SBUF; //讀取數(shù)據(jù)
RI = 0; //軟件清零,為下一次中斷做準(zhǔn)備
SBUF = mes;
while(!TI); //等待發(fā)送數(shù)據(jù)完畢
TI = 0; //軟件清零,為下一次中斷做準(zhǔn)備
}