999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

單片機(jī)模擬串口數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化

2016-09-15 07:03:01郟正學(xué)李煒
關(guān)鍵詞:單片機(jī)程序優(yōu)化

郟正學(xué),李煒

(浙江省空間結(jié)構(gòu)重點(diǎn)實(shí)驗(yàn)室,杭州 310058)

?

單片機(jī)模擬串口數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化

郟正學(xué),李煒

(浙江省空間結(jié)構(gòu)重點(diǎn)實(shí)驗(yàn)室,杭州 310058)

進(jìn)行單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)開(kāi)發(fā)時(shí),往往碰到單片機(jī)自身攜帶的串口不夠用,這時(shí)就需要通過(guò)I/O口模擬串口通信。本文簡(jiǎn)單介紹了串口通信的基礎(chǔ)知識(shí),分析了模擬串口接收數(shù)據(jù)的過(guò)程,介紹了模擬串口接收數(shù)據(jù)的實(shí)現(xiàn)方法,以ATmega64A單片機(jī)為例,詳細(xì)介紹了模擬串口數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化方法。

ATmega64A單片機(jī);串口通信;接收程序

引 言

圖1 串口通信數(shù)據(jù)幀格式

隨著信息技術(shù)的發(fā)展,單片機(jī)的應(yīng)用越來(lái)越廣泛,尤其是在儀器儀表、物聯(lián)網(wǎng)、自動(dòng)化、智能化等領(lǐng)域,應(yīng)用非常多。近年來(lái),各類(lèi)傳感器不斷出現(xiàn),為了提高系統(tǒng)自動(dòng)化、智能化程度,往往需要單片機(jī)與多個(gè)傳感器等外圍器件進(jìn)行連接通信。這類(lèi)外圍器件中,串口通信用得比較多。因此,在嵌入式應(yīng)用系統(tǒng)設(shè)計(jì)開(kāi)發(fā)時(shí),會(huì)經(jīng)常需要多個(gè)串口,而一般的單片機(jī)自身只有一個(gè)或兩個(gè)串口,串口不夠用,這時(shí)就需要利用單片機(jī)的I/O口模擬串口通信,以滿足應(yīng)用要求。

1 串口通信

在工業(yè)上,串口通信用得比較多的是RS232、RS485通信,本文所講的串口通信是指RS232。RS232串口通信數(shù)據(jù)幀由起始位、數(shù)據(jù)位、校驗(yàn)位、停止位組成,數(shù)據(jù)幀格式如圖1所示。St為起始位,1位,低電平;(n)為數(shù)據(jù)位,數(shù)據(jù)位可以是5~9位,具體多少位由串口通信協(xié)議設(shè)定;P為校驗(yàn)位,1位,可以是奇校驗(yàn)或偶校驗(yàn),也可以是無(wú)校驗(yàn)位,是否有校驗(yàn)位,由串口通信協(xié)議設(shè)定;Sp為停止位,1位或2位,停止位為高電平,停止位是1位還是2位,由串口通信協(xié)議設(shè)定。

當(dāng)串口通信協(xié)議設(shè)定為8個(gè)數(shù)據(jù)位、無(wú)校驗(yàn)位、1個(gè)停止位時(shí),1個(gè)數(shù)據(jù)幀即由1位的起始位、8位的數(shù)據(jù)位、1位的停止位組成,幀長(zhǎng)度為10位。在串口通信協(xié)議中,除了前面的參數(shù)設(shè)定外,還有1個(gè)比較重要的參數(shù)——波特率,波特率為串口通信傳輸數(shù)據(jù)的速度,單位為bps,即每秒傳輸?shù)谋忍財(cái)?shù)。在串口通信中,可以設(shè)定的波特率有2 400、4 800、9 600、14 400、19 200、38 400等等。由于不同參數(shù)的串口通信,在編寫(xiě)模擬串口程序時(shí)會(huì)稍有不同,因此本文以9 600波特率、8位數(shù)據(jù)位、無(wú)校驗(yàn)位、1個(gè)停止位為例進(jìn)行介紹。另外本文所講的是三線制串口通信,即RxD(接收)、TxD(發(fā)送)、GND三線。

串口通信發(fā)送或接收數(shù)據(jù)時(shí),都是按照數(shù)據(jù)幀格式一位一位發(fā)送或接收的。發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)低位先發(fā)送,高位后發(fā)送;接收數(shù)據(jù)時(shí),數(shù)據(jù)低位先接收,高位后接收。

2 模擬接收

使用單片機(jī)自身的串口功能接收數(shù)據(jù)時(shí),可以采用查詢方式或中斷方式接收數(shù)據(jù)。使用查詢方式接收數(shù)據(jù)時(shí),單片機(jī)要不停地查詢控制和狀態(tài)寄存器的相應(yīng)標(biāo)志位,以判斷是否需要接收數(shù)據(jù)。一旦有數(shù)據(jù)需要接收,單片機(jī)即運(yùn)行接收程序接收數(shù)據(jù)。當(dāng)沒(méi)有數(shù)據(jù)需要接收時(shí),單片機(jī)需要處于不定時(shí)查詢狀態(tài),否則就不能及時(shí)獲知接收數(shù)據(jù)信息,造成數(shù)據(jù)丟失。即使查詢方式因單片機(jī)一直忙于查詢而不能處理其他事務(wù),降低了單片機(jī)的利用率。使用中斷方式接收數(shù)據(jù)時(shí),當(dāng)串口沒(méi)有接收到數(shù)據(jù)時(shí),單片機(jī)可以處理其他事情;當(dāng)串口接收到數(shù)據(jù)時(shí)單片機(jī)立即產(chǎn)生中斷,通過(guò)中斷程序接收數(shù)據(jù),這樣單片機(jī)接收數(shù)據(jù)比較實(shí)時(shí),利用率也高。因此在實(shí)際應(yīng)用中,比較多的是利用中斷方式接收數(shù)據(jù)。

用I/O口模擬串口接收數(shù)據(jù)時(shí),為了實(shí)現(xiàn)中斷接收數(shù)據(jù),需要選擇具有外部中斷功能的I/O口作為RxD引腳。之所以使用具有外部中斷功能的I/O口,是因?yàn)榇谕ㄐ艛?shù)據(jù)幀的起始位為低電平,利用低電平產(chǎn)生外部中斷功能,以實(shí)現(xiàn)中斷接收數(shù)據(jù)的目的。

未發(fā)生數(shù)據(jù)通信時(shí),RxD引腳處于高電平狀態(tài)。當(dāng)外部有數(shù)據(jù)發(fā)送過(guò)來(lái)時(shí),RxD引腳會(huì)接收到數(shù)據(jù)幀格式的二進(jìn)制數(shù)據(jù)序列。當(dāng)接收到1個(gè)字節(jié)的數(shù)據(jù)時(shí),RxD引腳接收到1個(gè)數(shù)據(jù)幀;當(dāng)接收到多個(gè)字節(jié)的數(shù)據(jù)時(shí),RxD引腳接收到多個(gè)數(shù)據(jù)幀。接收到數(shù)據(jù)幀時(shí),RxD引腳首先接收到起始位,由于起始位是低電平,只要事先將外部中斷定義成低電平中斷,此刻即產(chǎn)生外部中斷,單片機(jī)轉(zhuǎn)入外部中斷處理程序,由外部中斷程序?qū)Πl(fā)送來(lái)的二進(jìn)制數(shù)據(jù)序列按照數(shù)據(jù)幀的格式進(jìn)行一位一位地接收,先接收到是數(shù)據(jù)的低位,后接收到的是數(shù)據(jù)的高位。接收到1個(gè)數(shù)據(jù)幀的停止位后,如果緊接著接收到低電平信號(hào),則認(rèn)為有新的數(shù)據(jù)幀需要接收,此低電平信號(hào)是新數(shù)據(jù)幀的起始位;如果緊接著接收到高電平信號(hào),則判斷為沒(méi)有新的數(shù)據(jù)幀需要接收,接收數(shù)據(jù)結(jié)束。

3 程序?qū)崿F(xiàn)

根據(jù)上面的描述,編寫(xiě)模擬串口通信數(shù)據(jù)接收程序就是對(duì)外部中斷程序的編寫(xiě)。因?yàn)椴ㄌ芈适? 600 bps,所以每位數(shù)據(jù)占用的時(shí)間為104 μs。在實(shí)現(xiàn)每位數(shù)據(jù)接收時(shí),接收到一位數(shù)據(jù)后,需要延時(shí)104 μs后再接收另一位數(shù)據(jù)。在單片機(jī)編程時(shí),可以用語(yǔ)句循環(huán)實(shí)現(xiàn)延時(shí),也可以用定時(shí)器實(shí)現(xiàn)延時(shí)。定時(shí)器定時(shí)比較精確,因此本文采用定時(shí)器延時(shí)。

3.1定時(shí)器定時(shí)子程序

這里以ATmega64A單片機(jī)為例,單片機(jī)外接晶振為8 MHz。ATmega64A單片機(jī)有多個(gè)定時(shí)器,這里選用定時(shí)器TIMER0進(jìn)行定時(shí),以實(shí)現(xiàn)延時(shí)之目的。TIMER0為8位定時(shí)器/計(jì)數(shù)器,定時(shí)方法是給TCNT0寄存器賦初值,由初值開(kāi)始計(jì)數(shù),TIMER0每計(jì)數(shù)一個(gè)時(shí)鐘脈沖,TCNT0加1。當(dāng)TCNT0的值由0xFF變?yōu)?x00時(shí),TIMER0的溢出標(biāo)志位置1,通過(guò)該標(biāo)志位的值判斷定時(shí)是否已到。TIMER0的時(shí)鐘源可以由單片機(jī)的晶振分頻后提供,這里選擇8分頻,即TIMER0的時(shí)鐘頻率為1 MHz,每個(gè)時(shí)鐘脈沖的時(shí)間為1 μs,要實(shí)現(xiàn)104 μs定時(shí),給TCNT0賦初值0x98即可。為了使定時(shí)器定時(shí)子程序可以實(shí)現(xiàn)不同的定時(shí)時(shí)間,將該子程序設(shè)計(jì)成帶參數(shù),通過(guò)參數(shù)值改變定時(shí)時(shí)間,定時(shí)子程序如下:

void Timer0_Open(unsigned char value){

//通過(guò)參數(shù)value設(shè)定定時(shí)時(shí)間

TCCR0=0x00;//取消時(shí)鐘源,TIMER0停止工作

TIFR=0x01;//TIMER0溢出標(biāo)志清零

TCNT0=value;

//定時(shí)器初值,定時(shí)時(shí)間為(0xFF-value+1)μs

TCCR0=0x02;

//設(shè)置時(shí)鐘8分頻,TIMER0獲得時(shí)鐘源后即開(kāi)始工作

}

3.2接收程序流程圖

為了實(shí)現(xiàn)中斷接收數(shù)據(jù),接收數(shù)據(jù)前RxD引腳開(kāi)啟外部中斷功能,一旦有數(shù)據(jù)起始位到即產(chǎn)生中斷,此時(shí)立即將該引腳的外部中斷功能關(guān)閉,同時(shí)將該引腳設(shè)置為輸入,以開(kāi)始接收數(shù)據(jù)流,接收程序按照數(shù)據(jù)幀的格式一位一位地接收數(shù)據(jù),數(shù)據(jù)接收結(jié)束后再將此引腳的外部中斷功能開(kāi)啟,以等待下一次接收數(shù)據(jù)。接收多個(gè)字節(jié)數(shù)據(jù)的接收程序流程圖如圖2所示。

4 程序優(yōu)化

圖2 接收程序流程圖

按照?qǐng)D2接收程序流程圖用C語(yǔ)言編寫(xiě)程序后,經(jīng)測(cè)試,發(fā)現(xiàn)可以連續(xù)接收到3個(gè)字節(jié)的數(shù)據(jù),前2個(gè)字節(jié)正確,但第3個(gè)字節(jié)數(shù)據(jù)是錯(cuò)誤的。通過(guò)對(duì)測(cè)試結(jié)果和程序進(jìn)行分析,發(fā)現(xiàn)產(chǎn)生錯(cuò)誤的原因是程序在接收相鄰位數(shù)據(jù)的間隔時(shí)間超過(guò)了104 μs,每接收1位會(huì)產(chǎn)生△t誤差,連續(xù)接收N 位后,產(chǎn)生的累積誤差為N△t,當(dāng)N△t達(dá)到104 μs時(shí)就會(huì)出錯(cuò)。每接收1位數(shù)據(jù)產(chǎn)生時(shí)間誤差的主要原因有:①定時(shí)器本身有誤差;②每次調(diào)用延時(shí)子程序、子程序返回、執(zhí)行子程序語(yǔ)句需要時(shí)間,設(shè)計(jì)延時(shí)子程序時(shí)未將這些時(shí)間予以減除;③接收數(shù)據(jù)之后,調(diào)用延時(shí)子程序之前執(zhí)行程序語(yǔ)句產(chǎn)生的時(shí)間。

為了降低△t,需要計(jì)算調(diào)用子程序及返回、執(zhí)行有關(guān)語(yǔ)句所需的時(shí)間,以便對(duì)延時(shí)子程序的延時(shí)時(shí)間作相應(yīng)調(diào)整。由于程序是用C語(yǔ)言編寫(xiě)的,計(jì)算這些時(shí)間比匯編語(yǔ)言復(fù)雜一些。在精確度要求不是很高的情況下,可以用簡(jiǎn)便的方法進(jìn)行估算,估算方法:接收第3個(gè)字節(jié)出錯(cuò),說(shuō)明有可能在接收20位數(shù)據(jù)后產(chǎn)生的累積時(shí)間誤差達(dá)到104 μs,也有可能是在接收第30個(gè)字節(jié)時(shí)產(chǎn)生的累積誤差達(dá)到104 μs;假如接收20位數(shù)據(jù)后產(chǎn)生的累積誤差達(dá)到104 μs,則說(shuō)明接收每位產(chǎn)生時(shí)間誤差為5.2 μs;假如接收30位數(shù)據(jù)后產(chǎn)生的累積誤差達(dá)到104 μs,則說(shuō)明接收每位產(chǎn)生的時(shí)間誤差為3.47 μs;分別選取3、4、5、6 μs對(duì)延時(shí)子程序的延時(shí)時(shí)間作相應(yīng)調(diào)整,進(jìn)行調(diào)試測(cè)試,選取最佳的方案即可。

根據(jù)上述思路和方法對(duì)延時(shí)進(jìn)行調(diào)整,通過(guò)調(diào)試測(cè)試,選取結(jié)果較好的方案對(duì)延時(shí)時(shí)間進(jìn)行調(diào)整,以優(yōu)化程序,優(yōu)化后的接收程序語(yǔ)句如下:

EIMSK&=0xFE; //關(guān)閉外部中斷使能

DDRD&=0xFE; //PD0引腳設(shè)為輸入

while(ReceiveContinue){

//程序開(kāi)始時(shí)已賦值為1,ReceiveContinue等于1,繼續(xù)接收

Timer0_Ooen(0x99) ;

//起始位延時(shí)103 μs

for( unsigned char i=0;i<8;i++){

//接收一個(gè)字節(jié)的 8個(gè)位

while( ! ( TIFR& 0x01) );

//前一位延時(shí)結(jié)束

ReceiveRegister>>= 1;

if(PIND&0x01)

//讀取PD0即RxD引腳的值

ReceiveRegiste|= 0x80;

//如果PD0為高電平,說(shuō)明接收到二進(jìn)制1,否則為0

Timer0_Ooen(0x9C);

//延時(shí)100 μs

}

while( ! ( TIFR& 0x01) );

ReceiveBuffer[ReceiveCount]=ReceiveRegister;

//將接收到數(shù)據(jù)存放在接收緩存器

ReceiveCount++;

//接收到1個(gè)字節(jié)后該值加1

ReceiveRegister=0;

//賦值為0,以便接收下一個(gè)字節(jié)數(shù)據(jù)

StartTimer0(0x9B) ;

//延時(shí)101 μs

while( ! ( TIFR& 0x01) );

if(PIND&0x01)

//PD0為1,無(wú)起始位,接收結(jié)束

ReceiveContinue=0;

}

EIMSK |= 0x01;

//開(kāi)外部中斷 0

需要說(shuō)明的是,上述程序的前提是ATmega64A單片機(jī)采用INT0引腳作為模擬串口通信的接收端口。

5 測(cè)試結(jié)果

分別對(duì)優(yōu)化前和優(yōu)化后的程序進(jìn)行了測(cè)試,優(yōu)化前的程序只能連續(xù)接收3個(gè)字節(jié)的數(shù)據(jù),接收到的前2個(gè)字節(jié)數(shù)據(jù)是正確的,第3個(gè)字節(jié)數(shù)據(jù)是錯(cuò)誤的。

優(yōu)化后的程序可以連續(xù)接收48個(gè)字節(jié)的數(shù)據(jù),接收到的數(shù)據(jù)是正確的,超過(guò)48個(gè)字節(jié)就容易出錯(cuò)。要使程序能連續(xù)接收更多字節(jié)的數(shù)據(jù),還需要進(jìn)一步優(yōu)化。

結(jié) 語(yǔ)

本文主要介紹了用單片機(jī)I/O口模擬串口通信接收數(shù)據(jù)的過(guò)程方法、數(shù)據(jù)接收程序的實(shí)現(xiàn)及優(yōu)化方法。通過(guò)優(yōu)化,數(shù)據(jù)接收程序連續(xù)接收數(shù)據(jù)的能力得到了大大的增強(qiáng),可以實(shí)現(xiàn)連續(xù)接收48個(gè)字節(jié)的數(shù)據(jù),能滿足較多場(chǎng)合的應(yīng)用要求。

在優(yōu)化過(guò)程中,提出了簡(jiǎn)便地估算程序運(yùn)行產(chǎn)生時(shí)間誤差的方法,通過(guò)估算得到的誤差值,對(duì)程序的延時(shí)時(shí)間進(jìn)行調(diào)整調(diào)試,實(shí)現(xiàn)程序的優(yōu)化,這是本文的新穎之處。本文的不足之處:一是僅通過(guò)調(diào)整延時(shí)時(shí)間進(jìn)行程序優(yōu)化,未進(jìn)行其他優(yōu)化;二是優(yōu)化后的數(shù)據(jù)接收程序,連續(xù)接收數(shù)據(jù)能力有限,有待進(jìn)一步優(yōu)化提高。

[1] Atmel .Atmel-8160E-ATmega64A_Datasheet_Complete-09/2015[EB/OL].[2016-05].http://www.atmel.com/.

郟正學(xué)(工程師),主要從事嵌入式應(yīng)用系統(tǒng)設(shè)計(jì)開(kāi)發(fā)。

Realization and Optimization of Serial Port Data Receiving Program Based on MCU

Jia Zhengxue,Li Wei

(Zhejiang Provincial Key Laboratory of Space Structures,Hangzhou 310058,China)

In the design,we often encounter the case that the quantity of the serial ports of MCU is not enough.In order to meet the application requirements,the serial communication can be simulated by using the I/O ports.In the paper,the basic knowledge of the serial communication is introduced.The process of simulating the serial ports receiving data is analyzed.The realization method of simulating the serial port receiving data is introduced.Taking ATmega64A MCU as the example,the realization and optimization of the receiving data program are introduced in detail.

ATmega64A MCU;serial port communication;receiving program

TP311

A

(責(zé)任編輯:楊迪娜2016-05-03)

猜你喜歡
單片機(jī)程序優(yōu)化
超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
民用建筑防煙排煙設(shè)計(jì)優(yōu)化探討
關(guān)于優(yōu)化消防安全告知承諾的一些思考
一道優(yōu)化題的幾何解法
基于單片機(jī)的SPWM控制逆變器的設(shè)計(jì)與實(shí)現(xiàn)
電子制作(2019年13期)2020-01-14 03:15:28
基于單片機(jī)的層次漸變暖燈的研究
電子制作(2019年15期)2019-08-27 01:12:10
基于單片機(jī)的便捷式LCF測(cè)量?jī)x
電子制作(2019年9期)2019-05-30 09:42:02
試論我國(guó)未決羈押程序的立法完善
“程序猿”的生活什么樣
英國(guó)與歐盟正式啟動(dòng)“離婚”程序程序
主站蜘蛛池模板: 中文字幕无码中文字幕有码在线| 亚洲三级片在线看| 久久久久亚洲Av片无码观看| 亚洲中文字幕无码爆乳| 熟妇无码人妻| 亚卅精品无码久久毛片乌克兰 | 亚洲第一成人在线| 亚洲天堂网视频| 国产性生大片免费观看性欧美| 国产呦视频免费视频在线观看| 伊人久久久久久久| 国产丝袜啪啪| 精品99在线观看| 国产另类乱子伦精品免费女| 日本黄色不卡视频| 老司机午夜精品网站在线观看| 九九这里只有精品视频| 热伊人99re久久精品最新地| 亚洲永久免费网站| 欧美成人免费一区在线播放| 激情视频综合网| 国产乱子伦精品视频| 在线免费观看AV| 久99久热只有精品国产15| 久久永久精品免费视频| 九九精品在线观看| 找国产毛片看| 国产91高跟丝袜| 人妻21p大胆| 综合人妻久久一区二区精品 | 国产黄网永久免费| 国产成人精品日本亚洲77美色| 欧美第二区| 在线观看亚洲成人| 99久久国产综合精品2020| 国产成人免费手机在线观看视频 | 婷婷亚洲最大| 国产成人麻豆精品| 欧美一级在线| www.日韩三级| 综合色区亚洲熟妇在线| 精品无码国产一区二区三区AV| 欧美成人精品高清在线下载| 特级毛片免费视频| 欧美精品H在线播放| 亚洲第一天堂无码专区| 不卡国产视频第一页| 欧美在线观看不卡| 老司机久久精品视频| 欧美有码在线| 毛片基地视频| 91九色视频网| 欧美一级专区免费大片| 久久青草热| 激情综合图区| 国产女人爽到高潮的免费视频| 中文字幕免费视频| 亚洲美女操| 国产乱子伦一区二区=| 中文字幕有乳无码| 99热最新网址| 欧美一级99在线观看国产| 在线日本国产成人免费的| 亚洲无线国产观看| 欧美在线天堂| 无码综合天天久久综合网| 国产福利观看| 天堂在线www网亚洲| 啪啪啪亚洲无码| 日韩免费毛片| 国产成人精品三级| 日韩精品免费一线在线观看| 亚洲侵犯无码网址在线观看| 国产精品免费福利久久播放| 日本成人一区| 91精品国产无线乱码在线| 国产亚洲美日韩AV中文字幕无码成人 | 国产精品99久久久久久董美香| P尤物久久99国产综合精品| 毛片在线看网站| 国产欧美日本在线观看| 欧美中文字幕第一页线路一|