單片機應用技術基礎(C語言)課件:串行口通信技術_第1頁
單片機應用技術基礎(C語言)課件:串行口通信技術_第2頁
單片機應用技術基礎(C語言)課件:串行口通信技術_第3頁
單片機應用技術基礎(C語言)課件:串行口通信技術_第4頁
單片機應用技術基礎(C語言)課件:串行口通信技術_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

串行口通信技術任務11單片機之間雙機通信任務12單片機和PC之間一對一通信任務13基于I2C串行總線的E2PROM讀寫

任務11單片機之間雙機通信

1.任務目的了解51系列單片機串行口的結構,掌握其使用方法。2.任務要求發(fā)送方向接收方發(fā)送數(shù)據(jù),接收方接收數(shù)據(jù)并將數(shù)據(jù)在P1口通過8個LED發(fā)光二極管以二進制形式顯示出來。3.硬件電路U1為發(fā)送方,U2為接收方,將雙方的RXD(P3.0)和TXD(P3.1)交叉互連即可,如圖6.1所示。圖中最小系統(tǒng)沒有畫,本任務僅涉及單向通信,所以只需將發(fā)送方的TXD連接至接收方的RXD即可。4.程序設計軟件編程分為接收方和發(fā)送方。發(fā)送方程序如下:#include<reg51.h>//下面定義將發(fā)送給接收方的數(shù)據(jù)unsignedcharcodenum[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};voiddelay(intms);voidmain(){unsignedchari;TMOD=0x20; //TMOD=00100000B,定時器T1工作于方式2SCON=0x40; //SCON=01000000B,串口工作方式1PCON=0x00; //PCON=00000000B,波特率9600TH1=0xfd; //根據(jù)規(guī)定給定時器T1賦初值TL1=0xfd; //根據(jù)規(guī)定給定時器T1賦初值TR1=1; //啟動定時器T1while(1){ for(i=0;i<8;i++) { SBUF=num[i]; //發(fā)送數(shù)據(jù)i while(TI==0){} //等待數(shù)據(jù)發(fā)送完畢 TI=0; //準備下一次發(fā)送 delay(400); } } }voiddelay(intms){ inti,j; for(i=0;i<ms;i++) for(j=0;j<120;j++);}在編寫軟件之前,應該確定雙方通信的波特率。對于51系列的雙機通信,典型的應用是采用11.0592MHz的芯片,波特率設定為9600b/s。在程序里面,根據(jù)波特率,首先設定定時器的初始值,然后設定串行口的工作模式。主程序中,for循環(huán)體一次發(fā)送一個字節(jié)的數(shù)據(jù),整個for循環(huán)發(fā)送8個字節(jié)的預定義數(shù)據(jù)。程序里面串口采用的是查詢方式,通過語句while(TI==0){}查詢TI的狀態(tài),可以了解數(shù)據(jù)是否發(fā)送完成。TI為0時,數(shù)據(jù)未發(fā)送完成;TI為1時,發(fā)送結束。為了能夠再次發(fā)送,通過語句TI?=?0;將串口設定為空載狀態(tài)。接收方程序如下:#include<reg51.h>voidmain(void){TMOD=0x20; //定時器T1工作于方式2SCON=0x50; //SCON=01010000B,串口工作方式1,允許接收(REN=1)PCON=0x00; //PCON=00000000B,波特率9600TH1=0xfd; //根據(jù)規(guī)定給定時器T1賦初值TL1=0xfd; //根據(jù)規(guī)定給定時器T1賦初值TR1=1; //啟動定時器T1while(1){while(RI==0){} //等待,直至一次數(shù)據(jù)接收完畢(RI=1)RI=0; //為了接收下一幀數(shù)據(jù),需將RI清0P1=SBUF; //將接收緩沖器中的數(shù)據(jù)通過P1口顯示出來}}同發(fā)送方一樣,接收方采用的也是查詢方式,通過語句while(RI==0){}查詢RI的狀態(tài),可以了解數(shù)據(jù)是否接收到了數(shù)據(jù)。RI為0時,未收到數(shù)據(jù);RI為1時,收到數(shù)據(jù)。為了能夠再次接收數(shù)據(jù),通過語句RI=0;將串口設定為空載狀態(tài)。接收方也可以采用中斷方式。代碼如下:#include<reg51.h>//包含單片機寄存器的頭文件voidmain(void){TMOD=0x20;//定時器T1工作于方式2SCON=0x50;//SCON=01010000B,串口工作方式1,允許接收(REN=1)PCON=0x00;//PCON=00000000B,波特率9600

TH1=0xfd;//根據(jù)規(guī)定給定時器T1賦初值TL1=0xfd;//根據(jù)規(guī)定給定時器T1賦初值TR1=1;//啟動定時器T1EA=1; //開總中斷允許位ES=1; //開串行中斷允許位while(1);}//定義串行中斷處理程序voidcom()interrupt4{if(RI==1) //如果有數(shù)據(jù)到來{P1=SBUF;RI=0;} }相比查詢方式,初始化時通過語句EA=1和ES=1開放了相應的中斷控制位。主程序執(zhí)行語句while(1)進入無限循環(huán),此循環(huán)不做任何實質工作,僅僅是為了不讓程序跑飛。主要的處理工作在串行中斷處理程序中完成,每當接收完一幀數(shù)據(jù),就會進入串行中斷處理程序。因為發(fā)送接收共享同一個中斷,因此在串行中斷處理程序中,要判斷是接收中斷還是發(fā)送中斷,這是通過語句if(RI==1)來實現(xiàn)的。當然,由于程序不會通過串口發(fā)送數(shù)據(jù),因此在串行中斷處理程序中即使不做判斷也不會有任何問題。

6.1串行通信基礎6.1.1串行通信與并行通信計算機與計算機或計算機與終端之間的數(shù)據(jù)傳送可以采用串行通信和并行通信兩種方式。并行通信是多位數(shù)據(jù)同時通過多根數(shù)據(jù)線傳送,如圖6.2所示。其優(yōu)點是傳送速度快,缺點是數(shù)據(jù)有多少位,就需要用多少根傳送線。并行通信適用于近距離通信。串行通信是數(shù)據(jù)通過一根數(shù)據(jù)線,一位一位地傳送,如圖6.3所示。串行通信方式具有使用線路少,只需一對傳輸線,成本低的優(yōu)點,特別是在遠程傳輸時,避免了多條線路特性的不一致而被廣泛采用。但其缺點是傳輸速度慢。因此串行通信適用于遠距離通信。在串行通信時,要求通信雙方都采用一個標準接口,使不同的設備可以方便地連接起來進行通信。6.1.2串行通信的制式由于串行通信裝置的設置不同,通信線路的連接不同,它們通信能力是不同的。在串行通信中數(shù)據(jù)是在兩個站之間進行傳送的,按數(shù)據(jù)的傳送方向,串行通信可分為單工、半雙工、全雙工三種通信制式。在單工制式中,通信接口只能發(fā)送或接收的單向傳送,只允許數(shù)據(jù)向一個方向傳送,它只需一條通信線和一條地線,如圖6.4(a)所示。在半雙工制式中,通信接口在任一時刻,只能發(fā)送或者只能接收信息,兩個方向上的數(shù)據(jù)傳送不能同時進行。但允許數(shù)據(jù)雙向傳送,只是需要分時進行。在這種制式下,也只需要一條通信線和一條地線,其收發(fā)開關一般是由軟件控制的電子開關,如圖6.4(b)所示。在全雙工制式中,通信接口可以同時發(fā)送和接收,即數(shù)據(jù)可以在兩個方向同時傳送,接收和發(fā)送需采用兩條不同的通信線和一條地線,如圖6.4(c)所示。6.1.3串行通信分類按照串行數(shù)據(jù)的時鐘控制方式,串行通信可分為同步通信和異步通信。1.異步通信(AsynchronousCommunication)在異步通信中,數(shù)據(jù)都是以特定的幀形式由發(fā)送端一幀一幀地發(fā)送,每一幀數(shù)據(jù)是低位在前,高位在后,通過傳輸線被接收端一幀一幀地接收。一次通信傳輸一幀數(shù)據(jù),一幀數(shù)據(jù)包含8到11個二進制位,通常一次傳輸一個字節(jié)數(shù)據(jù),數(shù)據(jù)在通信線上一位一位地串行傳送。發(fā)送端和接收端可以由獨立的時鐘來控制數(shù)據(jù)的發(fā)送和接收,這兩個時鐘彼此獨立,不要求嚴格同步。發(fā)送端發(fā)送完一個字節(jié)后,可經過任意長的時間間隔再發(fā)送下一個字節(jié)。在異步通信中通信雙方時鐘不必嚴格同步(在一定的時間范圍以內),對硬件的要求較低,因而實現(xiàn)起來較為簡單,其缺點是效率較低。異步通信中有兩個重要指標:數(shù)據(jù)幀格式和波特率。1)數(shù)據(jù)幀格式數(shù)據(jù)幀通常由起始位、數(shù)據(jù)位、奇偶校驗位和停止位四部分組成。(1)起始位:表示傳送一個數(shù)據(jù)的開始,用低電平表示,占一位。(2)數(shù)據(jù)位:要傳送的數(shù)據(jù)的具體內容,典型的數(shù)據(jù)位數(shù)是7位或8位,一般為7位(ASCII碼),數(shù)據(jù)從低位開始傳送。(3)奇偶校驗位:位于數(shù)據(jù)位之后,僅占一位,用來表征串行通信中采用奇校驗還是采用偶校驗,可由用戶編程決定。是為了保證數(shù)據(jù)傳輸?shù)恼_性,在數(shù)據(jù)位之后緊跟一位奇偶校驗位,該位可用于有限差錯檢測,微機在通信時雙方約定一致的奇偶校驗方式。(4)停止位:表示發(fā)送一個數(shù)據(jù)的結束,用高電平表示,占一位、一位半或兩位。這里的一位對應于一定的發(fā)送時間,故有半位。由以上可知,一幀數(shù)據(jù)可由10位、10.5位或11位組成。在串行通信中,兩相鄰數(shù)據(jù)幀之間可以沒有空閑位如圖6.5(a)所示,也可以有若干空閑位如圖6.5(b)所示,這由用戶決定。在異步通信中,數(shù)據(jù)以如圖6.5所示的格式一個接一個地傳送。2)波特率在串行通信中,收發(fā)雙方對發(fā)送或接收的數(shù)據(jù)速率要有一定的約定。波特率是串行通信中的一個重要概念。波特率是對信號傳輸速率的一種度量,就是規(guī)定通信雙方的通信速度,只有當通信雙方采用相同的波特率時,通信才不會發(fā)生混亂。波特率是指每秒鐘傳送二進制數(shù)碼的位數(shù),單位為b/s(位/秒)。例如,當采用每個字符為8位數(shù)據(jù)的異步串行通信(根據(jù)幀格式,每個8位數(shù)據(jù)的字符加上起始位和停止位,一幀共10位),每秒發(fā)送100個字符時,波特率為:10位/字符×100字符/秒=1000位/秒。串行通信常用的標準波特率在RS-232C標準中已有規(guī)定,如波特率為600b/s、1200b/s、2400b/s、4800b/s、9600b/s、19200b/s等。實際應用中應根據(jù)數(shù)據(jù)量的大小、線路質量的好壞等因素綜合選擇合適的波特率。2.同步通信(SynchronousCommunication)在異步通信中,由于每個數(shù)據(jù)都包含起始位和停止位,它們占用了傳送的時間,當數(shù)據(jù)量較大時,這一點更為突出,所以在大量數(shù)據(jù)傳輸時采用同步通信方式來傳送數(shù)據(jù)。同步通信依靠同步字符在每個數(shù)據(jù)塊傳送開始時使收發(fā)雙方同步,同步字符可由用戶選定的某個特殊的8位二進制代碼來表示,收發(fā)雙方必須使用相同的同步字符,當線路空閑時不斷發(fā)送同步字符。如圖6.6所示。同步通信要求由時鐘來實現(xiàn)發(fā)送端與接收端之間的同步,故硬件較復雜.在同步通信中,每一數(shù)據(jù)塊發(fā)送開始時,先發(fā)送一個或兩個同步字符,使發(fā)送與接收取得同步,然后再順序發(fā)送數(shù)據(jù)。數(shù)據(jù)塊的各個字符間取消起始位和停止位,所以通信速度得以提高。

6.2MCS-51的串行接口6.2.1MCS-51串行口的結構MCS-51單片機的串行接口主要由發(fā)送/接收緩沖器SBUF、發(fā)送控制器、接收控制器、波特率發(fā)生器、接收移位寄存器和發(fā)送控制門組成,如圖6.7所示。SBUF是兩個在物理上獨立緩沖器,一個為發(fā)送數(shù)據(jù)緩沖器,一個是接收數(shù)據(jù)緩沖器。但它們共用地址99H,在編程應用中就如同使用一個寄存器SBUF一樣。其中發(fā)送數(shù)據(jù)緩沖器只能寫入,不能讀出;接收數(shù)據(jù)緩沖器只能讀出,不能寫入。CPU通過數(shù)據(jù)總線寫SBUF,就是修改發(fā)送緩沖器;讀SBUF,就是讀接收緩沖器??赏ㄟ^指令對SBUF的讀寫來區(qū)分是對接收緩沖器的操作還是對發(fā)送緩沖器的操作。如有指令SBUF?=?0X01,即為寫SBUF,此時是對發(fā)送緩沖器進行操作;如有指令P0?=?SBUF,即為讀SBUF,此時是對接收緩沖器進行操作。在接收緩沖器之前還有輸入移位寄存器,從而構成了串行接收的雙緩沖結構,以避免在數(shù)據(jù)接收過程中出現(xiàn)幀重疊錯誤。與接收數(shù)據(jù)情況不同,發(fā)送數(shù)據(jù)時,由于CPU是主動的,不會發(fā)生幀重疊錯誤,因此發(fā)送電路不需要雙緩沖結構。波特率可由軟件設置,通過片內的定時/計數(shù)器產生的。6.2.2串行口的控制寄存器1.串行口控制寄存器SCONSCON用于設定串行口的工作方式、接收/發(fā)送控制以及設置狀態(tài)標志等。其字節(jié)地址98H,可位尋址。SCON的格式為各位意義如下:(1)?SM0、SM1:串行口工作方式控制位,用來選擇串行口的四種工作方式。(2)?SM2:多機通信控制位,允許方式2和方式3進行多機通信的控制位。在方式2或方式3中,如SM2?=?1,則接收到第9位數(shù)據(jù)(RB8)為0時,不啟動接收中斷標志RI(RI?=?0)。在方式1時,如SM2?=?1,則只有在接收到有效停止位時才啟動RI,若沒有接收到有效停止位,則RI清零。在方式0中,SM2應為0。(3)?REN:允許串行接收控制位,由軟件置位時允許接收,由軟件清零時禁止接收。(4)?TB8:在方式2或方式3中所要發(fā)送的第九位數(shù)據(jù),需要時由軟件置位或復位。(5)?RB8:在方式2或方式3中所要接收到的第九位數(shù)據(jù)。在方式1中,若SM2?=?0,則RB8是接收到的停止位。在方式0中,不使用RB8。(6)?TI:發(fā)送中斷標志位,由片內硬件在方式0串行發(fā)送到第八位結束時置位,或在其他方式串行發(fā)送停止位的開始時置位。必須由軟件清零。(7)?RI:接收中斷標志位,由片內硬件在方式0串行接收到第八位結束時置位,或在其他方式串行接收到停止位的中間狀態(tài)時置位。必須由軟件清零。SCON的所有位復位時被清零。2.電源控制寄存器PCONPCON主要是為CHMOS型單片機的電源控制而設置的專用寄存器,其字節(jié)地址為87H,沒有位尋址功能。PCON的格式為在CHMOS型單片機中,除SMOD位外,其他位均為虛設的。SMOD是波特率加倍控制位。當SMOD?=?1時,使波特率加倍。系統(tǒng)復位時,SMOD?=?0。所以如需使波特率加倍,則需用指令PCON?=?0X80使SMOD為1。若不需加倍,則可以不初始化PCON。6.2.3串行口的工作方式1.方式0如圖6.8所示,為方式0時的串口內部組成。此時波特率固定為fosc/12,串行口作同步移位寄存器使用,串行數(shù)據(jù)從RXD(P3.0)端輸入或輸出,同步移位脈沖由TXD(P3.1)端輸出。這種方式通常用于擴展I/O端口。2.方式1方式1時,串行口為波特率可調的10位異步通信接口。此時,發(fā)送數(shù)據(jù)幀格式如圖6.11所示,發(fā)送或接收的一幀信息包括1位起始位0,8位數(shù)據(jù)位和1位停止位1。對應的波特率發(fā)生如圖6.12所示,波特率由定時/計數(shù)器T1的溢出率和SMOD共同決定,即:T1溢出率是指定時器T1每秒鐘溢出的次數(shù)。3.方式2當串行口工作于方式2時,串行口定義為11位異步通信接口,對應數(shù)據(jù)幀格式如圖6.13所示,發(fā)送或接收的一幀信息為11位:一位起始位(0),八位數(shù)據(jù)位(先低位),一位可程控為1或0的第九位數(shù)據(jù)位,一位停止位(1)。發(fā)送數(shù)據(jù)時,先根據(jù)通信協(xié)議由軟件設置TB8,然后將要發(fā)送的數(shù)據(jù)寫入SBUF,再啟動發(fā)送,一幀數(shù)據(jù)即從TXD發(fā)送。附加的第九位數(shù)據(jù)即SCON中的TB8位,可由軟件置位或清零,它可以作為多機通信中的地址、數(shù)據(jù)標志位,也可以作為數(shù)據(jù)的奇偶校驗位。發(fā)送完一幀數(shù)據(jù)后,TI被自動置1。在發(fā)送下一幀數(shù)據(jù)之前,TI必須在中斷服務程序或查詢程序中清零。當REN=1時,允許串行口接收數(shù)據(jù)。在接收器采樣到RXD端的負跳變(從1到0的跳變)并判斷起始位有效時,數(shù)據(jù)由RXD端輸入,開始接收一幀數(shù)據(jù)。當接收器接收到第九位數(shù)據(jù)后,若同時滿足以下兩個條件,RI?=?0,且SM2?=?0或接收到的第九位數(shù)據(jù)為1,則接收數(shù)據(jù)有效,將8位數(shù)據(jù)送入SBUF,第9位送入RB8,并置RI?=?1。若不滿足上述兩個條件,則信息丟失。4.方式3當串行口工作于方式3時,串行口定義為波特率可變的9位異步通信接口,方式3與方式2相同。其波特率和方式1相同,由下式決定:6.2.4波特率設計計算與常用波特率1.波特率設計計算在串行通信中,收發(fā)雙方對發(fā)送或接收的數(shù)據(jù)速率要有一定的約定,通過軟件對串行口編程可約定4種工作方式。其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可調的,由定時器的溢出率決定。對方式1和方式3的波特率設計,實際上是通過對定時器設計實現(xiàn)的。定時器1的溢出率取決于單片機定時器1的工作方式和計數(shù)初值X。定時器1作波特率發(fā)生器使用時,通常選用具有自動重裝載初值功能的方式2,那么定時器每過“256-X”個機器周期,定時器1就會產生一次溢出。定時器1的溢出率可用以下公式表示:在實際使用時總是先確定波特率,然后根據(jù)波特率計算T1的溢出率,再求出計數(shù)初值,最后再進行T1的初始化。2.常用波特率及其參數(shù)選擇在雙機或多機通信中,波特率的選擇也不是任意的,有一系列離散的值可供選擇。為了保證通信的可靠性,通常波特率的相對誤差不能超過2.5%。表6.2給出了常用波特率及相應的振蕩頻率fosc和定時器T1的狀態(tài)。表6.3給出了不同振蕩頻率時定時器TH1所產生的波特率。表6.4給出了波特率誤差。

任務12單片機和PC之間一對一通信

1.任務目的了解51系列單片機與PC之間通過串行口通信的方法。2.任務要求單片機連續(xù)向PC機發(fā)送字符數(shù)據(jù)。3.硬件電路單片機通過MAX232連接至PC機的串行口,如圖6.15所示。4.程序設計單片機與PC機之間通過串口通信的過程與單片機與單片機之間的通信過程是類似的。一般而言,通信的雙方應制定通信協(xié)議以保證正確的交換數(shù)據(jù)。下面是單片機一方的程序。#include<reg51.h>voiddelay(intms){inti,j;for(i=0;i<ms;i++)for(j=0;j<120;j++);}//發(fā)送函數(shù)。參數(shù)為待發(fā)送的字符串voidsend(unsignedchar*s){while(*s!='\0'){SBUF=*s++;while(TI==0); //采用查詢方式發(fā)送數(shù)據(jù)TI=0; }}voidmain(){unsignedcharletters[3],c;letters[2]='\0';letters[1]='';SCON=0x40;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;TI=0;TR1=1;delay(50);send("receivingdatafrommcs-8051...\r\n"); //發(fā)送消息至串行口send("------------------------------\r\n");delay(50);while(1) //循環(huán)發(fā)送消息{for(c='A';c<='Z';c++) //依次發(fā)送大寫字母{letters[0]=c;send(letters);delay(50); }send("\r\n------------------------------\r\n");}}程序循環(huán)發(fā)送大寫字母到串行口。程序中定義了字符數(shù)組letters,大小3字節(jié),用于發(fā)送單個字母。第一個元素是要發(fā)送的字母,后跟一個空格,第三個元素是字符串結束標記。5.程序調試為了調試程序,可將程序下載后,將單片機連接至PC機的串行口,打開PC機的串口調試工具(一個免費的串口調試工具,可到網上下載),設置好串口參數(shù)(波特率9600b/s,8位數(shù)據(jù),1位停止位)后,打開單片機,就可以在串口調試工具中看到來自單片機的消息。也可以脫離硬件環(huán)境,直接在Proteus里面仿真調試。這要求PC機上有2個可用的串行口,一個用于Proteus仿真使用,另外一個用于PC機的串口調試工具,連接這2個串行口,就可以仿真調試了?,F(xiàn)在的PC機一般而言沒有2個串口,這時可以通過虛擬串口軟件(例如:VirtualSerialPortDriver)在PC機上虛擬出多個串口進行調試。

6.3單片機和PC之間的串行通信6.3.1RS-232C串行通信總線標準RS-232一共有3個版本:RS-232A、RS-232B、RS-232C。RS-232C是現(xiàn)在最常使用的串行接口標準。1969年,美國電子工業(yè)協(xié)會(EIA)公布了RS-232C作為串行通信接口的電氣標準。該標準定義了數(shù)據(jù)終端設備(DTE)和數(shù)據(jù)通信設備(DCE)間按位串行傳輸?shù)慕涌谛畔?,合理安排了接口的電氣信號和機械要求,在世界范圍內得到了廣泛的應用。1.RS-232C的電氣特性RS-232C采用負邏輯,要求高、低兩信號有較大幅度,其電平標準如下:邏輯1:-3~-15V(單片機一般為?-10V);邏輯0:+3~+15V(單片機一般為?+10V)。2.RS-232C的接口引腳及引腳功能現(xiàn)在常用的PC上的串口COM都采用的是RS-232C接口,9針接口如圖6.16所示,接口引腳定義如表6.5所示。3.PC機與RS-232C的連接RS-232C最大通信距離是15m,最大傳輸速率19.2Kb/s。使用RS-232C連接系統(tǒng)時,當通信距離小于15m時,可以直接利用電纜進行連接,如圖6.17所示。由于采用單端驅動非差分接收電路,因而存在著傳輸距離不太遠(最大傳輸距離15m)和傳送速率不太高(最大位速率為20Kb/s)的問題,當通信距離大于15m時,就必須使用調制解調器(MODEM)來進行連接了,其連接圖如圖6.18所示,這樣增加了成本。由于采用單端驅動非差分接收電路,因而存在著傳輸距離不太遠(最大傳輸距離15m)和傳送速率不太高(最大位速率為20Kb/s)的問題,當通信距離大于15m時,就必須使用調制解調器(MODEM)來進行連接了,其連接圖如圖6.18所示,這樣增加了成本。6.3.2單片機和PC的串行通信接口單片機中的串行口采用的TTL電平,PC機串口采用RS-232C電氣標準。RS-232C是用正負電壓來表示邏輯狀態(tài)的,與TTL以高低電平表示邏輯狀態(tài)的規(guī)定不同。單片機中的信號電平是TTL電平,即2.4~5?V為高電平“1”,0~0.4?V為低電平“0”。通常RS-232C總線的邏輯“0”用?+10?V表示,邏輯“1”用?-10?V表示,與TTL以高低電平表示邏輯狀態(tài)的規(guī)定不同。為了讓單片機與PC機能相互通信,必須在RS-232C與TTL電路之間進行電平和邏輯關系的轉換,如圖6.19所示。MAX232芯片是專門為電腦的RS-232標準串口設計的接口電路,MAX232芯片內部有一個電源電壓變換器,可以把輸入的?+5?V電源變換成RS-232C輸出電平所需?±10?V電壓。使用?+5?V單電源供電,即可同時實現(xiàn)TTL電平與RS-232C電平的雙向轉換。單片機應用中廣泛使用MAX232轉換電平后與RS-232連接。1.?MAX232引腳及功能MAX232的引腳如圖6.20所示。MAX232的引腳及使用說明:VCC為電源端(+5?V);GND為電源地;C1+、C1-、C2+、C2-為外接電容端;V+為經電容接?+5?V電源端;V-為經電容接地端;R1IN、R2IN為2路RS-232電平信號接收輸入端;R1OUT、R2OUT為2路轉換后的TTL電平接收信號輸出端,送單片機的RXD接收端;T1IN、T2IN為2路TTL電平發(fā)送輸入端,接單片機的TXD發(fā)送端;T1OUT、T2OUT為2路轉換后的發(fā)送RS-232電平信號輸出端,接傳輸線。2.?MAX232典型工作電路MAX232的典型工作電路如圖6.21所示。利用它進行電平轉換,可以實現(xiàn)單片機和PC機的串行通信。MAX232工作電路共包括三部分。第一部分是供電電路,包括15腳GND和16腳VCC(+5?V)。第二部分是電源電路,由1、2、3、4、5、6腳和4只電容構成,其功能是產生?+12?V和-12?V兩個電源,提供給RS-232串口電平的需要。第三部分是數(shù)據(jù)轉換通道。由7、8、9、10、11、12、13、14腳構成兩個數(shù)據(jù)通道。其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數(shù)據(jù)通道。8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數(shù)據(jù)通道。TTL/CMOS數(shù)據(jù)從T1IN、T2IN輸入轉換成RS-232數(shù)據(jù)從T1OUT、T2OUT送到電腦DB9插頭;DB9插頭的RS-232數(shù)據(jù)從R1IN、R2IN輸入轉換成TTL/CMOS數(shù)據(jù)后從R1OUT、R2OUT輸出。3.單片機和PC機的串行通信接口電路單片機通過MAX232的轉換與PC機實現(xiàn)串行通信的接口電路如圖6.22所示。單片機的發(fā)送數(shù)據(jù)從單片機的TXD端發(fā)送出去經MAX232芯片的T1IN輸入,經過MAX232的轉換從T1OUT輸出到PC機的RXD端輸入;PC機的發(fā)送數(shù)據(jù)從PC機的TXD端發(fā)送出去經MAX232芯片的R1IN輸入,經過MAX232的轉換從R1OUT輸出到單片機的RXD端輸入。

任務13基于I2C串行總線的E2PROM讀寫

1.任務目的了解51系列單片機模擬I2C總線接口與I2C總線設備通信的方法。2.任務要求利用I2C串行數(shù)據(jù)通信的方式往AT24C02中寫入數(shù)據(jù)并讀出,再在數(shù)碼管上顯示出來。3.硬件電路MCS-51系列單片機本身沒有I2C接口電路,可以通過軟件來模擬I2C接口。比如使用2個并行引腳(本任務使用P1.0和P1.1)連接到SDL和SCL總線上,將地址線連接成000(A2A1A0均接低電平),讀出的結果通過數(shù)碼管顯示出來。電路圖如圖6.23所示。//功能:對24C02的內部地址0X00處寫入數(shù)值0x71(“F”對應的數(shù)碼管顯示碼),然后從24C02的內部地址0X00處讀出數(shù)值,最后由數(shù)碼管顯示這個讀出的數(shù)值:F。//注意:由于24C02的容量是256個字節(jié),所以它的內部地址范圍為0~255,即0X00~0XFF。#include<reg51.h>#include<intrins.h>sbitsda=P1^1; //SDA線sbitscl=P1^0; //SCL線unsignedcharcodedisplay_table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F等16個數(shù)碼管顯示編碼voiddelay_ms(unsignedintt);void_nop5_();voidstart(); voidack() ;voidsend_no_ack();voidwrite(unsignedchardat);unsignedcharread();voidstop();voiddisplay(unsignedcharnum);voidmain(){unsignedchardat1; //用于存儲從24C02中讀出的數(shù)據(jù)start(); //開始信號write(0xa0); //發(fā)送尋址字節(jié)給從機,通知從機要寫數(shù)據(jù)ack(); //檢測從機的應答信號write(0x00); //發(fā)送要寫入的地址,為24C02的0x00位置ack(); //檢測從機的應答信號write(0x0F); //向24C02發(fā)送數(shù)據(jù)0x0Fack(); //檢測從機的應答信號stop(); //寫入完畢,停止通信delay_ms(100); //延時100ms,讓24C02有足夠時間寫入剛收到的數(shù)據(jù)start(); //開始write(0xa0); //發(fā)送尋址字節(jié)給從機,通知從機要寫數(shù)據(jù)ack(); //檢測從機的應答信號write(0x00); //發(fā)送要讀的地址,為24C02的0x00位置ack(); //檢測從機的應答信號start(); //重復一次開始信號write(0xa1); //發(fā)送尋址字節(jié)給從機,通知從機要讀剛才地址中的數(shù)據(jù)ack(); //檢測從機的應答信號dat1=read(); //讀出數(shù)據(jù),并把數(shù)據(jù)存到dat1中send_no_ack(); //讀數(shù)據(jù)完畢,發(fā)送非應答信號stop(); //發(fā)送停止信號,停止通信while(1){display(dat1); //將數(shù)據(jù)顯示到數(shù)碼管中while(1);}}voiddelay_ms(unsignedintt) //tms的延時函數(shù){unsignedinti,j;for(i=0;i<t;i++)for(j=0;j<113;j++);}void_nop5_() //5個機器周期的延時,大約延時5μs{_nop_();_nop_();_nop_();_nop_();_nop_(); }voidstart() //起始信號函數(shù){scl=0; sda=1; scl=1; _nop5_();sda=0; _nop5_(); }voidstop() //停止信號函數(shù){scl=0; sda=0; scl=1; _nop5_();sda=1; _nop5_();}voidack() //檢測從機應答信號的函數(shù){unsignedchari;i=255;scl=0; sda=1; while(sda==1) {if(i>0)i--;elsereturn; } scl=1; _nop5_(); scl=0; }voidsend_no_ack() //主機給從機發(fā)送非應答信號{scl=0; //SCL線拉低,以便讓SDA線準備變化sda=1; //SDA線拉高,即將發(fā)送非應答信號給從機scl=1; //SCL線拉高,將應答信號發(fā)送過去_nop5_(); //SDA線高電平持續(xù)5μs,符合非應答信號要求(>4μs)}voidwrite(unsignedchardat) //主機向從機寫操作函數(shù){unsignedchari;for(i=0;i<8;i++){scl=0; //SCL線拉低,以便讓SDA線準備變化sda=(bit)(0x80&dat); //取字節(jié)數(shù)據(jù)的最高位,發(fā)送到SDA線dat=dat<<1; //發(fā)送的數(shù)據(jù)都是由高位到低位順序發(fā)送的,要將所 //需發(fā)送的那位移到數(shù)據(jù)的最高位,以發(fā)送到SDA線上scl=1; //SCL線拉高,數(shù)據(jù)被發(fā)送過去}}unsignedcharread() //主機向從機讀操作的函數(shù){ unsignedchari;unsignedchardat2; //定義一個字節(jié)變量,用來存儲讀出的從機數(shù)據(jù)dat1=0; for(i=0;i<8;i++){dat2=dat2<<1; //將位數(shù)據(jù)往高位移動,將位數(shù)據(jù)轉換為字節(jié)數(shù)據(jù)scl=0; //SCL線拉低,以便讓SDA線準備變化dat2=dat2|(unsignedchar)sda; //將位數(shù)據(jù)強制轉換成字節(jié)數(shù)據(jù),并存到dat2中scl=1; //SCL線拉高,接收下一位數(shù)據(jù)}returndat2; //數(shù)據(jù)接收完畢,帶數(shù)據(jù)返回}voiddisplay(unsignedcharnum){P0=display_table[num]; //將數(shù)值的編碼送入數(shù)碼管顯示}

6.4I2C串行通信6.4.1I2C串行通信的原理1.總線的構成I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構成的串行總線,可發(fā)送和接收數(shù)據(jù),其構成如圖6.24所示。數(shù)據(jù)可在CPU與被控IC之間、IC與IC之間進行雙向傳送,最高傳送速率100Kb/s。各種被控制電路均并聯(lián)在這條總線上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模塊都有唯一的地址,在信息的傳輸過程中,I2C總線上并接的每一模塊電路既是主控器(或被控器),又是發(fā)送器(或接收器),這取決于它所要完成的功能。CPU發(fā)出的控制信號分為地址碼和控制量兩部分。地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調整的類別(如對比度、亮度等)及需要調整的量。這樣,各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關。2.?I2C總線數(shù)據(jù)傳送時序I2C總線通信有著嚴格的時序,如果時序錯誤將會無法通信。按照I2C總線規(guī)范的約定,傳送的數(shù)據(jù)由起始信號、尋址字節(jié)、數(shù)據(jù)字節(jié)、應答信號以及停止信號組成。I2C總線上進行一次數(shù)據(jù)傳送的時序如圖6.25所示。數(shù)據(jù)位的有效性規(guī)定:I2C總線進行數(shù)據(jù)傳送時,時鐘信號SCL為高電平,數(shù)據(jù)線上的信號SDA必須保持穩(wěn)定。只有SCL為低電平期間SDA上的電平才允許變化。因此在寫數(shù)據(jù)時,要在SCL為低的時候改變SDA。讀數(shù)據(jù)時要在SCL為高的時候讀SDA。3.I2C總線數(shù)據(jù)傳送過程中的三種信號I2C總線在傳送數(shù)據(jù)過程中有三種類型信號,它們分別是起始信號、結束信號和應答信號。(1)起始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù),時序如圖6.26所示。對應的起始信號函數(shù):voidstart(){scl=0; //SCL線拉低,以便讓SDA線準備變化sda=1; //SDA線拉高,準備產生開始信號scl=1; //SCL線拉高_nop5_(); //SDA線高電平持續(xù)5us,以符合起始信號定義的要求(>4.7μs)sda=0; //SDA線拉低,產生開始信號_nop5_(); //SDA線低電平持續(xù)5us, 以符合起始信號定義的要求(>4μs)}(2)結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數(shù)據(jù),時序如圖6.27所示。結束信號函數(shù):voidstop(){scl=0; //SCL線拉低,以便讓SDA線準備變化sda=0; //SDA線拉低,準備產生停止信號scl=1; //SCL線拉高_nop5_(); //SDA線低電平持續(xù)5μs,以符合停止信號定義的要求(>4.7μs)sda=1; //SDA線拉高,產生停止信號_nop5_(); //SDA線的高電平持續(xù)5μs, 以符合停止信號定義的要求(>4.7μs)}(3)應答信號:應答信號由接受設備產生,在SCL為高電平時,接受設備將SDA拉為低電平表示傳輸正確,產生應答;否則為非應答,時序如圖6.28所示。接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應答信號,CPU接收到應答信號后,根據(jù)實際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現(xiàn)故障。應答信號函數(shù):voidack() //檢測從機應答信號的函數(shù){unsignedchari;i=255;scl=0; //SCL線拉低,以便讓SDA線準備變化sda=1; //SDA線拉高,準備檢測從機的應答信號while(sda==1) //當SDA為高電平時,則等待從機的應答將SDA拉低{if(i>0)i--;

elsereturn; //如果i自減到0了,從機還沒響應,則不再等待,返回 } //這種情況極少發(fā)生,一般是從機器件出問題了才會發(fā)生scl=1; //從機已經應答,將SDA線拉低了_nop5_(); //SDA線的低電平持續(xù)5us,符合應答信號要求(>4us)scl=0; //SCL線拉低,以便讓從機把SDA線釋放}接收器件收到一個完整的數(shù)據(jù)字節(jié)后,有可能需要完成一些其它工作,如處理內部中斷服務等,可能無法立刻接收下一個字節(jié),這時接收器件可以將SCL線拉成低電平,從而使主機處于等待狀態(tài)。直到接收器件準備好接收下一個字節(jié)時,再釋放SCL線使之為高電平,從而使數(shù)據(jù)傳送可以繼續(xù)進行。4.數(shù)據(jù)傳送格式1)字節(jié)傳送與應答每一個字節(jié)必須保證是8位長度。數(shù)據(jù)傳送時,先傳送最高位(MSB),每一個被傳送的字節(jié)后面都必須跟隨一位應答位(即一幀共有9位)。傳送一字節(jié)的時序如圖6.29所示。寫一個8位數(shù)到24C02函數(shù):voidwrite_8bit_24c02(ucharsentdata){uchari;for(i=0;i<8;i++){

sda=(bit)(sentdata&0x80);scl=1;scl=0;sentdata<<=1;}}寫一個字節(jié)到24C02函數(shù):voidwrite_1byte_24c02(ucharch,ucharaddress){start(); //起始信號write_8bit_24c02(WriteDeviceAddress); //寫器件的芯片地址ack(); //應答信號write_8bit_24c02(address); //寫芯片的片內地址ack(); //應答信號write_8bit_24c02(ch); //寫8位有效數(shù)據(jù)ack(); //應答信號stop(); //結束信號delay(10); //此處必須有延時,因為24C02在寫數(shù)據(jù)時,需 //要5ms;否則24C02無法進行內部數(shù)據(jù)的擦

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論