51單片機串口通信的注記
使用的自然是山大王STC89C52RC的芯片來(lái)學(xué)習
本文引用地址:http://dyxdggzs.com/article/201611/318585.htm串口通信主要是C51單片機的RXD 和TXD 與上位機進(jìn)行通信,由于上位機一般是電腦,所以要TTL轉成電腦能讀出的RS232的電路來(lái)支持 一般使用MAX232 芯片 串口通信電路如下
之后就可以電腦的串口與這里的串口頭子接了,注意 串口先要交叉一下 即電腦的TXD 對應下位機的RXD
C51單片機串口通信模式有4種,最常用的是第一種
方式0 同步移位寄存器方式 ,一般用來(lái)擴展I/O口,
方式1 10位異步收發(fā)(8位數據),波特率可變(由定時(shí)器1的溢出率控制)
方式2 11位異步收發(fā)(9位數據),波特率固定
方式4 11位異步收發(fā),波特率可變(定時(shí)器1溢出率決定)
各種需要配置的參數如下所示
TI
發(fā)送中斷標志位
當發(fā)送一幀完畢后,由硬件使TI=1,向外部發(fā)送中斷申請,在中斷服務(wù)程序中,必須用軟件手動(dòng)TI = 0,否則一直卡在中斷里(測試一下)
RI
接受中斷標志位
當接收一幀完畢后,由硬件使RI = 1, 向外部發(fā)送中斷申請,也必須要在中斷服務(wù)程序中,用軟件將其清0,取消此次中斷申請
ES
串行中斷允許位
1 為開(kāi)打 0為關(guān)閉
REN
允許串行接受位
1 為打開(kāi) 0 為關(guān)閉
SBUF
串口緩存
在讀寫(xiě)完畢后,存儲的是相應的讀/寫(xiě)值(注意,SUBF實(shí)際有兩個(gè)寄存器,一個(gè)放寫(xiě)一個(gè)放讀)
SM0/1
串口設置工作方式
設置4種工作方式,注意,最好是設置好工作方式再開(kāi)串口傳授
EA
終端總開(kāi)關(guān)
TR1
定時(shí)器1開(kāi)關(guān)
TH1/TL1
定時(shí)器初值
為了滿(mǎn)足9600 的波特率 所以需要將TH1 TL1 設置為0xfd
TMOD
定時(shí)器運行模式
在串口通信的1號方式的時(shí)候 需要打開(kāi)T1的串口通信 TMOD= 0x20 ,即第二種方式,8位自動(dòng)重裝
ET0/1
中斷允許開(kāi)關(guān)
time0 time1
之后是我的印象筆記的兩篇關(guān)于串口通信筆記的分享
http://app.yinxiang.com/shard/s20/sh/6abe8da0-d4b8-4407-9848-3142dde1bed5/ba2a0a6debaab317aaca09185ce65c71
http://app.yinxiang.com/shard/s20/sh/0faa2671-1e95-4d08-9d12-b1bdedc0eadd/13e7a915ea347b0daf3aca30fd9a6a74
我自己寫(xiě)的個(gè)簡(jiǎn)單的串口通信
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = "Hi ";
uchar receiveFlag=0;
void init(){
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
TR1 = 1;
}
void main(){
uchar serVal,i;
init();
receiveFlag = 1;
while(1){
if(receiveFlag == 1){
ES = 1;
while(RI==0);
serVal = SBUF;
RI = 0;
receiveFlag = 0;
}
if(receiveFlag==0){ //need to send msg;
for(i =0;i<3;i++){
SBUF = table[i];
while(TI==0);
TI = 0;
}
SBUF = serVal;
while(TI ==0);
TI = 0;
receiveFlag = 1;
}
}
}
void receive_data() interrupt 4{
RI = 0;//手動(dòng)清0
ES = 0;
receiveFlag = 0;
}
評論