娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月21日(星期二)

正在發(fā)生

2020年01月21日 | 軟件模擬串行通信——UART協(xié)議實(shí)現(xiàn)

發(fā)布者:鄭哥 來(lái)源: eefocus關(guān)鍵字:軟件模擬  串行通信  UART協(xié)議 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

起因

單片機(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è)試

關(guān)鍵字:軟件模擬  串行通信  UART協(xié)議 引用地址:軟件模擬串行通信——UART協(xié)議實(shí)現(xiàn)

上一篇:基于51單片機(jī)的定時(shí)器程序設(shè)計(jì)
下一篇:51單片機(jī)IO口模擬UART串口通信

推薦閱讀

? ? 隨著特朗普稅改方案的實(shí)施,越來(lái)越多的美國(guó)企業(yè)開(kāi)始將海外資金匯回美國(guó)。有投資機(jī)構(gòu)認(rèn)為,目前美國(guó)公司的海外現(xiàn)金總量超過(guò)1.6萬(wàn)億美元,預(yù)計(jì)今年從海外流回美國(guó)的資金至少有4000億美元,而這些資金大部分都是來(lái)自于像蘋(píng)果這樣的科技企業(yè)。蘋(píng)果公司  近日,蘋(píng)果正式宣布啟動(dòng)美元回流計(jì)劃,并稱將為此繳納380億美元的稅收。根據(jù)現(xiàn)有的消息來(lái)看,蘋(píng)...
根據(jù)《2018中國(guó)機(jī)器人產(chǎn)業(yè)發(fā)展報(bào)告》,2018年全球服務(wù)機(jī)器人市場(chǎng)規(guī)模將達(dá)到92.5億美元,2020年將快速增長(zhǎng)至156.9億美元。但是同時(shí),技術(shù)的限制和垂直細(xì)分場(chǎng)景下任務(wù)取向的行業(yè)應(yīng)用也困擾著業(yè)界。昨天,業(yè)內(nèi)大咖們圍繞著服務(wù)機(jī)器人的產(chǎn)品落地及場(chǎng)景化應(yīng)用展開(kāi)了探討。 中國(guó)科學(xué)院聲學(xué)研究所研究員、博士生導(dǎo)師李曉東介紹,目前服務(wù)機(jī)器人正在從感知智...
//***************************************************************************** // MSP430-隨機(jī)數(shù)的產(chǎn)生 // Built with IAR Embedded Workbench Version: 3.42A // 程序功能:產(chǎn)生一個(gè)16位的隨機(jī)數(shù) // 原理: // AD輸入口處于懸浮狀態(tài),這樣輸入的是一個(gè)不確定的數(shù)字 // 轉(zhuǎn)換結(jié)果的最后一位尤是如此,轉(zhuǎn)換16次(也可以...
未來(lái)的iPhone和手機(jī)iPad可能會(huì)有新的技術(shù)來(lái)隱藏外殼的天線縫隙。iPhone和iPad的設(shè)計(jì)問(wèn)題之一是生產(chǎn)出能夠有效處理電磁波的版本,即移動(dòng)設(shè)備內(nèi)部的天線所產(chǎn)生和接收的信號(hào)。讓天線能夠發(fā)揮其作用,意味著要么使用材料的方式來(lái)防止信號(hào)的阻擋,要么通過(guò)外殼與外界有一定的開(kāi)口。  設(shè)計(jì)容納天線是很困難的,以iPad為例,外殼的后部是一塊金屬,既...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 红桥区| 镇远县| 瑞丽市| 吉木萨尔县| 古丈县| 昌黎县| 清苑县| 平远县| 屯门区| 弥勒县| 禄丰县| 吐鲁番市| 衡阳市| 淮滨县| 靖安县| 阜宁县| 梨树县| 丰宁| 宝丰县| 闵行区| 同江市| 阳曲县| 台北市| 遵义市| 唐河县| 正镶白旗| 玛多县| 红安县| 肃南| 绥江县| 微山县| 翁牛特旗| 玉树县| 双鸭山市| 玉龙| 江川县| 绥滨县| 山丹县| 阜南县| 丹凤县| 金溪县|