起因
雙單片機(jī)通信,MCU資源受限,無(wú)法使用片上UART通道,只可用普通I/O
成果
使用2個(gè)普通I/O端口,通過(guò)軟件實(shí)現(xiàn)UART協(xié)議的數(shù)據(jù)全雙工收發(fā),8bits數(shù)據(jù)位、1600波特率,可移植其它單片機(jī)
資源占用
·1個(gè)定時(shí)器
·2個(gè)普通I/O端口
IDE
keil V4
硬件
51最小系統(tǒng)板
一、UART協(xié)議
二、思路
1>數(shù)據(jù)的發(fā)送其實(shí)就是控制發(fā)送引腳Ptxd的電平隨著固定時(shí)序變化,那么固定的、周期性的時(shí)序需要一個(gè)定時(shí)器來(lái)產(chǎn)生。為了保證定時(shí)器周期高精度穩(wěn)定可控,選用自動(dòng)重裝定時(shí)器模式 。為了盡可能的減少資源占用,發(fā)送和接收共用一個(gè)定時(shí)器資源。
2>程序的設(shè)計(jì)采用狀態(tài)機(jī)設(shè)計(jì)模式,這樣可以避免獨(dú)占CPU,并且利于移植到各種狀態(tài)機(jī)系統(tǒng)。狀態(tài)遷移程序在ISR中實(shí)現(xiàn)。
3>定時(shí)器的中斷頻率為波特率的3倍[之所以這樣做后面介紹接收時(shí)詳述]。
4>開(kāi)啟發(fā)送之后,ISR中發(fā)送相關(guān)程序得到執(zhí)行,每3次中斷處理1bit.根據(jù)時(shí)序,先產(chǎn)生bit0[起始位],然后根據(jù)8bit型數(shù)據(jù)依次在時(shí)序線上控制Ptxd的電平高低。數(shù)據(jù)位發(fā)送完畢后,若設(shè)置了校驗(yàn)位,則對(duì)8bits數(shù)據(jù)中bit1的數(shù)量進(jìn)行判斷,根據(jù)奇偶校驗(yàn)對(duì)bit1的數(shù)量通過(guò)控制Prxd的電平進(jìn)行奇偶補(bǔ)全[發(fā)送數(shù)據(jù)位時(shí)對(duì)bit1進(jìn)行計(jì)數(shù)]。然后根據(jù)設(shè)置發(fā)送對(duì)應(yīng)長(zhǎng)度的bit1[停止位]。最后,判斷發(fā)送數(shù)據(jù)是否達(dá)到發(fā)送長(zhǎng)度,若發(fā)送長(zhǎng)度到達(dá),則結(jié)束發(fā)送程序執(zhí)行,否則繼續(xù)循環(huán)發(fā)送。
5>開(kāi)啟接收之后,ISR中接收相關(guān)程序得到執(zhí)行,并與發(fā)送程序互不干涉。首先每次中斷都判斷Prxd的電平是否置低[檢測(cè)起始位],當(dāng)檢測(cè)到bit0之后,四個(gè)中斷后進(jìn)行數(shù)據(jù)位最低位的接收。這里之所以選擇四個(gè)中斷的延時(shí),是因?yàn)楫?dāng)檢測(cè)到bit0[起始位]的時(shí)刻,不管此時(shí)處于實(shí)際起始位的哪個(gè)時(shí)間點(diǎn)位置,四個(gè)中斷后即下一次判斷的位置總會(huì)是最接近一位數(shù)據(jù)中心那個(gè)點(diǎn)[一個(gè)bit中有三次中斷點(diǎn),有一個(gè)最接近中心,越接近中心越能免受發(fā)送與接收波特率不同步的影響,具體細(xì)節(jié)畫(huà)圖可知]。之后的每一位改為每三個(gè)中斷進(jìn)行一次判斷處理[與波特率同步]。處理到校驗(yàn)位時(shí),如果設(shè)置了奇偶校驗(yàn),則對(duì)校驗(yàn)結(jié)果輸出至設(shè)置好的校驗(yàn)標(biāo)志位中,外圍程序可根據(jù)此標(biāo)準(zhǔn)位判斷是否校驗(yàn)出錯(cuò)。然后判斷接收數(shù)據(jù)的長(zhǎng)度是否達(dá)到設(shè)置長(zhǎng)度,若沒(méi)有,則等待至Prxd變?yōu)楦唠娖胶罄^續(xù)循環(huán)接收。
三、代碼[關(guān)鍵部分]
static void Xuart_isr(void) interrupt 3
{ Pts = ~Pts;
if(++CNTisr == 3)
{
CNTisr = 0;
/***************************SEND***************************/
if(Fsend == SET)
{
switch(SEQsend)
{
// 起始位0:1bit
case 0:
Ptxd = LOW;
SEQsend = 1;
break;
// 數(shù)據(jù)位SEND
case 1:
if((*ptr_send) & (1 << CNTsend_i))
{
CNTbit1++;
Ptxd = HIGH;
}
else
{
Ptxd = LOW;
}
if(CNTsend_i >= 7)
{
CNTsend_i = 0;
switch(Xuart_config.bit_parity)
{
case NONE: // 無(wú)校驗(yàn)
SEQsend = 4;
break;
case ODD: // 奇校驗(yàn)
SEQsend = 2;
break;
case EVEN: // 偶校驗(yàn)
SEQsend = 3;
break;
default:
SEQsend = 4;
break;
}
}
else{
CNTsend_i++;
}
break;
// 奇校驗(yàn)
case 2:
if((CNTbit1 % 2) == 0) // 偶數(shù)個(gè)1
{
Ptxd = HIGH;
}
else
{
Ptxd = LOW;
}
CNTbit1 = 0;
SEQsend = 4;
break;
// 偶校驗(yàn)
case 3:
if((CNTbit1 % 2) == 0) // 偶數(shù)個(gè)1
{
Ptxd = LOW;
}
else
{
Ptxd = HIGH;
}
SEQsend = 4;
break;
// 停止位
case 4:
CNTbit1 = 0;
switch(Xuart_config.bit_stop)
{
case S_1BIT:
SEQsend = 5;
break;
case S_2BIT:
if(++CNTstbit == 2)
{
CNTstbit = 0;
SEQsend = 5;
}
break;
default:
//SEQsend = 5;
break;
}
Ptxd = HIGH;
break;
// 下一幀or結(jié)束
case 5:
if(CNTsend_j >= len_send - 1) // 發(fā)送完畢處理
{
CNTsend_j = 0;
Fsend_end = SET;
Fsend = CLR;
//TR1 = 0;
}
else
{
CNTsend_j++;
ptr_send++;
}
SEQsend = 0;
break;
default:
SEQsend = 0;
CNTsend_i = 0;
CNTsend_j = 0;
CNTbit1 = 0;
Fsend_end = SET;
Fsend = CLR;
TR1 = 0;
}
}
}
/**************************RECEIVE*************************/
if(Freceive == SET)
{
switch(SEQreceive)
{
// 起始位bit0
case 0:
if(Prxd == LOW) // 收到起始位bit0
{
SEQreceive = 1;
CNTrec = 0;
break;
}
break;
// 8bits_bit1數(shù)據(jù)
case 1:
if(++CNTrec == 4) // 第一次進(jìn)來(lái)時(shí)為4個(gè)周期,提升容錯(cuò)率
{ // 其它時(shí)機(jī)進(jìn)來(lái)為3個(gè)周期,保持同步性
CNTrec = 1;
if(Prxd == HIGH)
{
CNTbit1_++;
*ptr_receive |= (U8)(1 << CNTreceive_i);
}
else
{
*ptr_receive &= (U8)(~(1 << CNTreceive_i));
}
if(CNTreceive_i >= 7) // 1幀接收完畢
{
CNTreceive_i = 0;
CNTrec = 0;
switch(Xuart_config.bit_parity)
{
case NONE: // 無(wú)校驗(yàn)
SEQreceive = 4;
break;
case ODD: // 奇校驗(yàn)
SEQreceive = 2;
break;
case EVEN: // 偶校驗(yàn)
SEQreceive = 3;
break;
default:
SEQreceive = 4;
break;
}
}
else
{
CNTreceive_i++;
}
}
break;
// 奇校驗(yàn)
case 2:
if(++CNTrec == 3) // 3個(gè)周期進(jìn)入
{
CNTrec = 0;
if((CNTbit1_ % 2) & (!Prxd)) // 校驗(yàn)正確
{
Freceive_parity = RIGHT;
}
else // 校驗(yàn)錯(cuò)誤
{
Freceive_parity = ERROR;
}
CNTbit1_ = 0;
SEQreceive = 4;
break;
}
break;
// 偶校驗(yàn)
case 3:
if(++CNTrec == 3) // 3個(gè)周期進(jìn)入
{
CNTrec = 0;
if((CNTbit1_ % 2) & (Prxd)) // 校驗(yàn)正確
{
Freceive_parity = RIGHT;
}
else // 校驗(yàn)錯(cuò)誤
{
Freceive_parity = ERROR;
}
SEQreceive = 4;
break;
}
break;
// 幀結(jié)束
case 4:
if(Prxd == HIGH)
{
if(CNTreceive_j >= (len_receive - 1))
{
CNTreceive_j = 0;
Freceive = CLR;
Freceive_end = SET;
}
else
{
CNTreceive_j++;
ptr_receive++;
}
SEQreceive = 0;
break;
}
break;
default:
break;
}
}
}
四、回環(huán)測(cè)試
1.示波器
??2.串口助手回環(huán)測(cè)試
上一篇:基于51單片機(jī)的定時(shí)器程序設(shè)計(jì)
下一篇:51單片機(jī)IO口模擬UART串口通信
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 480Wh/kg!湖南久森半固態(tài)金屬鋰負(fù)極電池即將量產(chǎn)
- 中國(guó)首條硫化物固體電解質(zhì)量產(chǎn)線正式落地
- QUT開(kāi)發(fā)出新的LENS系統(tǒng) 可以讓機(jī)器人進(jìn)行類似大腦的導(dǎo)航
- 毫米波雷達(dá)裝機(jī)量分析:毫米波雷達(dá)裝車量持續(xù)攀升,大陸和博世占據(jù)60%以上市場(chǎng)份額
- TDK推出適用于車載濾波器的同軸電纜供電電感器
- 大摩給“人形機(jī)器人100”清單注入新思路
- 行家預(yù)判:2025年車載Mini LED反超OLED
- 2025數(shù)智未來(lái)峰會(huì):深度解讀AI賦能工業(yè)的趨勢(shì)與實(shí)踐
- 工業(yè)自動(dòng)化中的Raspberry Pi:簡(jiǎn)化經(jīng)濟(jì)實(shí)惠的邊緣計(jì)算
- 意法半導(dǎo)體宣布擴(kuò)大在新加坡的“Lab-in-Fab”廠內(nèi)實(shí)驗(yàn)室合作項(xiàng)目
- 有獎(jiǎng)?wù)魑模貉痪€汽車VCU/MCU開(kāi)發(fā)工程師,分享開(kāi)發(fā)經(jīng)驗(yàn)、難題、成長(zhǎng)之路等
- 賽靈思工業(yè)與醫(yī)療專題有獎(jiǎng)問(wèn)答
- 秋風(fēng)送爽,你來(lái)答題我送禮!看Maxim 深入淺出低功耗處理器視頻精彩為您呈現(xiàn)!
- 工程師快樂(lè),所以行業(yè)記者快樂(lè)!
- 了解PI InnoSwitch-CE,答題贏好禮
- 免費(fèi)下載|TE 白皮書(shū)《暖通空調(diào)制冷系統(tǒng)中壓力傳感器的重要性》
- 嵌入式Rust修煉營(yíng)第一場(chǎng)直播:Rust入門(mén)基礎(chǔ)知識(shí)和三個(gè)動(dòng)手實(shí)戰(zhàn)Rust任務(wù)解析
- 英飛凌考考你關(guān)于AI芯片的冷知識(shí)
- 有獎(jiǎng)大調(diào)查:你遇到的電源設(shè)計(jì)挑戰(zhàn)有哪些?
- One API提供統(tǒng)一編程模型,簡(jiǎn)化跨不同計(jì)算架構(gòu)應(yīng)用程序開(kāi)發(fā)
- 原創(chuàng)深度:5G的非凡潛力以及實(shí)現(xiàn)5G面臨的艱巨挑戰(zhàn)
- Arm與華為微妙的關(guān)系,斷又不想斷
- 現(xiàn)代IGBT/MOSFET柵極驅(qū)動(dòng)器提供隔離功能的最大功率限制
- DRAMeXchange:NAND Flash價(jià)格將繼續(xù)下跌
- 100公里續(xù)航只要充電3分鐘,最快充電樁來(lái)了
- 最新歐盟自動(dòng)駕駛路線圖(更新版草案)
- 全球半導(dǎo)體制造行業(yè)都面臨著人才短缺的問(wèn)題
- 先進(jìn)半導(dǎo)體封裝材料技術(shù)交流會(huì)圓滿舉行
- BITO CeMAT 超燃現(xiàn)場(chǎng) 精彩回顧