欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      單片機串口總結(jié)

      時間:2019-05-12 02:16:39下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《單片機串口總結(jié)》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《單片機串口總結(jié)》。

      第一篇:單片機串口總結(jié)

      51單片機串口總結(jié)

      有句話說“盡信書不如無書”,要學(xué)好單片機就要不斷的、大膽的實驗,要多懷疑,即使我們的懷疑最終被證明是錯誤的那么這也是進步(人們認(rèn)識事物很多情況下來源于懷疑),當(dāng)懷疑出現(xiàn)時就要去實踐。有很多東西如果不通過實踐是不可能掌握其中隱藏的奧秘,就拿51單片機串口通訊這一塊,我認(rèn)為掌握很好了,可以很輕松的實現(xiàn)數(shù)據(jù)的接收、發(fā)送,但這段時間當(dāng)我重新學(xué)習(xí)串口時,我才發(fā)現(xiàn)里面還有很多小細(xì)節(jié)從沒注意,更別說研究了。對于接收發(fā)送程序永遠(yuǎn)是按照別人的模式來編寫程序,并沒有真真正正的挖掘深層次的內(nèi)容。我身邊太多的人在臨摹別人的程序,當(dāng)然我不反對,但是希望自己多問幾個問什么,單純的會編程是學(xué)不好單片機的,畢竟單片機有自己獨特的硬件結(jié)構(gòu)。

      開講之前先簡要說一下同步、異步通信:

      同步通信:發(fā)送方時鐘對接收方時鐘控制,使雙方達到完全同步。

      異步通信:發(fā)送與接受設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接受過程(雖然時鐘不同,但一般相差不大)。

      51單片機串行口結(jié)構(gòu)

      從上圖中我們看到,51單片機有兩個物理上獨立的接收、發(fā)送緩沖器SBUF,它們共用同一個地址99H,但是請注意:接收緩沖器只能讀而不能寫,發(fā)送緩沖器只寫不讀。單片機可以同時實現(xiàn)數(shù)據(jù)的發(fā)送與接收功能。

      特別注意:接收器是雙緩沖結(jié)構(gòu):當(dāng)前一個字節(jié)從接收緩沖區(qū)取走之前,就已經(jīng)開始接收第

      二個字節(jié)(串行輸入至移位寄存器),此時如果在第二個字節(jié)接收完畢而前一個字節(jié)還未被讀走,那么就會丟失前一個字節(jié)。

      51單片機串口控制寄存器

      關(guān)于51單片機的控制寄存器各個位表示的含義在這里我只談SM2。

      SM2為多機控制位,主要用于工作方式2和3,當(dāng)接收機的SM2=1時,可以利用接收到的RB8來控制是否激活RI(RB8=0不激活RI,收到的數(shù)據(jù)丟失;RB8=1時收到的數(shù)據(jù)進入SBUF,并激活RI ,進而在中斷服務(wù)程序中將數(shù)據(jù)從SBUF中讀走)。當(dāng)SM2=0時,不論收到的RB8為何值都將使接收到的數(shù)據(jù)進入SBUF,并激活RI,通過控制SM2實現(xiàn)多機通信。

      51單片機串口通訊方式

      51串口通訊方式有3種,方式0、方式

      1、方式2與方式3,他們的工作模式不盡相同。首先他們的波特率很容易忽視。方式0與方式2的波特率固定,而方式1和3的波特率由T1的溢出率決定。

      方式0的波特率=f/12

      系統(tǒng)晶振的12分頻,換句話說12M晶振的情況下,其波特率可達1M,速度是很高的(當(dāng)我們在選用串行器件并采用方式0時需要特別注意器件所能允許的最大時鐘頻率)。

      方式2 =f/64或f/32(當(dāng)SMOD=1時為f/32,SMOD=0時為f/64)。

      曾經(jīng)我用方式2進行MODBUS通信時,總是通訊失敗,我仔細(xì)檢查程序,沒有發(fā)現(xiàn)邏輯錯誤,特別是當(dāng)我參考別人的程序時,發(fā)現(xiàn)很少有人用方式2進行MODBUS通訊,所以當(dāng)時自己妄下結(jié)論51單片機的串行方式2不可用,直到有一天夜里我突然想起方式2的波特率是固定的,試想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能通信成功。這才恍然大悟,看來還是自己太武斷了,沒有認(rèn)真看書啊。有時我們認(rèn)為我們犯這樣的錯誤很低級,其實我們很多次都是因為這樣的小細(xì)節(jié)導(dǎo)致我們整個系統(tǒng)不正常,正所謂“千里之堤毀于蟻穴”,這些細(xì)節(jié)真的傷不起啊。

      方式1、3波特率=(2smod/32)*T1的溢出率,其中TI的溢出率=f/{12*[256-(TH1)]}.關(guān)于3種通訊方式其中有幾點特別容易出錯:

      1、無論采用哪種通訊方式,數(shù)據(jù)發(fā)送和接受都是低位在先,高位在后。、3種方式作為輸出,由于輸出是CPU主動發(fā)送,不會產(chǎn)生重疊錯誤,當(dāng)數(shù)據(jù)寫入SBUF后,發(fā)送便啟動(通過單片機內(nèi)部邏輯控制,與程序無關(guān)),當(dāng)該字節(jié)發(fā)送結(jié)束(SBUF空),置TI。不要理解為當(dāng)數(shù)據(jù)一寫入SBUF就置位TI,如果中斷允許則在中斷中發(fā)送數(shù)據(jù),這就大錯特錯了。同樣作為輸入,可能會產(chǎn)生重疊錯誤(主要依賴于特定的環(huán)境),當(dāng)一個字節(jié)的數(shù)據(jù)接收完畢(SBUF滿)置位RI,表示緩沖區(qū)有數(shù)據(jù)提示CPU讀取。

      接下來通過一些實驗具體說明串口通信中需要注意的地方 方式0輸出

      方式0主要功能是作為移位寄存器,將數(shù)據(jù)從SBUF中逐位移出,最常見的用法就是外接串入并出的移位寄存器,如74LS164。之前在做這一部分實驗時總是利用單片機I/O端口模擬實現(xiàn),現(xiàn)在想想在串口未被占用的情況下,方式0是最好的實現(xiàn)方式。

      利用串口方式0,向74LS164輸出字符“0”的編碼,程序如下:

      該程序采用了中斷方式實現(xiàn),結(jié)果是通過74LS164使數(shù)碼管顯示“0”。實驗結(jié)果如下:

      這里我說明幾點: 如果采用查詢方式,并且只發(fā)送一遍,那么程序最后的while(1);不可以省略,否則會出現(xiàn)數(shù)碼管閃爍的現(xiàn)象(在KEIL環(huán)境下,main()函數(shù)也是作為一個調(diào)用函數(shù),最后也有返回RET,它不像C中的main()函數(shù),當(dāng)執(zhí)行完畢后就停止,而是重新復(fù)位執(zhí)行,如此反復(fù),這一點要特別注意)

      這是查詢方式下不加while(1);的現(xiàn)實效果 如果采用中斷方式發(fā)送,請記得中斷中清除TI,僅僅是為了解除中斷標(biāo)志,而不是等待發(fā)送結(jié)束,因為此時數(shù)據(jù)早已離開了SBUF跑到外邊去了。3 74LS164最高25MHZ,采用方式0,沒有問題。

      方式0作為輸入模式

      以74ls165(最高時鐘25MHZ)為例,可以滿足要求。

      對應(yīng)結(jié)果如下:

      (注意:74ls165線傳送高位,而串口通信低位在先,所以顯示的數(shù)據(jù)和實際數(shù)據(jù)高低位正好相反

      P1.7---P1.0對應(yīng)D0---D7)。

      本程序只接收一次,也許有人會問,中斷程序中REN=0,表示什么意思?可不可以改成ES=0?

      這個問題很好,首先REN=0表示接收禁止,即不允許串口接收數(shù)據(jù);ES=0是禁止中斷和單片機是否接收數(shù)據(jù)沒有關(guān)系,不接收數(shù)據(jù)自然中斷允許也是徒勞,這兩者有很大的區(qū)別。我們在很多接收程序中經(jīng)??梢钥吹皆谂袛郣I標(biāo)志后緊跟著清除標(biāo)志位,我想問一下,為什么?)

      如果我們也按照這種模式改寫會怎樣呢?

      實驗結(jié)果如下

      兩次結(jié)果差異怎么這么大?為什么會這樣子?

      為了便于理解,也為了說明問題方便,對中斷程序做了如下處理:

      結(jié)果又變了

      是不是感覺很奇怪,究竟咋回事呢?

      首先中斷程序中當(dāng)判斷RI置位標(biāo)志后緊跟著清零是為了接收下一個字節(jié)的數(shù)據(jù),也為了避免單片機重復(fù)中斷。

      當(dāng)51單片機串口方式0作輸入時,在REN=1且RI=0的條件下就啟動了單片機串口接收過程。如果有一個條件不滿足就不能啟動接收過程,以上出現(xiàn)的錯誤正式由于忽略了這個重要的因素造成的。在RI清零后由于REN仍然為1,單片機已經(jīng)開始接收第二字節(jié)的數(shù)據(jù),由于串口速度很快,RI仍會置位,而緊接著將REN清零只能阻止單片機接收數(shù)據(jù),但是卻

      不能阻擋第二次中斷。由于只接收了部分外部引腳數(shù)據(jù)(此時外部引腳為高電平,即邏輯1,其實單片機只接收了一位,對于12M晶振而言,方式0大約8us接收一個字節(jié)數(shù)據(jù))。相反在RI=0與REN=0之間加上適當(dāng)?shù)难舆t,就可以保證一個字節(jié)的數(shù)據(jù)全部接收完畢,故此時我們讀上來的一個字節(jié)為0xff。

      我在中斷程序中添加了一個中斷計數(shù)器(不加延遲),發(fā)現(xiàn)中斷服務(wù)程序的確執(zhí)行了兩次

      結(jié)果如下

      加上延遲結(jié)果

      這就驗證了剛才的結(jié)論。

      至于說可不可以換做ES=0,回答是可以的,盡管同樣可以實現(xiàn)數(shù)據(jù)的讀取,但是實質(zhì)不同,當(dāng)禁止中斷后,單片機仍在接收外部數(shù)據(jù),只是不再請求中斷,自然的不再讀取第2、3。。。字節(jié)的數(shù)據(jù),那么P1將保留第一次中斷時從SBUF中讀出的數(shù)據(jù)。如果某一時刻打開中斷發(fā)現(xiàn)結(jié)果不正常,如果理解了上面的機制就不會覺得驚訝了。建議:單次接收時,中斷服務(wù)程序中REN清零放在RI之前。

      還有一個問題非常重要:

      如果我在中斷服務(wù)程序中不清除RI,會怎樣?

      很少有人會這樣用,但是經(jīng)常有人忘記了(包括我)。課本上寫得很清楚,務(wù)必在中斷中用軟件清除RI,為什么要這樣呢?難道僅僅是為了接收下一次數(shù)據(jù)并且避免單片機不斷的響應(yīng)中斷?的確如此,如果對于一個小系統(tǒng)而言,不清除中斷標(biāo)志,那么單片機將不停的中斷,影響接下來任務(wù)的執(zhí)行,系統(tǒng)必然癱瘓,而且不能正常的接收數(shù)據(jù)??偨Y(jié):方式0作為發(fā)送方,只要向SBUF中寫入數(shù)據(jù)就啟動了發(fā)送過程;

      方式0在座位接收模式時,REN=

      1、RI=0的情況下就已經(jīng)啟動了接收過程。在中斷程序中要注意兩者清零的順序。

      還有一種情況要特別注意:單片機復(fù)位時SCON自動清零,如果單片機不工作在方式0,那么如果采用位操作SCON時也要注意REN=1與SM0、SM1的書寫順序,總之切記方式0啟動發(fā)送、接收數(shù)據(jù)的條件。

      方式1 方式1為10位異步通信模式。作為輸出和方式0沒有本質(zhì)的區(qū)別,不同的是數(shù)據(jù)幀的形式,但是對于接受模式則有點不同,當(dāng)REN=1且RI=0時,單片機并不啟動接收過程。而是以已選擇波特率的16倍速率采樣RXD引腳的電平,當(dāng)檢測到輸入引腳發(fā)生1---0負(fù)跳變時,則說明起始位有效,才開始接受本幀數(shù)據(jù)。方式1模式下 單片機可以工作在全雙工以及半雙工方式。下面舉兩個例子

      半雙工

      主機發(fā)送某一字符,從機接收到數(shù)據(jù)后返回數(shù)據(jù)加1的值 比如 主機發(fā)送“1“,從機收到后回復(fù)主機”2“。實驗結(jié)果如下:

      方式1工作方式主要注意: 1 波特率可變。數(shù)據(jù)接收以起始位為標(biāo)志,停止位結(jié)束。當(dāng)RI=0且SM2=0或接收到有效停止位時,單片機將接收到的數(shù)據(jù)移入SBUF中,兩個條件缺一不可。

      方式2和方式3 方式2和3不同的只是波特率,這里以方式3為例

      作為輸出模式同方式1沒有區(qū)別,只是增加了第八位數(shù)據(jù)位,第八位數(shù)據(jù)可以用作校驗位或在多機通信中用作數(shù)據(jù)/地址幀的判別位。

      首先我們來做模擬主從奇偶校驗?zāi)J?/p>

      主機發(fā)送一幀數(shù)據(jù),并發(fā)送奇偶校驗位,從機接收數(shù)據(jù)后,判斷數(shù)據(jù)是否正確,如果正

      確,接收指示燈亮,并且回送主機數(shù)據(jù)加1,反之回送0;主機接收從機信息,如果校驗正確點亮LED指示燈.(從機、主機接收數(shù)據(jù)無論校驗正確與否,均顯示接收到的字節(jié)數(shù)據(jù))。奇校驗?zāi)J?演示結(jié)果如下:

      (注:從接接收不正確,返回0)

      主從機接收正確效果

      之前我們已經(jīng)介紹了SM2的具體用法,主要用于多機通信,將SM2作為數(shù)據(jù)/地址幀 的判別位,在接收地址時令SM2=1,當(dāng)接收到的第八位數(shù)據(jù)為1時激活RI產(chǎn)生中斷,然后比較地址,如果地址符合則清除SM2準(zhǔn)備接受數(shù)據(jù)信息,反之不理睬。

      特別注意 當(dāng)RI=0且SM2=0(或SM2=1時接收到第9位數(shù)據(jù)為1)時,單片機將接收到的數(shù)據(jù)移入SBUF中,兩個條件缺一不可。

      在這里我只舉一個簡單的例子 一個主機,兩個從機 起始時,主機從機的SM2均置位,所有的從機等待主機發(fā)送地址幀,主機令TB8=1,發(fā)送地址幀。所用的從機將接受到的地址和自己的地址比較,如果符合,點亮LED指示燈,清除SM2(準(zhǔn)備接受主機發(fā)送的數(shù)據(jù)幀),并將自己的地址發(fā)送到主機。主機接收從機發(fā)送的地址信息,如果地址符合則數(shù)碼管顯示從機地址并開始準(zhǔn)備發(fā)送數(shù)據(jù),反之發(fā)復(fù)位信號,TB8=1。從機接收數(shù)據(jù)先判斷RB8,如果RB8=1,則復(fù)位,重新開始接收主機發(fā)送的地址幀,反之通過P1口外接數(shù)碼管顯示接收到的數(shù)據(jù)。實驗結(jié)果如下:

      注意:如果主機沒有得到正確的地址,則將按照一定的速率發(fā)送地址幀,直到接收正確的地址為止,該試驗主機向從機2發(fā)送信息。

      另外在這里我補充兩點: 我們可以很方便的利用串口通信的工作方式2或3實現(xiàn)奇偶校驗,注意技巧,當(dāng)為偶校驗時TB8=P,奇校驗時TB8=~P;

      2當(dāng)單片機利用中斷發(fā)送大量數(shù)據(jù)時,盡量采用中斷發(fā)送,因為單片機在寫入SBUF數(shù)據(jù)后由硬件將數(shù)據(jù)發(fā)送完,在發(fā)送過程中,單片機還可以做很多事情,利用中斷發(fā)送數(shù)據(jù)可以提高CPU利用率。尤其在低波特率時效果更明顯。

      第二篇:單片機串口通信方式總結(jié)

      IIC總線通信協(xié)議————數(shù)據(jù)傳輸高位在前p233 1,起始和停止條件

      開始信號:SCL為高電平,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。void start()// 開始位 { SDA = 1;

      //SDA初始化為高電平“1”

      SCL = 1;

      //開始數(shù)據(jù)傳送時,要求SCL為高電平“1”

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      SDA = 0;

      //SDA的下降沿被認(rèn)為是開始信號

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      SCL = 0;

      //SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)} 結(jié)束信號:SCL為高電平,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。void stop()// 停止位 { SDA = 0;

      //SDA初始化為低電平“0”

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      SCL = 1;

      //結(jié)束數(shù)據(jù)傳送時,要求SCL為高電平“1”

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      SDA = 1;

      //SDA的上升沿被認(rèn)為是結(jié)束信號 }

      2,數(shù)據(jù)格式(數(shù)據(jù)輸入)

      在IIC總線開始信號后,送出的第一個字節(jié)數(shù)據(jù)是用來選擇器件地址和數(shù)據(jù)方向的,其格式為

      從器件收到地址型號后與自己的地址比較,一致則此器件就是主器件要找的器件,并返回ACK(不管是寫數(shù)據(jù)還是地址都會返回)。IIC傳送數(shù)據(jù)時SCL為低電平時SDA可改變高低電平,SCL轉(zhuǎn)跳為高時數(shù)據(jù)輸入(此時SDA不能跳變),發(fā)送數(shù)據(jù):bit WriteCurrent(unsigned char y){ unsigned char i;bit ack_bit;

      //儲存應(yīng)答位

      for(i = 0;i < 8;i++)// 循環(huán)移入8個位

      {

      SDA =(bit)(y&0x80);

      //通過按位“與”運算將最高位數(shù)據(jù)送到S

      //因為傳送時高位在前,低位在后

      _nop_();

      //等待一個機器周期

      SCL = 1;

      //在SCL的上升沿將數(shù)據(jù)寫入AT24Cxx

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      SCL = 0;

      //將SCL重新置為低電平,以在SCL線形成傳送數(shù)據(jù)所需的8個脈沖

      y <<= 1;

      //將y中的各二進位向左移一位

      } SDA = 1;

      // 發(fā)送設(shè)備(主機)應(yīng)在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,//以讓SDA線轉(zhuǎn)由接收設(shè)備(AT24Cxx)控制

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      SCL = 1;

      //根據(jù)上述規(guī)定,SCL應(yīng)為高電平

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      _nop_();

      //等待一個機器周期

      ack_bit = SDA;//接受設(shè)備(AT24Cxx)向SDA送低電平,表示已經(jīng)接收到一個字節(jié)

      //若送高電平,表示沒有接收到,傳送異常

      SCL = 0;

      //SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)

      return ack_bit;

      // 返回AT24Cxx應(yīng)答位 } 讀數(shù)據(jù):unsigned char ReadData()// 從AT24Cxx移入數(shù)據(jù)到MCU { unsigned char i;unsigned char x;

      //儲存從AT24Cxx中讀出的數(shù)據(jù)

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

      SCL = 1;

      //SCL置為高電平

      x<<=1;

      //將x中的各二進位向左移一位

      x|=(unsigned char)SDA;//將SDA上的數(shù)據(jù)通過按位“或“運算存入x中

      SCL = 0;

      //在SCL的下降沿讀出數(shù)據(jù)

      } return(x);

      //將讀取的數(shù)據(jù)返回 } 發(fā)送數(shù)據(jù)步驟:

      oid WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr處寫入數(shù)據(jù)WriteCurrent { start();

      //開始數(shù)據(jù)傳遞

      WriteCurrent(OP_WRITE);//選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)

      WriteCurrent(add);

      //寫入指定地址

      WriteCurrent(dat);

      //向當(dāng)前地址(上面指定的地址)寫入數(shù)據(jù)

      stop();

      //停止數(shù)據(jù)傳遞

      delaynms(4);

      //1個字節(jié)的寫入周期為1ms, 最好延時1ms以上 } 讀數(shù)據(jù)步驟:

      /*************************************************** 函數(shù)功能:從AT24Cxx中的當(dāng)前地址讀取數(shù)據(jù) 出口參數(shù):x(儲存讀出的數(shù)據(jù))

      ***************************************************/ unsigned char ReadCurrent(){ unsigned char x;start();

      //開始數(shù)據(jù)傳遞

      WriteCurrent(OP_READ);

      //選擇要操作的AT24Cxx芯片,并告知要讀其數(shù)據(jù)

      x=ReadData();

      //將讀取的數(shù)據(jù)存入x stop();

      //停止數(shù)據(jù)傳遞

      return x;

      //返回讀取的數(shù)據(jù) } /*************************************************** 函數(shù)功能:從AT24Cxx中的指定地址讀取數(shù)據(jù) 入口參數(shù):set_add 出口參數(shù):x

      ***************************************************/ unsigned char ReadSet(unsigned char set_add)// 在指定地址讀取 { start();

      //開始數(shù)據(jù)傳遞

      WriteCurrent(OP_WRITE);

      //選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)

      WriteCurrent(set_add);

      //寫入指定地址

      return(ReadCurrent());

      //從指定地址讀出數(shù)據(jù)并返回 }

      單總線協(xié)議————數(shù)據(jù)傳輸?shù)臀辉谇啊穑玻常?1,初始化單總線器件

      初始化時序程序:

      函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號 出口參數(shù):flag

      ***************************************************/ bit Init_DS18B20(void){ bit flag;

      //儲存DS18B20是否存在的標(biāo)志,flag=0,表示存在;flag=1,表示不存在

      DQ = 1;

      //先將數(shù)據(jù)線拉高

      for(time=0;time<2;time++)//略微延時約6微秒

      ;DQ = 0;

      //再將數(shù)據(jù)線從高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延時約600微秒

      ;

      //以向DS18B20發(fā)出一持續(xù)480~960us的低電平復(fù)位脈沖

      DQ = 1;

      //釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高)

      for(time=0;time<10;time++)

      ;//延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)

      flag=DQ;

      //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)

      for(time=0;time<200;time++)//延時足夠長時間,等待存在脈沖輸出完畢

      ;return(flag);

      //返回檢測成功標(biāo)志 }

      單總線通信協(xié)議中存在兩種寫時隙:寫0寫1。主機采用寫1時隙向從機寫入1,而寫0時隙向從機寫入0。所有寫時隙至少要60us,且在兩次獨立的寫時隙之間至少要1us的恢復(fù)時間。兩種寫時隙均起始于主機拉低數(shù)據(jù)總線。產(chǎn)生1時隙的方式:主機拉低總線后,接著必須在15us之內(nèi)釋放總線,由上拉電阻將總線拉至高電平;產(chǎn)生寫0時隙的方式為在主機拉低后,只需要在整個時隙間保持低電平即可(至少60us)。在寫時隙開始后15~60us期間,單總線器件采樣總電平狀態(tài)。如果在此期間采樣值為高電平,則邏輯1被寫入器件;如果為0,寫入邏輯0。

      下圖為寫時隙(包括1和0)時序

      上圖中黑色實線代表系統(tǒng)主機拉低總線,黑色虛線代表上拉電阻將總線拉高。下面是代碼:

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

      {

      DQ =1;

      // 先將數(shù)據(jù)線拉高

      _nop_();

      //等待一個機器周期

      DQ=0;

      //將數(shù)據(jù)線從高拉低時即啟動寫時序

      DQ=dat&0x01;

      //利用與運算取出要寫的某位二進制數(shù)據(jù),//并將其送到數(shù)據(jù)線上等待DS18B20采樣

      for(time=0;time<10;time++)

      ;//延時約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣

      DQ=1;

      //釋放數(shù)據(jù)線

      for(time=0;time<1;time++)

      ;//延時3us,兩個寫時序間至少需要1us的恢復(fù)期

      dat>>=1;

      //將dat中的各二進制位數(shù)據(jù)右移1位

      }

      for(time=0;time<4;time++)

      ;//稍作延時,給硬件一點反應(yīng)時間 }

      對于讀時隙,單總線器件僅在主機發(fā)出讀時隙時,才向主機傳輸數(shù)據(jù)。所有主機發(fā)出讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時隙,以便從機能夠傳輸數(shù)據(jù)。所有讀時隙至少需要60us,且在兩次獨立的讀時隙之間至少需要1us恢復(fù)時間。每個讀時隙都由主機發(fā)起,至少拉低總線1us。在主機發(fā)出讀時隙后,單總線器件才開始在總線上發(fā)送1或0。若從機發(fā)送1,則保持總線為高電平;若發(fā)出0,則拉低總線。

      當(dāng)發(fā)送0時,從機在讀時隙結(jié)束后釋放總線,由上拉電阻將總線拉回至空閑高電平狀態(tài)。從機發(fā)出的數(shù)據(jù)在起始時隙之后,保持有效時間15us,因此主機在讀時隙期間必須釋放總線,并且在時隙起始后的15us之內(nèi)采樣總線狀態(tài)。

      下圖給出讀時隙(包括0或1)時序

      圖中黑色實線代表系統(tǒng)主機拉低總線,灰色實線代表總局拉低總線,而黑色的虛線則代表上拉電阻總線拉高。代碼為:

      unsigned char ReadOneChar(void){

      unsigned char i=0;

      unsigned char dat;//儲存讀出的一個字節(jié)數(shù)據(jù)

      for(i=0;i<8;i++)

      {

      DQ =1;

      // 先將數(shù)據(jù)線拉高

      _nop_();

      //等待一個機器周期

      DQ = 0;

      //單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序

      dat>>=1;

      _nop_();

      //等待一個機器周期

      DQ = 1;

      //將數(shù)據(jù)線“人為”拉高,為單片機檢測DS18B20的輸出電平作準(zhǔn)備

      for(time=0;time<2;time++)

      ;

      //延時約6us,使主機在15us內(nèi)采樣

      if(DQ==1)

      dat|=0x80;//如果讀到的數(shù)據(jù)是1,則將1存入dat

      else

      dat|=0x00;//如果讀到的數(shù)據(jù)是0,則將0存入dat

      //將單片機檢測到的電平信號DQ存入r[i]

      for(time=0;time<8;time++)

      ;

      //延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期

      }

      return(dat);

      //返回讀出的十進制數(shù)據(jù) }

      每個單總線器件內(nèi)部都光刻了一個全球唯一的64位二進制序列碼,用于該單總線器件的識別

      SPI總線協(xié)議

      SPI總線有四種工作方式(SP0, SP1, SP2, SP3),其中使用的最為廣泛的是SPI0和SPI3方式。

      SPI是一個環(huán)形總線結(jié)構(gòu),由ss(cs)、sck、sdi、sdo構(gòu)成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數(shù)據(jù)交換。

      上升沿發(fā)送、下降沿接收、高位先發(fā)送。

      上升沿到來的時候,sdo上的電平將被發(fā)送到從設(shè)備的寄存器中。

      下降沿到來的時候,sdi上的電平將被接收到主設(shè)備的寄存器中。讀代碼:

      unsigned char ReadCurrent(void){

      unsigned char i;unsigned char x=0x00;

      //儲存從X5045中讀出的數(shù)據(jù)

      SCK=1;

      //將SCK置于已知的高電平狀態(tài)

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

      SCK=1;

      //拉高SCK

      SCK=0;

      //在SCK的下降沿輸出數(shù)據(jù)

      x<<=1;//將x中的各二進位向左移一位,因為首先讀出的是字節(jié)的最高位數(shù)據(jù)

      x|=(unsigned char)SO;//將SO上的數(shù)據(jù)通過按位“或“運算存入 x

      } return(x);

      //將讀取的數(shù)據(jù)返回

      } 寫代碼:

      void WriteCurrent(unsigned char dat){

      unsigned char i;SCK=0;

      //將SCK置于已知的低電平狀態(tài)

      for(i = 0;i < 8;i++)// 循環(huán)移入8個位

      {

      SI=(bit)(dat&0x80);

      //通過按位“與”運算將最高位數(shù)據(jù)送到S

      //因為傳送時高位在前,低位在后

      SCK=0;

      SCK=1;

      //在SCK上升沿寫入數(shù)據(jù)

      dat<<=1;

      //將y中的各二進位向左移一位,因為首先寫入的是字節(jié)的最高位

      } } RS232通訊協(xié)議 串行通訊方式3 RS485通訊協(xié)議 串行通訊方式1

      第三篇:STC單片機串口在線燒錄芯片問題總結(jié)

      STC單片機串口在線燒錄芯片問題總結(jié)

      在一個偶然和朋友聊天中了解了STC單片機芯片,從此一發(fā)不可收拾。當(dāng)時我看中STC芯片的一個主要原因是因為它有AD轉(zhuǎn)換功能和在線燒錄功能。用到現(xiàn)在算起來也大致有三、四年的時間了,在此期間用了不少STC不同型號的芯片。總的來講這個芯片還是比較好使的,但在燒錄過程中也碰到不少麻煩,現(xiàn)在把它羅列如下,以便和同行們一起交流、探討和學(xué)習(xí)。

      第一種情況是通過USB轉(zhuǎn)串口燒錄。曾經(jīng)成功過一段時間,但后來不知道為什么再也燒錄不進去了,直到現(xiàn)在也不明白其中的道理。查了一些資料說是USB轉(zhuǎn)串口的芯片問題,需要專用芯片的USB轉(zhuǎn)串口。我也信了,但從此給我的印象是-------STC單片機燒錄程序時是要挑芯片的。

      第二種情況是串口燒錄時有些232芯片不好用,一打聽才知道是232芯片不好,不能用國產(chǎn)的要用進口的,我又專門去買了一批7元多一片的進口232芯片,結(jié)果-------沒有成功過。不得已只好換回用國產(chǎn)的,哎!好了,謝天謝地!阿彌多佛!看來STC芯片串口在線燒錄不但挑USB轉(zhuǎn)串口的芯片,還挑232芯片。

      第三種情況是同一批板子、同一批232芯片有些板子能在線燒錄程序,而有些板子卻不能燒錄程序,實在沒辦法。還好本次產(chǎn)品是采用PLCC封裝的,只好把不能燒錄的芯片拔到可以燒錄的板子上去燒錄好再拔插回去,說到這里有人可能會懷疑不能燒錄的板子232芯片或外圍電路有問題,我當(dāng)時的直覺也是這樣的,但是我板子232口只要燒錄好程序,工作時通訊一切正常,這又作何解釋?不可思議!

      第四種情況(也是我偶然發(fā)現(xiàn)的)5v的STC15F104E芯片,有時候能燒錄,有時候不能燒錄,不能燒錄的概率在90%以上,真是莫名其妙。摸索了將近一天時間才發(fā)現(xiàn)串口接上后(板子在沒有上電的時候)STC芯片電源腳有約3v電壓,我想想可能是從串口反串回來的,有這3v電壓的存在,芯片就如同沒有掉電,所以也就燒錄不進去。我就用鑷子把電源到地短接一下,目的是進行放電。然后馬上給板子上電,哎~~~成了!并且屢試不爽。有類似情況的朋友也不妨一試。哈。。

      第五種情況是我有一批板子用的是STC12LE5A60S2 QFP44封裝,在我的筆記本上用串口燒錄成功率為100%,而到我臺式機上用串口燒錄時成功率卻為0%,是我臺機的串口有問題嗎?非也!臺機串口燒錄STC15F104E和其它是好的,但是對付本批次板卻是無計可施,最后無論我如何絞盡腦汁也不得其解,只好懷疑是板子在設(shè)計時有問題,但是設(shè)計有問題的板子為什么在筆記本上燒錄又是好的呢?只能說-------STC芯片串口在線燒錄不但挑USB轉(zhuǎn)串口的芯片、挑232芯片,還挑電腦。

      第六種情況是同一塊板子今天能燒錄進去,過一段時間又燒錄不進去了,再放一段時間又能燒錄進去了。唉~~~看來STC芯片串口在線燒錄不但挑USB轉(zhuǎn)串口的芯片、挑232芯片、挑電腦,還要看它的心情。

      我暈!STC的芯片真的是讓人歡喜讓人憂。

      第四篇:基于多單片機的串口擴展設(shè)計論文

      前言

      筆者在用單片機開發(fā)一款稱重儀表時,功能較多,對串口的需求很高。需要的串口數(shù)量多,至少要五個串口,包括稱重傳感器通信串口,電腦上位機通信串口,GIM900A 通信串口,大屏幕數(shù)碼管顯示的通信串口,打印模塊的通信串口等。而且對串口要求穩(wěn)定性高,大部分串口都要求實時雙工通信。根據(jù)實際情況和產(chǎn)品串口需求,采用不用的方法進行串口擴展,主要用到了模擬串口和多單片機實現(xiàn)串口擴展。串口擴展的一般方法

      (1)模擬串口。模擬串口利用其他單片機引腳模擬串口收發(fā)時序進行串口擴展。這種串口擴展,缺點比較明顯,通信速率慢,可靠性不高,占用CPU 資源較多。高速雙工通信時一般不用此方案進行串口擴展,低速情況下可以考慮。筆者的項目中大屏幕數(shù)碼管顯示就用了這種方案,顯示的時候只發(fā)不收,單向通信,波特率要求低,最高不過9600bps。

      (2)利用專門的串口擴展芯片處理。串口擴展芯片進行串口擴展,通信穩(wěn)定性高,能達到一般的串口要求。市場上的串口擴展芯片,性能不同,價格也不一樣,但普遍成本較高,少則二三十元,多則七八十元,不利于產(chǎn)品的成本控制。串口需求較多時,一塊串口擴展芯片上串口數(shù)量不足,還需要多塊串口擴展芯片級聯(lián),更增加了成本。

      (3)利用多串口單片機。目前市場上有多串口的單片機,很多低成本單片機都自帶兩個串口,比如stc12 多串口系列。用三串口及其以上的單片機成本更貴。

      (4)基于多單片機的串口擴展設(shè)計。在一定成本要求下,結(jié)合目前單片機產(chǎn)品自身的優(yōu)勢,利用多單片機進行串口擴展,也是一種串口擴展的方案。一般c51 系列單片機自帶雙串口的只要幾元錢,完全可以把單片機用來做串口擴展,而且有的單片機自帶spi 通信接口,可以很方便的實現(xiàn)主從單片機之間的級聯(lián)和通信,同時雙單片機工作時,可以利用從單片機處理一定的程序,減輕主單片機的負(fù)擔(dān),達到“雙核”效果?;诙鄦纹瑱C的串口擴展設(shè)計

      3.1 串口擴展系統(tǒng)框圖

      整個系統(tǒng)由兩塊單片機構(gòu)成主從結(jié)構(gòu),主機完成產(chǎn)品的大部分功能,從機只是進行了串口擴展,擴展出了兩個雙工硬件串口,如果有需要,也可以分擔(dān)部分主機的其他功能。兩者之間通過SPI 硬件接口通信,該硬件SPI 總線是一種全雙工、高速、同步的通信總線,支持主模式和從模式兩種操作模式,主模式中支持高達3Mbps 的速率,完全可以完成主機和從機之間的可靠通信。主機和從機的串口通信,和一塊單片機使用時的用法一樣,只是先要經(jīng)過SPI 傳輸。當(dāng)需要向從機串口發(fā)數(shù)據(jù)時,先要通過主機的SPI 通信送給從機,再通過從機串口發(fā)給外圍模塊;當(dāng)需要接收從機串口數(shù)據(jù)時,先從機接收到串口數(shù)據(jù),從機再利用SPI 傳輸給主機。在進行軟件開發(fā)時,只要定義好主機和從機的SPI 通信協(xié)議,即可完成可靠的串口數(shù)據(jù)收發(fā)。

      3.2 主機和從機之間的SPI 通信

      主機和從機串口之間需要SPI 通信做橋梁,因此主從機之間的SPI 通信顯得極其重要,必須要求高速、可靠、實時,一次SPI 采用中斷完成。主機部分需要用到常用的四個函數(shù),即主機SPI 初始化,SPI 主從機之間的數(shù)據(jù)交換,向從機發(fā)送數(shù)據(jù),主機SPI 中斷接收等。

      1)主機SPI 初始化:

      SPDAT=0;

      SPCTL=0xfd;

      SPSTAT=0xc0;

      IE2=IE2 | 0x2;

      2)主機SPI 數(shù)據(jù)交換

      SPDAT = dat;

      while(!(SPSTAT & SPI_SPIF));

      SPSTAT = 0xc0;

      return SPDAT;

      3)向從機發(fā)送字符串?dāng)?shù)據(jù)

      SPCTL = 0xfd;

      IE2=IE2 & 0x01;

      SPISS=0;

      4)SPI 接收中斷函數(shù)

      uchar ucRecvSpi;

      SPDAT=SPDAT;

      SPSTAT = 0xc0;

      ucRecvSpi=SPDAT;

      ??//SPI 接收到的數(shù)據(jù)處理

      ?循環(huán)SPI 數(shù)據(jù)交換

      發(fā)送字符串

      SPISS=1;

      SPCTL = 0xec;

      IE2=IE2 | 0x3;

      從機部分也需要用到主機一樣的四個函數(shù),即從機SPI 初始化,SPI 主從機之間的數(shù)據(jù)交換,向主機發(fā)送數(shù)據(jù),從機SPI中斷接收等。程序函數(shù)與主機大部分相同,只有細(xì)微區(qū)別。在從機SPI 初始化時,SPCTL 控制寄存器初值為0xec。

      3.3 擴展的串口處理

      從機自帶的兩個雙工串口即是擴展出來的串口,要實現(xiàn)收發(fā)數(shù)據(jù),需要用到基本的3 個函數(shù),即從機串口初始化,從機串口向外圍模塊發(fā)送數(shù)據(jù),從機中斷接收數(shù)據(jù)。串口4 和串口5 函數(shù)類似,下面只列舉串口4 的初始化函數(shù)部分。

      1)串口1 初始化

      TMOD = 0x20;

      SCON = 0x5a;

      TH1 =TL1=-3;

      TR1 = 1;

      ES = 1;EA = 1;

      2)串口接收中斷

      RI = 0;

      Buf[i]=SBUF;// 接收串口數(shù)據(jù)存入數(shù)組

      if(SBUF==0x0a && Buf[i-2]==0x0d)

      接收到結(jié)束符,則向主機發(fā)送串口數(shù)據(jù)。結(jié)語

      本文中的串口擴展方法,實用性強,成本較低,能較好的實現(xiàn)串口擴展,同時利用多出的單片機,可以為主CPU 分擔(dān)一定的任務(wù),提供一定的硬件資源。

      第五篇:單片機總結(jié)

      單片機總結(jié)

      ——20120921030黃國林 我所在的專業(yè)生物醫(yī)學(xué)工程專業(yè),是一個理工醫(yī)相結(jié)合的專業(yè),但是側(cè)重的方向還是工程學(xué),對于計算機,單片機的要求比較高,雖然我們在大三的時候會有單片機的專業(yè)課,但是我們院也成立的相關(guān)的創(chuàng)新實驗室,進行單片機的學(xué)習(xí),組建自己的相關(guān)團隊,做創(chuàng)新研發(fā)。但自己的只是還是有限,因此但是選修了這門課來擴寬自己的視野,對以后的單片機的學(xué)習(xí)打一定得基礎(chǔ)。

      51單片機的運用涉及到我們生活中的方方面面,為我們的生活提供了諸多便利,小到我們平時調(diào)動車流的交通信號燈,再到我們平時使用的形形色色的數(shù)碼管,液晶顯示屏等等,下面介紹一個我學(xué)習(xí)過的單片機的報警裝置與旋轉(zhuǎn)燈的應(yīng)用./* 名稱:報警與旋轉(zhuǎn)燈

      */

      #include

      #include

      #define uchar unsigned char

      #define uint unsigned int

      sbit SPK=P3^7;

      uchar FRQ=0x00;

      //延時

      void DelayMS(uint ms)

      {

      }

      //INT0中斷函數(shù) uchar i;while(ms--)for(i=0;i<120;i++);說明:定時器控制報警燈旋轉(zhuǎn)顯示,并發(fā)出仿真警報聲。

      void EX0_INT()interrupt 0

      {

      }

      //定時器0中斷

      void T0_INT()interrupt

      1{

      }

      //定時器1中斷

      void T1_INT()interrupt

      3{

      }

      //主程序

      void main()

      {

      P2=0x00;SPK=0x00;TMOD=0x11;TH0=0x00;//T0、T1方式1 TH1=-45000/256;TL1=-45000%256;P2=_crol_(P2,1);TH0=0xfe;TL0=FRQ;SPK=~SPK;TR0=~TR0;//開啟或停止兩定時器,分別控制報警器的聲音和LED旋轉(zhuǎn) TR1=~TR1;if(P2==0x00)P2=0xe0;//開3個旋轉(zhuǎn)燈 elseP2=0x00;//關(guān)閉所有LED

      }

      TL0=0xff;IT0=1;IE=0x8b;IP=0x01;TR0=0;TR1=0;while(1){} FRQ++;DelayMS(1);//定時器啟停由INT0控制,初始關(guān)閉//開啟0,1,3號中斷 //INT0設(shè)為最高優(yōu)先

      同時,51單片機只是單片機的一類,單片機的應(yīng)用十份廣泛,以后我會更加努力的學(xué)習(xí)相關(guān)的內(nèi)容。

      20120921030黃國林

      下載單片機串口總結(jié)word格式文檔
      下載單片機串口總結(jié).doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        linux串口觸摸屏設(shè)計總結(jié)

        Linux serial touch 設(shè)計總結(jié) 概述:最近在做嵌入式linux下串口觸摸屏設(shè)計,遇到一些問題,經(jīng)過查找資料和請教同事,總算把問題解決了,事后有把linux相關(guān)的內(nèi)核代碼仔細(xì)看了一遍,為了......

        串口通信實驗報告范文

        華南農(nóng)業(yè)大學(xué) 實驗報告 ----------目錄---------- 1、 實驗任務(wù)和目的 ....................................................................................................

        串口通訊實驗報告

        網(wǎng)絡(luò)編程與實踐實驗報告 實驗內(nèi)容:串口通信編程 學(xué)號:S201502189 姓名:職榮豪 日期:2015-9-28 一、 實驗要求 使用VS2010編寫基于對話框的MFC應(yīng)用程序,兩個窗口分別使用兩個串口......

        串口調(diào)試助手使用說明和技術(shù)總結(jié)大全

        串口調(diào)試助手的技術(shù)報告 1. 軟件簡介 串口調(diào)試助手是在Windows平臺下開發(fā)的,工具是VC++6.0。串口調(diào)試助手版支持常用的300 ~ 115200bps波特率,能設(shè)置校驗、數(shù)據(jù)位和停止位,能以......

        單片機項目總結(jié)

        單片機項目總結(jié)段紹峰、王春光、于和善一、團隊遇到的難題及解決方案1、我們再買器件時,由于不知道型號以及性能指標(biāo),所以買了很多并不需要的器件,并且有時買不到需要的器件,所......

        單片機教學(xué)總結(jié)

        2014—2015學(xué)年第二學(xué)期《單片機應(yīng)用技術(shù)》課教學(xué)總結(jié) 本學(xué)期本人擔(dān)任電氣中職13-1班《單片機應(yīng)用技術(shù)》課的教學(xué)任務(wù),為了順利完成本門課的教學(xué)任務(wù),本人能從各方面作起,現(xiàn)總......

        單片機課程設(shè)計總結(jié)

        單片機課程設(shè)計總結(jié) 做了兩周的課程設(shè)計,有很多的心得體會,有關(guān)于單片機方面的,更多的是關(guān)于人與人之間關(guān)系方面的。我們組一共有三個人,但其他兩個人是真的神龍見首不見尾,除了......

        單片機課程設(shè)計總結(jié)

        單片機課程設(shè)計心得體會: 這個學(xué)期的單片機課已經(jīng)早早的上完了,但是理論純屬理論,沒有與實踐的結(jié)合總讓我們學(xué)的不踏實,感覺沒有達到學(xué)以致用的效果。所慶幸的是在課程介紹考試......