![《單片機(jī)原理及應(yīng)用》課件第5章_第1頁(yè)](http://file4.renrendoc.com/view12/M09/25/0C/wKhkGWdIJv6AGSS7AAPIDQ6_s0E638.jpg)
![《單片機(jī)原理及應(yīng)用》課件第5章_第2頁(yè)](http://file4.renrendoc.com/view12/M09/25/0C/wKhkGWdIJv6AGSS7AAPIDQ6_s0E6382.jpg)
![《單片機(jī)原理及應(yīng)用》課件第5章_第3頁(yè)](http://file4.renrendoc.com/view12/M09/25/0C/wKhkGWdIJv6AGSS7AAPIDQ6_s0E6383.jpg)
![《單片機(jī)原理及應(yīng)用》課件第5章_第4頁(yè)](http://file4.renrendoc.com/view12/M09/25/0C/wKhkGWdIJv6AGSS7AAPIDQ6_s0E6384.jpg)
![《單片機(jī)原理及應(yīng)用》課件第5章_第5頁(yè)](http://file4.renrendoc.com/view12/M09/25/0C/wKhkGWdIJv6AGSS7AAPIDQ6_s0E6385.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章單片機(jī)串行口功能擴(kuò)展5.1串行口的功能擴(kuò)展概述5.251系列單片機(jī)與異步串行通信總線接口5.351系列單片機(jī)與同步串行總線接口習(xí)題五5.1串行口功能擴(kuò)展概述隨著單片機(jī)應(yīng)用技術(shù)的發(fā)展,單片機(jī)的應(yīng)用模式也在不斷更新。一方面,單片機(jī)應(yīng)用系統(tǒng)的規(guī)模越來(lái)越大,在其外圍連接了種類繁多的外設(shè);另一方面,單片機(jī)進(jìn)入了計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng),工業(yè)控制系統(tǒng)多采用多機(jī)分布式系統(tǒng)。同時(shí),單片機(jī)的嵌入式系統(tǒng)應(yīng)用模式又使其體積越來(lái)越小,且器件引腳數(shù)目越來(lái)越少。近年來(lái),串行接口設(shè)備憑借其控制靈活、接口簡(jiǎn)單、占用資源少等優(yōu)點(diǎn)在工業(yè)測(cè)控、儀器儀表等領(lǐng)域被廣泛應(yīng)用。這些發(fā)展趨勢(shì)加強(qiáng)了單片機(jī)串行通信的功能,使串行通信技術(shù)成為了單片機(jī)應(yīng)用技術(shù)的重要組成部分。
51系列單片機(jī)內(nèi)部?jī)H有一個(gè)可編程的全雙工串行通信口,具有UART的全部功能。在單片機(jī)應(yīng)用系統(tǒng)開發(fā)中,開發(fā)人員常面臨單片機(jī)串行通信口不足的問(wèn)題,需要對(duì)串行通信口進(jìn)行擴(kuò)展。在進(jìn)行串行通信接口擴(kuò)展設(shè)計(jì)時(shí),必須根據(jù)需要選擇標(biāo)準(zhǔn)接口,同時(shí)要考慮傳輸介質(zhì)、電平轉(zhuǎn)換、通信協(xié)議等問(wèn)題。采用標(biāo)準(zhǔn)接口后,能夠方便地把單片機(jī)與外設(shè)、測(cè)量?jī)x器等有機(jī)地連接起來(lái),構(gòu)成一個(gè)測(cè)控系統(tǒng)。5.2
51系列單片機(jī)與異步串行通信總線接口
51系列單片機(jī)與異步串行通信接口簡(jiǎn)單,只要解決電平轉(zhuǎn)換與驅(qū)動(dòng)問(wèn)題,就可方便地實(shí)現(xiàn)串行通信。異步串行通信接口主要有三類:RS232接口;RS449、RS422、RS423接口;20mA電流環(huán)接口。5.2.1
RS232接口
RS-232C是使用最早、應(yīng)用最多的一種異步串行通信總線標(biāo)準(zhǔn),它是美國(guó)電子工業(yè)協(xié)會(huì)EIA(ElectronicIndustryAssociation)于1962年公布、1969年最后修訂而成的。RS表示RecommendedStandard,232是該標(biāo)準(zhǔn)的標(biāo)識(shí),C表示最后一次修訂。
RS-232C主要用于定義計(jì)算機(jī)系統(tǒng)的一些數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間接口的電氣特性。CRT、打印機(jī)與CPU的通信大都采用RS-232C總線。
1.RS-232C接口的電平轉(zhuǎn)換
RS-232C標(biāo)準(zhǔn)是在TTL電路之前研制的,它的電平不是+5V和地,而是采用負(fù)邏輯,其邏輯電平為:邏輯“0”:+3V~+15V邏輯“1”:-3V~-15V因此,RS-232C不能和計(jì)算機(jī)的TTL電平直接相連,使用時(shí)必須加上適當(dāng)?shù)碾娖睫D(zhuǎn)換電路芯片,否則將使TTL電路燒壞。常用的電平轉(zhuǎn)換接口芯片是傳輸驅(qū)動(dòng)器MC1488和傳輸接收器MC1489,它們是用于計(jì)算機(jī)(終端)與RS232C總線間進(jìn)行電平轉(zhuǎn)換的接口芯片。
MC1488:輸入TTL電平,輸出與RS232C兼容,電源電壓為±15V或±12V;
MC1489:輸入與RS232C兼容,輸出為TTL電平,電源電壓為5V。
MC1488和MC1489的原理電路如圖5.1所示。圖5.1
MC1488、MC1489電平轉(zhuǎn)換原理圖另一種常用的電平轉(zhuǎn)換芯片是MAX232,該芯片有兩個(gè)傳輸驅(qū)動(dòng)器和兩個(gè)傳輸接收器。MAX232系列收發(fā)器的引腳及原理如圖5.2所示。圖5.2
MAX系列收發(fā)器的引腳及原理電路從圖5.2可看出,MAX232系列收發(fā)器由電壓倍增器、電壓反相器、RS-232發(fā)送器和RS232接收器四部分組成。電壓倍增器利用電荷充電泵原理,用電容C1把+5V電壓變換成+10V電壓,并存放在C3上。第二個(gè)電容充電泵用C2將+10V電壓轉(zhuǎn)換成-10V電壓,存儲(chǔ)在濾波電容C4上。因此,RS-232只需+5V單電源即可。這些芯片的收發(fā)性能與MC1488、MC1489基本相同,只是收發(fā)器路數(shù)不同。
2.RS-232C總線標(biāo)準(zhǔn)接口
RS-232C標(biāo)準(zhǔn)規(guī)定的數(shù)據(jù)傳輸率為50b/s、75b/s、100b/s、150b/s、300b/s、600b/s、1200b/s、2400b/s、4800b/s、9600b/s、19200b/s。驅(qū)動(dòng)器允許有2500pF的電容負(fù)載,通信距離將受此電容限制。例如,采用150pF/m的通信電纜時(shí),最大通信距離為15m,若每米電纜的電容量減小,則通信距離可以增加。傳輸距離短的另一原因是RS-232C屬單端信號(hào)傳送,存在共地噪聲和不能抑制共模干擾等問(wèn)題。因此,它一般用于20m以內(nèi)的通信。
RS-232C總線標(biāo)準(zhǔn)規(guī)定了21個(gè)信號(hào),有25條引腳線,常采用25芯D型插頭座,提供一個(gè)主信道和一個(gè)輔助信道,在多數(shù)情況下主要使用主信道。對(duì)于一般異步雙工通信,僅需幾條信號(hào)線就可實(shí)現(xiàn),如一條發(fā)送線、一條接收線及一條地線。RS-232C也有9芯標(biāo)準(zhǔn)D型插頭座。RS-232C引腳排列如圖5.3所示。圖5.3
RS-232C總線引腳排列(a)25芯排列;(b)9芯排列25芯RS-232C引腳信號(hào)定義如表5.1所示。
9芯RS-232C引腳信號(hào)定義如表5.2所示。表5.125芯RS-232C引腳說(shuō)明表5.29芯RS-232C引腳說(shuō)明
RS-232C定義了計(jì)算機(jī)系統(tǒng)的一些數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間接口的電氣特性。
RS-232C提供的兩個(gè)信道中,輔助串行信道提供數(shù)據(jù)控制和第二信道,但其傳輸速率比主信道要低得多。除了速率低之外兩信道無(wú)異,但輔助信道通常很少使用。這里對(duì)主信道的信號(hào)再做詳細(xì)說(shuō)明。信號(hào)分為兩類:一類是DTE與DCE交換的信息——TxD和RxD;另一類是為了正確無(wú)誤地傳輸上述信息而設(shè)計(jì)的聯(lián)絡(luò)信號(hào)。
3.RS-232C接口連線方式
RS-232C標(biāo)準(zhǔn)規(guī)定有25條連接線,雖然其中大部分引腳線有信號(hào)定義,可以使用,但在一般的計(jì)算機(jī)串行通信系統(tǒng)中,僅9個(gè)信號(hào)(不包括保護(hù)地)經(jīng)常使用。計(jì)算機(jī)與終端設(shè)備之間的連接方法如圖5.4所示。最簡(jiǎn)單的RS-232C連接方式,只需交叉連接2條數(shù)據(jù)線以及信號(hào)地線即可,如圖5.5所示。圖5.4
RS-232C直接與終端設(shè)備連接圖5.5
RS-232C三線連接(a)三線連接;(b)簡(jiǎn)化的三線連接在圖5.5(a)中,將各自的RTS和DTR分別接到自己的CTS和DSR端,只要一方使自己的RTS和DTR為1,那么它的CTS、DSR也就為1,從而進(jìn)入了發(fā)送和接收的就緒狀態(tài)。這種接法常用于一方為主動(dòng)設(shè)備,而另一方為被動(dòng)設(shè)備的通信中,如計(jì)算機(jī)與打印機(jī)或繪圖儀之間的通信。這樣,被動(dòng)的一方RTS與DTR常置1,因而CTS、DSR也常置1,使其常處于接收就緒狀態(tài)。只要主動(dòng)一方令線路就緒(DTR=1),并發(fā)出發(fā)送請(qǐng)求(RST=1),即可立即向被動(dòng)的一方傳送信息。圖5.5(b)所示為更簡(jiǎn)單的連接方法。如果說(shuō)圖5.5(a)所示的連接方法在軟件設(shè)計(jì)上還需要檢測(cè)“清除發(fā)送(CTS)”和“數(shù)據(jù)設(shè)備就緒(DSR)”的話,那么圖5.5(b)所示的連接方法則完全不需要檢測(cè)這些信號(hào),隨時(shí)可進(jìn)行數(shù)據(jù)發(fā)送和接收。5.2.2
51單片機(jī)與PC機(jī)間的通信接口利用PC機(jī)配置的異步通信適配器,可以方便地完成PC機(jī)與51單片機(jī)的數(shù)據(jù)通信。
1.接口電路采用MAX232芯片接口的PC機(jī)與51單片機(jī)串行通信接口電路如圖5.6所示。MAX232芯片中有兩路發(fā)送/接收器,與51單片機(jī)接口時(shí),只選其中一路即可。連接時(shí),應(yīng)注意其發(fā)送與接收引腳的對(duì)應(yīng)關(guān)系,否則可能造成器件或計(jì)算機(jī)串口的永久性損壞。圖5.6
PC機(jī)與51單片機(jī)串行通信接口示例電路
2.PC機(jī)端通信軟件設(shè)計(jì)
1)通信協(xié)議波特率:1200b/s;信息格式:8位數(shù)據(jù)位,1位停止位,無(wú)奇偶檢驗(yàn);傳送方式:PC機(jī)采用查詢方式收發(fā)數(shù)據(jù),51單片機(jī)采用中斷方式接收數(shù)據(jù),查詢方式發(fā)送數(shù)據(jù);校驗(yàn)方式:累加和校驗(yàn);握手信號(hào):采用軟件握手。發(fā)送方在發(fā)送之前先發(fā)一聯(lián)絡(luò)信號(hào)(用“?”號(hào)的ASCII碼,接收方接到“?”號(hào)后,回送一個(gè)“·”號(hào)作為應(yīng)答信號(hào)),隨后依次發(fā)送數(shù)據(jù)塊長(zhǎng)度(字節(jié)數(shù)),發(fā)送數(shù)據(jù),最后發(fā)送校驗(yàn)和。接收方在收到發(fā)送方發(fā)過(guò)來(lái)的校驗(yàn)和后,與自己所累加的校驗(yàn)和相比較。若相同,則回送一個(gè)“0”,表示正確傳送并結(jié)束本次通信過(guò)程;若不相同,則回送一個(gè)“F”,并使發(fā)送方重新發(fā)送數(shù)據(jù),直到接收正確為止。為了給出一個(gè)完整的通信程序,下面分別給出C語(yǔ)言PC機(jī)端和匯編語(yǔ)言單片機(jī)端的通信程序。
2)PC機(jī)發(fā)送文件子程序首先介紹通過(guò)串口發(fā)送一個(gè)文件的函數(shù)Sendf(),規(guī)定欲發(fā)送的這個(gè)文件存在當(dāng)前盤上。為了便于說(shuō)明問(wèn)題,只傳送總字節(jié)小于256個(gè)字符的文件。
Sendf()函數(shù)的程序流程圖如圖5.7所示。圖5.7
PC機(jī)發(fā)送文件子函數(shù)流程
PC機(jī)發(fā)送文件子函數(shù)Sendf()的程序清單如下:
Voidsendf(char*fname)
{FIlE*fp;
charch;
inthandle,count,sum=0;
if((fp=fopen(fname,″r″))==NULL)
{printf(″不能打開輸入文件!\n″);
exit(1);}Handle=fileno(fp); /*取得文件句柄*/count=filelength(handle):/*取得文件總字節(jié)數(shù)*/printf(″準(zhǔn)備發(fā)送文件...\n″);do
{ch=′?′;/*發(fā)送聯(lián)絡(luò)信號(hào)*/
sport(ch);
}while(rport()!=′·′);/*直到接到應(yīng)答信號(hào)為止*/
sport(count);/*發(fā)送總字節(jié)數(shù)*/rep:for(;count;count--)
{ch=getc(fp);/*從文件中取一個(gè)字符*/
sum=sum+ch;/*累加校驗(yàn)和*/
if(ferror(fp))
{printf(″讀文件有錯(cuò)誤\n″);
Break;
}
sport(ch);/*從串口發(fā)一個(gè)字符*/
}sport(sum);/*發(fā)送累加校驗(yàn)和*/if(rport()==′F′)
{count=filelength(handle);/*發(fā)送錯(cuò)誤則重發(fā)*/
Sum=0;
fseek(fp,count,1);/*文件指針回退COUNT字節(jié)*/
gotorep;
}else
{fclose(fp);
printf(″發(fā)送文件結(jié)束\n″);
}}
3)PC機(jī)接收文件子程序接收函數(shù)Receivef()采用查詢方式從串口接收一個(gè)總字節(jié)數(shù)小于256個(gè)字符的文件,接收的文件也存于當(dāng)前盤上。接收文件子函數(shù)Receivef()的程序流程圖如圖5.8所示。圖5.8
PC機(jī)接收文件子函數(shù)流程圖
PC機(jī)接收文件子函數(shù)Receivef()的程序清單如下:
voidreceivef(char*fname)
{FILE*fp;
charch;
intcount,temp,sum=0;
remove(fname);/*盤上有同名文件將被刪掉*/
if((fp=fopen(fname,″w″))==NULL)
{printf(″不能打開輸出文件\n″);
exit(1);
}
printf(″接收文件名:%s\n″,fname);
while(rport()!=′?′);/*收到聯(lián)絡(luò)信號(hào)″?″*/
sport(′$′);
ch:′·′;
sport(ch);/*發(fā)應(yīng)答信號(hào)″·″*/
temp=rport();/*收總字節(jié)數(shù)*/
count=temp;rep:for(;count;count--)
{ch=rport();/*從串口接收一個(gè)字符*/
putc(ch,fp);/*將一個(gè)字符寫入文件*/
sam=sum+ch;/*累加校驗(yàn)和*/
if(ferror(fp))
{printf(″寫文件有錯(cuò)誤\n″);
exit(1);
}
}
if(rport()!=sum)
{ch=′F′;
sport(ch);/*校驗(yàn)和有錯(cuò)誤,發(fā)″F″*/
count=temp;
sum=0;
fseek(fp,count,1);/*文件指針回退COUNT個(gè)字 節(jié)*/
gotorep;
}
else
{ch=′0′;
sport(ch);/*校驗(yàn)和正確,發(fā)″0″*/
fclose(fp);
printf(″接收文件結(jié)束\n″);
}
}
4)PC機(jī)主程序(函數(shù))有了上述發(fā)送和接收文件兩個(gè)子函數(shù)之后,就可以在主函數(shù)中使用它們了。主函數(shù)的工作是在完成串口初始化后,根據(jù)鍵入的命令來(lái)決定是發(fā)送文件還是接收文件。主函數(shù)流程圖如圖5.9所示。圖5.9
PC機(jī)主函數(shù)流程圖
PC機(jī)主函數(shù)清單如下:
main(intargc,char*argv[])
{while(argc!=3)
{printf(″命令行命令不正確,請(qǐng)重新鍵入命令!\n″);exit(1);
}
bioscom(0,0x83,0);/*串口初始化*/
if(tolower(*argv[1])==′s′)
sendf(argv[2]);
elseif(tolower(*argv[1))==′r′)
receivef(argv[2]);}這里采用的是帶參主函數(shù)main(intargc,char*argv[])。其中,argc是一個(gè)整型變量,argv[]是一個(gè)字符型指針數(shù)組。利用main()函數(shù)的參數(shù)可以使主程序從系統(tǒng)得到所需數(shù)據(jù)(也就是說(shuō),帶參函數(shù)可直接從DOS命令行中得到參數(shù)值,當(dāng)然,這些值是字符串)。當(dāng)程序運(yùn)行時(shí)(在DOS下執(zhí)行.EXE文件),可以根據(jù)輸入的命令行參數(shù)進(jìn)行相應(yīng)的處理。例如,執(zhí)行程序mypro時(shí),若要從當(dāng)前盤上將名為f1.c的文件從串口發(fā)送出去,則需鍵入下述命令:
myprosfl.c其中,mypro是源文件mypro.c經(jīng)編譯連接后生成的可執(zhí)行文件mypro.exe。鍵入命令:
myprorf2.c可以從串口接收若干字符,并寫入當(dāng)前盤上名為f2.c的文件中。
3.單片機(jī)通信軟件設(shè)計(jì)
1)單片機(jī)查詢發(fā)送子程序程序?qū)⑵釸AM從1000H開始的小于256字節(jié)的數(shù)據(jù)從串行口發(fā)送出去,發(fā)送的數(shù)據(jù)字節(jié)數(shù)在R7中,用R6作累加和寄存器。程序流程圖如圖5.10所示。圖5.10單片機(jī)查詢發(fā)送流程圖單片機(jī)查詢發(fā)送子程序如下:
SEND:MOVA,#3FH
MOVSBUF,A
JNBTI,$
CLRTI ;發(fā)″?″號(hào)
JNBRI,$
CLRRI
MOVA,SBUFCJNEA,#2EH,SEND ;應(yīng)答信號(hào)是″·″MOVA,R7 ;則發(fā)字節(jié)數(shù)MOVR3,A ;暫存總字節(jié)數(shù)MOVSBUF,AJNBTI,$CLRTIMOVR6,#00HMOVDPTR,#1000HSEND1:MOVXA,@DPTRMOVSBUF,A ;發(fā)送一個(gè)字符JNBTI,$CLRTIADDA,R6
;計(jì)算校驗(yàn)和MOVR6,AINCDPTRDJNZR7,SEND1 MOVA,R6MOVSBUF,AJNBTI,$CLRTI
;發(fā)送校驗(yàn)和JNBRI,$CLRRIMOVA,SBUFCJNEA,#46H,SEND2;如收到應(yīng)答是″F″,即46H,則 重發(fā)數(shù)據(jù)RETSEND2:MOVDPTR,#1000HMOVR6,#00HMOVA,R3MOVR7,AAJMPSEND1
2)單片機(jī)接收中斷服務(wù)子程序在中斷服務(wù)子程序中,為了區(qū)別所接收的信號(hào)是聯(lián)絡(luò)信號(hào)還是字節(jié)數(shù),是數(shù)據(jù)還是校驗(yàn)和,需要設(shè)立不同的標(biāo)志位。為此,在可位尋址的RAM中設(shè)定00~03H存儲(chǔ)不同的標(biāo)志位:00H為接收聯(lián)絡(luò)信號(hào)標(biāo)志位;01H為接收字節(jié)數(shù)標(biāo)志位;02H為接收數(shù)據(jù)標(biāo)志位;03H為接收文件結(jié)束標(biāo)志位。在初始化時(shí),這些位均為0。程序流程圖如圖5.11所示。圖5.11單片機(jī)接收中斷服務(wù)子程序流程圖在中斷服務(wù)子程序中,將接收到的字節(jié)數(shù)存入R7中,接收的數(shù)據(jù)存入片外RAM從1000H開始的單元中。單片機(jī)接收中斷服務(wù)子程序如下:
RECE:CLRES
CLRRI
JB00H,RECEl
MOVA,SBUF
CJNEA,#3FH,RECE2;收到的不是″?″號(hào)則退出MOVA,#2EHMOVSBUF,AJNBTI,$CLRTI ;發(fā)送應(yīng)答信號(hào)″·″,即2EHSETB00HSETBESRETIRECE2:MOVA,#24HMOVSBUF,AJNBTI,$CLRTI ;發(fā)送應(yīng)答信號(hào)″$″,即24HSETBESRETIRECE1:JB01H,RECE4MOVA,SBUF ;接收字節(jié)數(shù)MOVR7,AMOVR3,A ;暫存總字節(jié)數(shù)SETB01HSETBESRETIRECE4:JB02H,RECE5MOVA,SBUF ;接收一字符MOVX@DPTR,A
;存入片外RAM中ADDA,R6MOVR6,AINCDPTRDJNZR7,RECE7SETB02HRECE7:SETBESRETIRECE5:MOVA,SBUFCJNEA,06H,RECE8 ;06H為R6的字節(jié)地址MOVA,#4FH ;校驗(yàn)和不正確,重發(fā)數(shù)據(jù)MOVSBUF,AJNBTI,$CLRTI ;校驗(yàn)正確發(fā)″0″,即4FHSETB03HSETBESRETIRECE8:MOVDPTR,#1000HMOVR6,#00HMOVA,R3MOVR7,AMOVA,#46HMOVSBUF,AJNBTI,$CLRTI ;校驗(yàn)不正確發(fā)″F″,即46HCLR02HSETBESRETl
3)單片機(jī)主程序主程序流程圖如圖5.12所示。圖5.12單片機(jī)主程序流程圖單片機(jī)主程序如下:ORG0000HAJMPMAINORG0023HAJMPRECEORG0040HMAIN:MOVSP,#60HMOVSCON,#50H ;串口初始化MOVTMOD,#20HMOVTH1,#0F3HMOVTL1,#0F3HMOVPCON,#00H
;設(shè)置波特率SETBTR1 ;啟動(dòng)定時(shí)器1SETBEA ;開放中斷SETBES ;開放串行中斷L3:CLR00HCLR01HCLR02HCLR03HMOVR6,#00HMOVDPTR,#1000HL2:JB03H,L1SJMPL2L1:ACALLSENDAJMPL35.2.3
RS-449/RS-422/RS-423/RS-485標(biāo)準(zhǔn)接口雖然RS-232應(yīng)用廣泛,但因其推出較早,在通信系統(tǒng)中存在以下缺點(diǎn):數(shù)據(jù)傳輸速率慢,傳輸距離短,未規(guī)定標(biāo)準(zhǔn)的連接器,接口處各信號(hào)間易產(chǎn)生串?dāng)_。鑒于此,EIA制定了新的標(biāo)準(zhǔn)RS449/RS422/RS-423/RS485,這些標(biāo)準(zhǔn)除了與RS-232C兼容外,在提高傳輸速率、增加傳輸距離、改善電氣性能方面有了很大改進(jìn)。
1.RS-449接口
RS-449是1977年公布的標(biāo)準(zhǔn)接口,在很多方面可以代替RS-232C使用,兩者的主要差別在于信號(hào)在導(dǎo)線上的傳輸方法不同。RS-232C是利用傳輸信號(hào)與公共地的電壓差;RS-449是利用信號(hào)導(dǎo)線之間的信號(hào)電壓差,可在1200m的24AWG雙絞線上進(jìn)行數(shù)字通信。
RS-449可以不使用調(diào)制解調(diào)器,它比RS-232C傳輸速率高,通信距離長(zhǎng),且由于RS-449系統(tǒng)用平衡信號(hào)差傳輸高速信號(hào),因而噪聲低,又可以多點(diǎn)或者使用公共線通信,故RS-449通信電纜可與多個(gè)設(shè)備并聯(lián)。
2.RS-422A、RS-423A接口
RS-422A給出了通信電纜、驅(qū)動(dòng)器和接收器的要求,規(guī)定雙端電氣接口型式,其標(biāo)準(zhǔn)是雙端線傳送信號(hào)。它通過(guò)傳輸驅(qū)動(dòng)器將邏輯電平變換成電位差,完成發(fā)送端的信息傳遞;通過(guò)傳輸接收器,把電位差變換成邏輯電平,完成接收端的信息接收。RS-422A比RS-232C傳輸距離長(zhǎng)、速度快,傳輸速率最大可達(dá)100kb/s,在此速率下電纜的允許長(zhǎng)度為12m;如果采用低速率傳輸,則最大距離可達(dá)1200m。
RS-422A與TTL進(jìn)行電平轉(zhuǎn)換最常用的芯片是傳輸驅(qū)動(dòng)器MC3487和傳輸線接收器MC3486。這兩種芯片的設(shè)計(jì)都符合EIA標(biāo)準(zhǔn),RS-422A采用+5V電源供電。
RS-422A的接口電路如圖5.13所示。發(fā)送器MC3487將TTL電平轉(zhuǎn)換為標(biāo)準(zhǔn)的RS-422A電平;接收器MC3486將RS-422A接口信號(hào)轉(zhuǎn)換為TTL電平,采用差分輸入輸出。圖5.13RS-422A接口電平轉(zhuǎn)換電路
美國(guó)電子工業(yè)協(xié)會(huì)于1987年提出了RS-423A總線標(biāo)準(zhǔn),它與RS-422A一樣,也給出了RS-449中對(duì)于通信電纜、驅(qū)動(dòng)器和接收器的要求。RS-423A給出了不平衡信號(hào)差的規(guī)定,而RS-422A給出的是平衡信號(hào)差的規(guī)定。RS-423標(biāo)準(zhǔn)接口的最大傳輸速率為100kb/s,電纜的允許長(zhǎng)度為90m。而差分輸入對(duì)共模干擾信號(hào)有較高的抑制作用,這樣就提高了通信的可靠性。
RS-423A用-6V表示邏輯“1”,用+6V表示邏輯“0”,可以直接與RS-232C相接。采用RS423A標(biāo)準(zhǔn)可以獲得比RS-232C更佳的通信效果。
RS-423A也需要進(jìn)行電平轉(zhuǎn)換,常用的驅(qū)動(dòng)器和接收器分別為MC3488A和MC3486。其接口電路如圖5.14所示,采用差分輸入,單端輸出。圖5.14
RS-423A接口電平轉(zhuǎn)換電路
3.RS-485接口
RS-485接口是20mA電流環(huán)路串行通信接口,也是目前串行通信廣泛使用的一種接口電路。其最大的優(yōu)點(diǎn)是低阻傳輸,對(duì)電氣噪聲不敏感,而且易于實(shí)現(xiàn)光電隔離,非常適于長(zhǎng)距離串行通信。RS-485有兩線制和四線制兩種接口。在兩線制接口中,兩根線組成一個(gè)輸入電流回路,同時(shí)也是輸出電流回路,由邏輯開關(guān)控制。它不能同時(shí)實(shí)現(xiàn)串行數(shù)據(jù)的收發(fā)工作,串行通信只能處于半雙工狀態(tài),但它在線路鋪設(shè)中只需兩根線,因此線路簡(jiǎn)單、成本低,適于串行通信流不太大的場(chǎng)合。在四線制接口中,發(fā)送正、發(fā)送負(fù)、接收正、接收負(fù)四根線組成一個(gè)輸入回路,一個(gè)輸出電流回路。當(dāng)發(fā)送數(shù)據(jù)時(shí),根據(jù)數(shù)據(jù)的邏輯1、0有規(guī)律地使回路形成通、斷狀態(tài)。
RS-485接口芯片很多,常用的有MAX481E和MAX488E。這兩種芯片的主要區(qū)別是前者為半雙工,后者為全雙工。除這兩種芯片外,和MAX481E相同的系列芯片還有MAX483E/485E/487E/1487E。和MAX488E相同的有MAX490E。它們的結(jié)構(gòu)及引腳如圖5.15所示。圖5.15
MAX481E和MAX488E的結(jié)構(gòu)及引腳圖(a)MAX481E;(b)MAX488E由半雙工接口芯片MAX481E構(gòu)成的RS485兩線制接口電路如圖5.16所示。由全雙工接口芯片MAX488E構(gòu)成的RS485四線制接口電路如圖5.17所示圖5.16
MAX481E構(gòu)成的RS-485兩線制接口電路圖圖5.17
MAX488E構(gòu)成的RS-485四線制接口電路圖5.3
51系列單片機(jī)與同步串行總線接口在單片機(jī)應(yīng)用系統(tǒng)中,越來(lái)越多的外圍器件都配置了同步串行擴(kuò)展總線接口,如EPRAM、A/D、D/A及集成智能傳感器等。從20世紀(jì)90年代開始,眾多的單片機(jī)廠商陸續(xù)推出了帶同步串行總線接口的單片機(jī),如Philips公司的8XC552和LPC76X系列帶I2C總線接口,Motorola公司的M68HC05和M68HC11,ATMEL公司的AT89S8252,以及新一代的基于RISC的AVR系列單片機(jī)都集成有SPI接口。目前,同步串行通信總線應(yīng)用越來(lái)越多,主要有I2C、PI、單總線(1wire)、Microwire等。5.3.1
I2C總線
I2C總線(InterICBus)全稱為芯片間總線,是由Philips公司推出的一種基于兩線制的同步串行總線,被廣泛應(yīng)用于消費(fèi)類電子產(chǎn)品、通信產(chǎn)品、儀器通信及工業(yè)系統(tǒng)總線中。
1.I2C總線工作原理
I2C總線采用兩線制,由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成。I2C總線為同步傳輸總線,數(shù)據(jù)線上信號(hào)完全與時(shí)鐘同步。數(shù)據(jù)傳送采用主從方式,即主器件(主控器)尋址從器件(被控器),啟動(dòng)總線,產(chǎn)生時(shí)鐘,傳送數(shù)據(jù)及結(jié)束數(shù)據(jù)的傳送。SDA/SCL總線上掛接的單片機(jī)(主器件)或外圍器件(從器件)的接口電路都應(yīng)具有I2C總線接口,所有器件都通過(guò)總線尋址,而且所有SDA/SCL同名端相連,如圖5.18所示。圖5.18
I2C總線應(yīng)用系統(tǒng)的組成按照I2C總線規(guī)范,總線傳輸中將所有狀態(tài)都生成相應(yīng)的狀態(tài)碼,主器件能夠依照這些狀態(tài)碼自動(dòng)地進(jìn)行總線管理。
Philips公司、Motorola公司和MAXIM公司推出了很多具有I2C總線接口的單片機(jī)及外圍器件,如24C系列E2PROM,A/D和D/A轉(zhuǎn)換器PCF8951,MAX521和MAX5154,LCD驅(qū)動(dòng)PCF8576等。用戶可以根據(jù)數(shù)據(jù)操作要求,通過(guò)標(biāo)準(zhǔn)程序處理模塊完成I2C總線的初始化和啟動(dòng),就能完成規(guī)定的數(shù)據(jù)傳送。
2.總線器件的尋址方式在一般的并行接口擴(kuò)展系統(tǒng)中,器件地址都是由地址線的連接形式?jīng)Q定的,而在I2C總線系統(tǒng)中,地址是由器件類型及其地址引腳電平?jīng)Q定的,對(duì)器件的尋址采用軟件方法。I2C總線上的所有外圍器件都有規(guī)范的器件地址。器件地址由7位組成,它與一位方向位共同構(gòu)成了I2C總線器件的尋址字節(jié)。尋址字節(jié)(SLA)的格式如表5.3所示。表5.3尋址字節(jié)格式器件地址(DA3,DA2,DA1,DA0)是I2C總線外圍器件的固有地址編碼,器件出廠時(shí)就已經(jīng)給定。例如,I2C總線E2PROMAT24C02的器件地址為1010,4位LED驅(qū)動(dòng)器SAA1064的器件地址為0111。引腳地址(A2,A1,A0)是由I2C總線外圍器件引腳所指定的地址端口,A2、A1和A0在電路中可接電源、接地或懸空,根據(jù)其連接狀態(tài)形成地址代碼。數(shù)據(jù)方向位(R/W)規(guī)定了總線上的單片機(jī)(主器件)與外圍器件(從器件)的數(shù)據(jù)傳送方向。R/W=1,表示接收(讀);R/W=0,表示發(fā)送(寫)。
3.總線的電氣結(jié)構(gòu)與驅(qū)動(dòng)能力如圖5.19所示,I2C總線接口內(nèi)部為雙向傳輸電路??偩€端口輸出端為漏極開路,故總線上必須有上拉電阻。上拉電阻RP與電源電壓VDD和總線串接電阻有關(guān),可參考有關(guān)數(shù)據(jù)手冊(cè),通常取5~10kΩ。圖5.19
I2C總線接口的電氣結(jié)構(gòu)
I2C總線上的外圍擴(kuò)展器件都是CMOS器件,屬于電壓型負(fù)載??偩€上的器件數(shù)量不是由電流負(fù)載能力決定的,而是由電容負(fù)載決定的。I2C總線上每個(gè)節(jié)點(diǎn)器件的接口都有一定的等效電容,這會(huì)造成信號(hào)傳輸?shù)难舆t。通常I2C總線的負(fù)載能力為400pF(通過(guò)驅(qū)動(dòng)擴(kuò)展可達(dá)4000pF),據(jù)此可計(jì)算出總線長(zhǎng)度及連接器件的數(shù)量??偩€上每個(gè)外圍器件都有一個(gè)器件地址,擴(kuò)展器件時(shí)也要受器件地址空間的限制。I2C總線傳輸速率為100kb/s,新規(guī)范中傳輸速率可達(dá)400kb/s。
4.I2C總線上的數(shù)據(jù)傳送
1)數(shù)據(jù)傳送
I2C總線上每傳送一位數(shù)據(jù)都與一個(gè)時(shí)鐘脈沖相對(duì)應(yīng)。在時(shí)鐘線高電平期間,數(shù)據(jù)線上必須保持穩(wěn)定的邏輯電平狀態(tài),高電平為數(shù)據(jù)“1”,低電平為數(shù)據(jù)“0”。只有在時(shí)鐘為低電平時(shí),才允許數(shù)據(jù)線上的電平狀態(tài)變化。
I2C總線上數(shù)據(jù)傳送的每一幀數(shù)據(jù)均為一字節(jié)。但啟動(dòng)I2C總線后,傳送的字節(jié)數(shù)沒有限制,只要求每傳送一字節(jié)后,對(duì)方回答一個(gè)應(yīng)答位??偩€傳送完一字節(jié)后,可以通過(guò)對(duì)時(shí)鐘的控制來(lái)使傳送停止。例如,當(dāng)某個(gè)外圍器件接收N字節(jié)后,需要一段處理時(shí)間,以便接收以后的字節(jié)數(shù)據(jù)。這時(shí)可以在應(yīng)答信號(hào)后,使SCL變?yōu)榈碗娖?控制總線暫停;如果單片機(jī)要求總線暫停,則也可使時(shí)鐘線保持低電平,控制總線暫停。在發(fā)送時(shí),首先發(fā)送的是數(shù)據(jù)的最高位。每次傳送開始時(shí)有起始信號(hào),結(jié)束時(shí)有停止信號(hào)。
I2C總線的數(shù)據(jù)傳送過(guò)程如圖5.20所示。圖5.20
I2C總線的數(shù)據(jù)傳送過(guò)程
2)總線信號(hào)I2C總線上與數(shù)據(jù)傳送有關(guān)的信號(hào)有起始信號(hào)(S)、終止信號(hào)(P)、應(yīng)答信號(hào)(A)、非應(yīng)答信號(hào)(A)以及總線數(shù)據(jù)位?,F(xiàn)分述如下:
·起始信號(hào)(S):在時(shí)鐘SCL為高電平時(shí),數(shù)據(jù)線SDA出現(xiàn)由高到低的下降沿,被認(rèn)為是起始信號(hào)。只有出現(xiàn)起始信號(hào)以后,其他命令才有效。
·終止信號(hào)(P):在時(shí)鐘SCL為高電平時(shí),數(shù)據(jù)線SDA出現(xiàn)由低到高的上升沿,被認(rèn)為是終止信號(hào)。隨著終止信號(hào)的出現(xiàn),所有外部操作都結(jié)束。起始信號(hào)和終止信號(hào)如圖5.21所示。這兩個(gè)信號(hào)都是由主器件產(chǎn)生的,總線上帶有I2C總線接口的器件很容易檢測(cè)到這些信號(hào)。但對(duì)于不具備I2C總線接口的一些單片機(jī)來(lái)說(shuō),為了準(zhǔn)確地檢測(cè)這些信號(hào),必須保證在總線的一個(gè)時(shí)鐘周期內(nèi)對(duì)數(shù)據(jù)線至少進(jìn)行兩次采樣。圖5.21
I2C總線的起始信號(hào)和終止信號(hào)
·應(yīng)答信號(hào)(A):I2C總線傳送數(shù)據(jù)時(shí),每傳送一個(gè)字節(jié)數(shù)據(jù)后都必須有應(yīng)答信號(hào),與應(yīng)答信號(hào)相對(duì)應(yīng)的時(shí)鐘由主器件產(chǎn)生。這時(shí),發(fā)送方必須在這一時(shí)鐘上釋放總線,使其處于高電平狀態(tài),以便接收方在這一位上送出應(yīng)答信號(hào)。應(yīng)答信號(hào)產(chǎn)生的時(shí)序如圖5.22所示。應(yīng)答信號(hào)在第9個(gè)時(shí)鐘位上出現(xiàn),接收方輸出低電平為應(yīng)答信號(hào)。圖5.22
I2C總線上的應(yīng)答信號(hào)非應(yīng)答信號(hào)(A):每傳送完一字節(jié)數(shù)據(jù)后,在第9個(gè)時(shí)鐘位上接收方輸出高電平為非應(yīng)答信號(hào)。由于某種原因而使接收方不產(chǎn)生應(yīng)答時(shí)(如接收方正在進(jìn)行其他處理而無(wú)法接收總線上的數(shù)據(jù)),則必須釋放總線,將數(shù)據(jù)線置高電平,然后主控器可通過(guò)產(chǎn)生一個(gè)停止信號(hào)來(lái)終止總線數(shù)據(jù)傳輸。當(dāng)主器件接收來(lái)自從器件的數(shù)據(jù)時(shí),接收到最后一個(gè)字節(jié)數(shù)據(jù)后,必須給從器件發(fā)送一個(gè)非應(yīng)答信號(hào)(A),使從器件釋放數(shù)據(jù)總線,以便主器件發(fā)送停止信號(hào),從而終止數(shù)據(jù)傳送。
·總線數(shù)據(jù)位:在I2C總線啟動(dòng)后或應(yīng)答信號(hào)后的第1~8個(gè)時(shí)鐘脈沖對(duì)應(yīng)一個(gè)字節(jié)的8位數(shù)據(jù)傳送。在數(shù)據(jù)傳送期間,只要時(shí)鐘線為高電平,數(shù)據(jù)線上必須保持穩(wěn)定的邏輯電平狀態(tài),否則數(shù)據(jù)線上的任何變化都被當(dāng)作起始或停止信號(hào)。
3)數(shù)據(jù)傳送格式按照I2C總線規(guī)范,起始信號(hào)表明一次數(shù)據(jù)傳送的開始,其后為尋址字節(jié),在尋址字節(jié)后是按指定讀、寫操作的數(shù)據(jù)字節(jié)與應(yīng)答位。在數(shù)據(jù)傳送完成后,主器件必須發(fā)送停止信號(hào)。在起始信號(hào)與停止信號(hào)之間傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)由單片機(jī)決定??偩€上的數(shù)據(jù)傳送有許多讀/寫組合方式。下面介紹三類數(shù)據(jù)傳送格式:
·主器件的寫操作:主器件向被尋址的從器件發(fā)送n個(gè)數(shù)據(jù)字節(jié),整個(gè)傳送過(guò)程中數(shù)據(jù)傳送方向不變。其數(shù)據(jù)傳送格式如下:
S
SLAW
A
Data1
A
Data2
A
…
…
Data(n-1)
A
Datan A/A
P其中:SLAW為尋址字節(jié)(寫),Data1~Datan為寫入從器件的n個(gè)數(shù)據(jù)字節(jié)。
·主器件的讀操作:主器件讀出來(lái)自從器件的n個(gè)字節(jié),整個(gè)傳送過(guò)程中除尋址字節(jié)外,都是從器件發(fā)送、主器件接收的過(guò)程。數(shù)據(jù)傳送格式如下:
S
SLAR
A
Data1
A
Data2
A
…
…
Data(n-1)
A Datan
A
P其中:SLAR為尋址字節(jié)(讀);Data1~Datan為從器件被讀出的n個(gè)字節(jié)。主器件發(fā)送停止信號(hào)前應(yīng)發(fā)送非應(yīng)答信號(hào)A,向從器件表明讀操作要結(jié)束。
·主器件的讀、寫操作:在一次數(shù)據(jù)傳輸過(guò)程中需要改變傳送方向的操作,此時(shí)起始位和尋址字節(jié)都會(huì)重復(fù)一次,但兩次讀、寫方向正好相反。數(shù)據(jù)傳送格式如下:其中:Sr為重復(fù)起始信號(hào),數(shù)據(jù)字節(jié)的傳送方向決定于尋址字節(jié)的方向位;SLAW/R和SLAR/W分別表示寫/讀尋址字節(jié)或讀/寫尋址字節(jié)。
5.無(wú)I2C總線硬件控制接口的51單片機(jī)使用I2C總線時(shí)的接口模擬在使用I2C總線器件時(shí),首先考慮帶有I2C總線硬件控制接口的芯片,例如Philips公司的P87C591,CYPRESS公司的CY7C646XX等芯片。這些芯片有I2C總線硬件控制接口,只需按技術(shù)要求連接即可。不帶有I2C總線硬件控制接口的51單片機(jī)與I2C總線器件接口需采用軟件模擬方法來(lái)實(shí)現(xiàn)數(shù)據(jù)傳輸。
1)單片機(jī)與I2C總線的硬件連接用不帶I2C接口的51單片機(jī)控制I2C總線時(shí),利用軟件進(jìn)行模擬,需在兩條I/O線上形成SCL和SDA,與I2C總線的SCL和SDA直接相連,再加上拉電阻(5.1kΩ)即可。硬件接口如圖5.23所示。圖5.23
51單片機(jī)與I2C器件連接
2)單片機(jī)對(duì)I2C總線的控制程序圖5.23所示的單片機(jī)應(yīng)用系統(tǒng)中只有一個(gè)CPU,這種單主系統(tǒng)采用I2C總線技術(shù)時(shí),總線上只有單片機(jī)對(duì)I2C總線從器件的訪問(wèn),沒有總線的競(jìng)爭(zhēng)等問(wèn)題,這種情況下只需要模擬主發(fā)送和主接收時(shí)序?;谏鲜隹紤],硬件選用P1.6和P1.7作為時(shí)鐘線SCL和數(shù)據(jù)線SDA,晶振采用6MHz。軟件提供一組模擬程序,包括啟動(dòng)(STA)、停止(STOP)、發(fā)送應(yīng)答位(MACK)、發(fā)送非應(yīng)答位(NMACK)、應(yīng)答位檢查(CACK)、發(fā)送一字節(jié)數(shù)據(jù)(WRBYT)、接收一字節(jié)數(shù)據(jù)(RDBYT)、發(fā)送N字節(jié)數(shù)據(jù)和接收N字節(jié)數(shù)據(jù)(RDNBYT)9個(gè)子程序。有了這組模擬子程序,即可實(shí)現(xiàn)I2C總線上的數(shù)據(jù)傳輸。設(shè)計(jì)模擬子程序時(shí),需模擬I2C總線典型信號(hào)時(shí)序。I2C總線數(shù)據(jù)傳送時(shí),有起始(S)、終止(P)、發(fā)送0代表應(yīng)答(A)、發(fā)送1代表非應(yīng)答(A)等信號(hào)。按照典型I2C總線傳送速率的要求,這些信號(hào)、時(shí)序如圖5.24(a)、(b)、(c)和(d)所示。圖5.24
I2C總線數(shù)據(jù)傳送典型信號(hào)時(shí)序(a)起始位;(b)終止位;(c)應(yīng)答位;(d)非應(yīng)答位對(duì)于I2C總線的典型信號(hào),可以用指令操作來(lái)模擬其時(shí)序過(guò)程。若51單片機(jī)的系統(tǒng)時(shí)鐘為6MHz,相應(yīng)的單周期指令的周期為2μs,則有模擬起始(STA)、終止(STOP)、發(fā)送應(yīng)答(MACK)、發(fā)送非應(yīng)答(NMACK)的4個(gè)模擬子程序及5個(gè)調(diào)用上述模擬子程序的I2C總線數(shù)據(jù)傳送子程序。5個(gè)數(shù)據(jù)傳送子程序?yàn)橛袘?yīng)答位檢查(CACK)、發(fā)送一字節(jié)(WRBYTE)、接收一字節(jié)(RBYTE)、發(fā)送N字節(jié)(WRNBYTE)和接收N字節(jié)(RDNBYTE)。
(1)啟動(dòng)位I2C總線子程序STA:
STA:SETBSDA
SETBSCL
NOP;起始條件建立時(shí)間大于4.7μs
NOP
NOP
CLRSDA
NOP;起始條件鎖定時(shí)間大于4.7μs
NOP
NOP
CLRSCL;鉗住總線,準(zhǔn)備發(fā)送數(shù)據(jù)
RET該程序產(chǎn)生了圖5.24(a)所示的起始信號(hào)。
(2)停止位I2C總線子程序STOP:
STOP:CLRSDA
SETBSCL;發(fā)送停止條件的時(shí)鐘信號(hào)
NOP;停止總線時(shí)間大于4.7μs
NOP
NOP
SETBSDA;停止總線
NOP
NOP
NOP
CLRSDA
CLRSCL
RET該程序產(chǎn)生了圖5.24(b)所示的停止信號(hào)。
(3)發(fā)送應(yīng)答位信號(hào)子程序MACK:
MACK:CLRSDA
SETBSCL
NOP;保持?jǐn)?shù)據(jù)時(shí)間,即SCL為高,時(shí)間大于4.7μs
NOP
NOP
CLRSCL
SETBSDA
RET該程序產(chǎn)生了圖5.24(c)所示的應(yīng)答信號(hào)。
(4)發(fā)送非應(yīng)答位信號(hào)子程序NMACK:
NMACK:SETBSDA
SETBSCL
NOP;保持?jǐn)?shù)據(jù)時(shí)間,即SCL為高,時(shí)間大于4.7μs
NOP
NOP
CLRSCL
CLRSDA
RET該程序產(chǎn)生了圖5.24(d)所示的非應(yīng)答信號(hào)。在使用上述子程序時(shí),如果單片機(jī)的時(shí)鐘不是6MHz,則應(yīng)調(diào)整NOP指令個(gè)數(shù),以滿足時(shí)序要求。
(5)應(yīng)答位檢查子程序CACK。在應(yīng)答位檢查子程序(CACK)中,設(shè)置了標(biāo)志位。CACK中用F0作標(biāo)志位,當(dāng)檢查到正常應(yīng)答位后,F0=0;否則F0=1。
CACK:SETBSDA;置SDA為輸入方式
SETBSCL
;使SDA上數(shù)據(jù)有效CLRF0 ;預(yù)設(shè)F0=0NOPMOVC,SDA;輸入SDA引腳狀態(tài)JNCCEND;檢查SDA狀態(tài),正常應(yīng)答轉(zhuǎn)CEND,且F0=0SETBF0 ;無(wú)正常應(yīng)答,F0=1CEND:CLRSCL;子程序結(jié)束,使SCL=0RET
(6)發(fā)送一字節(jié)數(shù)據(jù)子程序WRBYTE。該子程序是向虛擬I2C總線的數(shù)據(jù)線SDA上發(fā)送一字節(jié)數(shù)據(jù)的操作。調(diào)用該子程序前,將要發(fā)送的數(shù)據(jù)送入A中。占用資源:R0,C。
WRBYTE:MOVR0,#08H;8位數(shù)據(jù)長(zhǎng)度送R0中
WLP:RLCA ;發(fā)送數(shù)據(jù)左移,使發(fā)送位入C
JCWR1 ;判斷發(fā)送1還是0,發(fā)送1轉(zhuǎn)WRlAJMPWR0 ;發(fā)送0轉(zhuǎn)WR0WLP1:DJNZR0,WLP;8位是否發(fā)送完,未完轉(zhuǎn)WLPRET ;8位發(fā)送完結(jié)束WR1:SETBSDA
;發(fā)送1程序段SETBSCLNOPNOPNOPCLRSCLCLRSDAAJMPWLP1WR0:CLRSDA;發(fā)送0程序段SETBSCLNOPNOPNOPCLRSCLAJMPWLP1
(7)從SDA上接收一字節(jié)數(shù)據(jù)子程序RDBYTE。該子程序用來(lái)從SDA上讀取一字節(jié)數(shù)據(jù),執(zhí)行本程序后,從SDA上讀取的一字節(jié)數(shù)據(jù)存放在R2或A中。占用資源:R0、R2和C。RDBYTE:MOVR0,#08H;8位數(shù)據(jù)長(zhǎng)度送R0中RLP:SETBSDA
;置SDA為輸入方式SETBSCL
;使SDA上數(shù)據(jù)有效MOVC,SDA
;讀入SDA引腳狀態(tài)MOVA,R2
;讀入0程序段,由C拼裝入R2中RLCAMOVR2,ACLRSCL
;使SCL=0可繼續(xù)接收數(shù)據(jù)位DJNZR0,RLP
;8位讀完了嗎?未讀完轉(zhuǎn)RLPRET
(8)向被控器發(fā)送N字節(jié)數(shù)據(jù)子程序WRNBYTE。在I2C總線數(shù)據(jù)傳送中,主控器常常需要連續(xù)地向外圍器件發(fā)送多個(gè)字節(jié)數(shù)據(jù),本子程序是用來(lái)向SDA線上發(fā)送N字節(jié)數(shù)據(jù)的操作。該子程序的編寫必須按照I2C總線規(guī)定的讀/寫操作格式進(jìn)行。如主控器向I2C總線上某個(gè)外圍器件連續(xù)發(fā)送N個(gè)數(shù)據(jù)字節(jié)時(shí),其數(shù)據(jù)操作格式如下:其中,SLAW為外圍器件尋址字節(jié)(寫)。按照上述操作格式所編寫的發(fā)送N字節(jié)的通用子程序(WRNBYTE)如下:WRNBYTE:MOVR3,NUMBYTE
LCALL,STA;啟動(dòng)I2C總線
MOVA,SLA;發(fā)送SLAW字節(jié)
LCALLWRBYTE
LCALLCACK;檢查應(yīng)答位JBF0,WRNBYTE;非應(yīng)答位則重發(fā)MOVR1,#MTDWRDA:MOVA,@R1LCALLWRBYTELCALLCACKJBF0,WRNBYTEINCR1DJNZR3,WRDALCALLSTOPRET在使用本子程序時(shí),占用資源為R1和R3,但需調(diào)用STA、STOP、WRBYTE和CACK子程序,而且使用了一些符號(hào)單元。在使用這些符號(hào)單元時(shí),應(yīng)在片內(nèi)RAM中分配好地址。這些符號(hào)單元有:
·MTD:主節(jié)點(diǎn)發(fā)送數(shù)據(jù)緩沖區(qū)首址;
·SLA:外圍器件尋址字節(jié)存放單元;
·NUMBYT:發(fā)送數(shù)據(jù)字節(jié)數(shù)存放單元。在調(diào)用本子程序之前,必須將要發(fā)送的N字節(jié)數(shù)據(jù)依次存放在以MTD為首地址的發(fā)送數(shù)據(jù)緩沖區(qū)中。在調(diào)用本子程序后,N字節(jié)數(shù)據(jù)依次傳送到外圍器件內(nèi)部相應(yīng)的地址單元中。
(9)從外圍器件讀取N字節(jié)數(shù)據(jù)子程序RDNBYT。在I2C總線系統(tǒng)中,主控器按主接收方式從外圍器件中讀出N字節(jié)數(shù)據(jù)的操作格式如下:其中:A為非應(yīng)答位,主節(jié)點(diǎn)在接收完N字節(jié)后,必須發(fā)送一個(gè)非應(yīng)答位;SLAR為外圍器件尋址字節(jié)(讀)。按照上述操作格式所編寫的通用N字節(jié)接收子程序(RDNBYTE)如下:RDNBYTE:MOVR3,NUMBYTELCALLSTA ;發(fā)送啟動(dòng)位MOVA,SLA ;發(fā)送尋址字節(jié)(讀)LCALLWRBYTELCALLCACK ;檢查應(yīng)答位JBF0,RDNBYTE ;非正常應(yīng)答時(shí)重新開始RDN:MOVR1,#MRD;接收數(shù)據(jù)緩沖區(qū)首址MRD入
R1RDNl:LCALLRDBYTE ;讀入一字節(jié)到接收數(shù)據(jù) 緩沖區(qū)中MOV@R1,ADJNZR3,ACK ;N字節(jié)讀完了嗎?未完轉(zhuǎn)ACKLCALLNMACK ;N字節(jié)讀完發(fā)送非應(yīng)答位ALCALLSTOP ;發(fā)送停止信號(hào)RET ;子程序結(jié)束ACK:LCALLMACK;發(fā)送應(yīng)答位INCR1 ;指向下一個(gè)接收數(shù)據(jù)緩沖單元SJMPRDN1 ;轉(zhuǎn)讀入下一個(gè)字節(jié)數(shù)據(jù)在使用RDNBYTE子程序時(shí),占用資源R1和R3,但需調(diào)用STA、STOP、WRBYTE、RDBYTE、CACK、MACK和NMACK等子程序,并滿足這些子程序的調(diào)用要求。RDNBYTE子程序中使用了一些符號(hào)單元,除了在RNDYTE子程序中使用過(guò)的SLA、MTD和NUMBYTE外,還有以下兩個(gè):
·SLA:器件尋址(讀)存放單元;
·MRD:主節(jié)點(diǎn)中數(shù)據(jù)接收緩沖區(qū)首址;在調(diào)用RDNBYTE子程序后,所指定首地址中的N字節(jié)數(shù)據(jù)將被讀入片內(nèi)以MRD為首址的數(shù)據(jù)緩沖器中。在主程序初始化中,應(yīng)有如下形式的語(yǔ)句:
SDABITP1.7
SCLBITP1.6MTDEQU30H;MTD:發(fā)送數(shù)據(jù)緩沖區(qū)首址
MRDEQU40H;MRD:接收數(shù)據(jù)緩沖區(qū)首址
SLAEQU60H;SLA:尋址字節(jié)SLAR/W的存放單 元
NUMBYTEEQU6lH;NUMBYTE:傳送字節(jié)數(shù)存放單 元5.3.2
SPI總線接口
SPI(SerialPeripheralInterface,串行外圍設(shè)備接口)是由Motorala公司提出的一種基于四線制的同步串行總線。SPI總線接口在速度要求不高、低功耗、需保存少量參數(shù)的智能化儀器儀表及控制系統(tǒng)中得到了廣泛應(yīng)用。
1.SPI總線單主系統(tǒng)的組成
SPI總線通信基于主從配置,它有以下4個(gè)信號(hào):
MOSI:主器件數(shù)據(jù)輸出,從器件數(shù)據(jù)輸入;
MISO:主器件數(shù)據(jù)輸入,從器件數(shù)據(jù)輸出;
SCLK:時(shí)鐘信號(hào),由主器件產(chǎn)生;
SS:從器件使能信號(hào),由主器件控制。
SPI總線系統(tǒng)可直接與各個(gè)廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件接口。外圍器件可包括EEPROM、FLASH、實(shí)時(shí)時(shí)鐘、AD轉(zhuǎn)換器以及數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器等。使用SPI總線可很方便地構(gòu)成主從分布式系統(tǒng)。圖5.25是SPI總線典型結(jié)構(gòu)示意圖。圖5.25
SPI總線外圍擴(kuò)展結(jié)構(gòu)示意圖單片機(jī)與外圍擴(kuò)展器件連接時(shí),SCK、MOSI、MISO上都是同名端相連。帶SPI接口的外圍器件都有從屬片選擇端SS。在擴(kuò)展多個(gè)SPI外圍器件時(shí),單片機(jī)應(yīng)通過(guò)相應(yīng)I/O端分時(shí)選通外圍器件。當(dāng)系統(tǒng)中有多個(gè)SPI接口的單片機(jī)時(shí),應(yīng)區(qū)別其主從地位,在某一時(shí)刻只能有一個(gè)單片機(jī)為主器件。主控器件控制數(shù)據(jù)向1個(gè)或多個(gè)外圍器件傳送,從器件只能在主機(jī)發(fā)命令時(shí),接收或向主機(jī)傳送數(shù)據(jù)。其數(shù)據(jù)的傳遞格式是高位(MSB)在前,低位(LSB)在后。SPI總線時(shí)序如圖5.26所示。圖5.26
SPI總線工作時(shí)序
SPI系統(tǒng)可工作在全雙工方式下,主SPI的時(shí)鐘信號(hào)(SCK)使傳輸同步,移位寄存器中的數(shù)據(jù)位在SCK下降沿從輸出引腳(MOSI)輸出;在SCK上升沿從輸入引腳(MISO)接收的數(shù)據(jù)逐位移到移位寄存器,發(fā)送一個(gè)字節(jié)后,從另一個(gè)外圍器件接收的字節(jié)數(shù)據(jù)進(jìn)入移位寄存器中。對(duì)具有SPI總線控制器的單片機(jī)而言,可方便地以規(guī)定時(shí)序工作。
2.51單片機(jī)串行擴(kuò)展SPI外設(shè)的接口方法舉例對(duì)于沒有SPI接口的51單片機(jī)來(lái)說(shuō),可使用硬件和軟件來(lái)模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和輸出。下面以51單片機(jī)與具有SPI總線的EEPROM芯片MCM2814為例來(lái)說(shuō)明接口連接和模擬程序設(shè)計(jì)。圖5.27
51單片機(jī)與SPI器件連接示例
MCM2814芯片的SPI總線信號(hào)可連接于51單片機(jī)的四條I/O線上,在I/O線上輸出相應(yīng)的時(shí)序信號(hào)來(lái)控制數(shù)據(jù)傳輸操作。
51單片機(jī)與SPI接口連接如圖5.27所示。根據(jù)圖5.26所示的SPI總線工作時(shí)序,輸出數(shù)據(jù)時(shí),SCK(P1.1)信號(hào)由高變低,MOSI(P1.0)高電平為1,低電平為0,8個(gè)循環(huán)完成一字節(jié)的輸出。輸入數(shù)據(jù)時(shí),SCK(P1.1)信號(hào)由低變高,MISO(P1.3)高電平為1,低電平為0,8個(gè)循環(huán)完成一字節(jié)的輸入。下面為MCU串行輸出子程序SPIOUT,功能為將51單片機(jī)中R0寄存器的內(nèi)容傳送到MCM2814的SPISI線上:
SPIOUT:SETBP1.1 ;使P1.1(時(shí)鐘)輸出為1
CLRP1.2 ;選擇從機(jī)
MOVR1,#07H ;置循環(huán)次數(shù)
MOVA,R0 ;1字節(jié)數(shù)據(jù)送累加器ACC
MOVP1.0,C
SPIOT1:CLRP1.1;使P1.1(時(shí)鐘)輸出為0
NOP ;延時(shí)NOPRLCA ;左移累加器ACC最高位至CMOVP1.0,C ;進(jìn)位C送從機(jī)SPISI輸入線上SETBP1.1 ;使P1.1(時(shí)鐘)輸出為1DJNZR1,SPIOTl;判斷是否循環(huán)8次(1字節(jié)數(shù)據(jù))RET ;返回下面為MCU串行輸入子程序SPIIN,功能為從MCM2814的SPISO線上接收1字節(jié)數(shù)據(jù)并放入寄存器R0中:SPIIN:CLRP1.1;使P1.1(時(shí)鐘)輸出為0CLRP1.2 ;選擇從機(jī)MOVR1,#08H ;置循環(huán)次數(shù)SPIN1:SETBP1.1;使P1.1(時(shí)鐘)輸出為1NOP ;延時(shí)NOPMOVC,P1.3 ;從機(jī)輸出SPISO送進(jìn)位CRLCA ;左移至累加器ACCCLRP1.1 ;使P1.0(時(shí)鐘)輸出為1DJNZR1,SPIN1 ;判斷是否循環(huán)8次(1字節(jié)數(shù)據(jù))MOVR0,A ;1字節(jié)數(shù)據(jù)送R0RET ;返回下面是MCU串行輸入/輸出子程序SPIIO,功能為將51單片機(jī)中R0寄存器的內(nèi)容傳送到MCM2814的SPISI中,同時(shí)從MCM2814的SPISO接收1字節(jié)數(shù)據(jù)存入R0中:SPIIO:CLRP1.1;使P1.1(時(shí)鐘)輸出為0CLRP1.2 ;選擇從機(jī)MOVR1,#08H ;置循環(huán)次數(shù)MOVA,R0 ;1字節(jié)數(shù)據(jù)送累加器ACCSPIOI:SETBP1.1;使P1.1(時(shí)鐘)輸出為0NOP ;延時(shí)NOPMOVC,P1.3 ;從機(jī)輸出SPI送進(jìn)位CRLCA ;左移累加器ACC最高位至CMOVP1.0,C ;進(jìn)位C送從機(jī)輸入CLRP1.1 ;使P1.1(時(shí)鐘)輸出為0DJNZRl,SPIOI ;判斷是否循環(huán)8次(1字節(jié)數(shù)據(jù))MOVR0,ARET ;返回以上子程序適用于在串行時(shí)鐘的上升沿輸入和下降沿輸出的各種串行外圍接口芯片,如8位或10位A/D芯片,74LS系列輸出芯片等。對(duì)于下降沿輸入、上升沿輸出的各種串行外圍接口芯片,只需改變P1.1的輸出順序,即輸出0,再輸入1;再輸出0,…,則這些子程序也同樣適用。5.3.3單總線(1Wire)接口
1.單總線技術(shù)簡(jiǎn)介單總線是美國(guó)達(dá)拉斯半導(dǎo)體公司(DALLAS)推出的外圍擴(kuò)展總線,它將地址線、數(shù)據(jù)線、控制線、電源線合為一根信號(hào)線,允許在這根線上掛接數(shù)百個(gè)測(cè)控對(duì)象。在單總線上掛接的測(cè)控對(duì)象使用的芯片,每個(gè)都有一個(gè)64位的ROM(也稱之為身份證號(hào)),確保掛接在單總線上后,可以被唯一地識(shí)別出來(lái),這是定位和尋址器件實(shí)現(xiàn)單總線測(cè)控功能的前提條件。
ROM中含有CRC校驗(yàn)碼,能確保數(shù)據(jù)交換可靠;芯片內(nèi)還有收、發(fā)控制和電源存儲(chǔ)電路,一般不用另附電源。這些芯片在控制地點(diǎn)就把模擬信號(hào)數(shù)字化,單總線上傳送的是數(shù)字信號(hào),使系統(tǒng)的抗干擾能力好,可靠性高。單總線系統(tǒng)是由一個(gè)總線命令者和一個(gè)或多個(gè)從者組成的計(jì)算機(jī)應(yīng)用系統(tǒng)。系統(tǒng)按單總線協(xié)議規(guī)定的時(shí)序和信號(hào)波形進(jìn)行初始化、識(shí)別器件和交換數(shù)據(jù)。
1)單總線硬件配置單總線信號(hào)時(shí)序如圖
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)藥公司宿舍房屋租賃合同范文
- 2025年建筑現(xiàn)澆樓板合同樣本
- 2025年光學(xué)計(jì)量標(biāo)準(zhǔn)器具項(xiàng)目提案報(bào)告模板
- 2025年企業(yè)籌資借款策劃合同范本
- 2025年住宅購(gòu)置合同樣式
- 2025年個(gè)人司機(jī)工作合同
- 2025年企業(yè)消費(fèi)信貸擔(dān)保協(xié)議范本
- 2025年企業(yè)非全日制勞動(dòng)合同模板
- 2025年產(chǎn)品進(jìn)出口策劃合同協(xié)議書
- 2025年體育賽事策劃大型音響系統(tǒng)租賃協(xié)議
- 二零二五年度文化教育培訓(xùn)中心承包工程2篇
- 2025年廣州中醫(yī)藥大學(xué)順德醫(yī)院(佛山市順德區(qū)中醫(yī)院)招考聘用高頻重點(diǎn)提升(共500題)附帶答案詳解
- 中國(guó)高血壓防治指南(2024年修訂版)
- 春節(jié)后復(fù)工安全教育培訓(xùn)考試試題及答案
- 離心式壓縮機(jī)功率公式
- 柴油機(jī)突然停機(jī)的原因及判斷處理
- 參保人員就醫(yī)流程doc
- 微觀經(jīng)濟(jì)學(xué)圖示分析匯總分解(共17頁(yè))
- 現(xiàn)場(chǎng)材料浪費(fèi)罰款單(精編版)
- ABB智能定位器TZID-C調(diào)試說(shuō)明書(中文正式版)
- (完整版)倉(cāng)儲(chǔ)客戶需求調(diào)研表.doc
評(píng)論
0/150
提交評(píng)論