版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
一、學(xué)習(xí)目標(biāo)1.了解單片機(jī)的串口的概念。2.掌握單片機(jī)串口硬件結(jié)構(gòu)。3.掌握單片機(jī)串口通信工作方式。4.掌握單總線(一線總線)工作原理。5.掌握單片機(jī)驅(qū)動(dòng)DS18B20驅(qū)動(dòng)方法。二、學(xué)習(xí)任務(wù)任務(wù)一用串口擴(kuò)展IO口;任務(wù)二單片機(jī)雙機(jī)通信;任務(wù)三PC與單片機(jī)串口通信;任務(wù)四DS18B20溫度采集系統(tǒng)。三、任務(wù)分解任務(wù)一用串口擴(kuò)展I0口【任務(wù)描述】大街上有很多點(diǎn)陣廣告屏,有的是插U盤更新內(nèi)容,有的則是使用PC機(jī)通過單片機(jī)串口動(dòng)態(tài)更新內(nèi)容,串口動(dòng)態(tài)更新內(nèi)容的實(shí)質(zhì)就是單片機(jī)與外界通信。單片機(jī)之間可實(shí)現(xiàn)雙機(jī)通信、多機(jī)通信并可與PC機(jī)通信;利用PC機(jī)與單片機(jī)可組成上位機(jī)、下位機(jī)通信網(wǎng)絡(luò)。本任務(wù)用單片機(jī)的串口擴(kuò)展出8個(gè)IO口,實(shí)現(xiàn)流水燈效果。【任務(wù)描述】大街上有很多點(diǎn)陣廣告屏,有的是插U盤更新內(nèi)容,有的則是使用PC機(jī)通過單片機(jī)串口動(dòng)態(tài)更新內(nèi)容,串口動(dòng)態(tài)更新內(nèi)容的實(shí)質(zhì)就是單片機(jī)與外界通信。單片機(jī)之間可實(shí)現(xiàn)雙機(jī)通信、多機(jī)通信并可與PC機(jī)通信;利用PC機(jī)與單片機(jī)可組成上位機(jī)、下位機(jī)通信網(wǎng)絡(luò)。本任務(wù)用單片機(jī)的串口擴(kuò)展出8個(gè)IO口,實(shí)現(xiàn)流水燈效果?!救蝿?wù)分析】熟悉掌握單片機(jī)串口的硬件結(jié)構(gòu),熟悉單片機(jī)串口通信工作方式0的應(yīng)用。【相關(guān)知識】一、串行通信概述
計(jì)算機(jī)與外界的信息交換稱為通信。通信的基本方式可分為并行通信和串行通信兩種。所謂并行通信是指數(shù)據(jù)的各位同時(shí)在多根數(shù)據(jù)線上發(fā)送或接收。串行通信是數(shù)據(jù)的各位在同一根數(shù)據(jù)線上依次逐位發(fā)送或接收。1串行通信基礎(chǔ)知識
目前串行通信在單片機(jī)雙機(jī)、多機(jī)以及單片機(jī)與PC機(jī)之間的通信等方面得到了廣泛應(yīng)用。
并行通信示意圖P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0P2.7RDWRRDWRCSD7D6D5D4D3D2D1D0825589C51
串行通信示意圖89C51外設(shè)TXDTXDRXDRXD發(fā)送接收1.1異步通信和同步通信
串行通信按同步方式可分為異步通信和同步通信兩種基本通信方式。1)
同步通信(SynchronousCommunication)
同步通信是一種連續(xù)傳送數(shù)據(jù)的通信方式,一次通信傳送多個(gè)字符數(shù)據(jù),稱為一幀信息。數(shù)據(jù)傳輸速率較高,通??蛇_(dá)56000bps或更高。其缺點(diǎn)是要求發(fā)送時(shí)鐘和接收時(shí)鐘保持嚴(yán)格同步。同步字符數(shù)據(jù)字符1數(shù)據(jù)字符2…數(shù)據(jù)字符n-1數(shù)據(jù)字符n校驗(yàn)字符(校驗(yàn)字符)同步通信數(shù)據(jù)傳送格式2)異步通信(AsynchronousCommunication)
在異步通信中,數(shù)據(jù)通常是以字符或字節(jié)為單位組成數(shù)據(jù)幀進(jìn)行傳送的。收、發(fā)端各有一套彼此獨(dú)立,互不同步的通信機(jī)構(gòu),由于收發(fā)數(shù)據(jù)的幀格式相同,因此可以相互識別接收到的數(shù)據(jù)信息。同步通信的數(shù)據(jù)幀格式如圖所示。D0D1D2D3D4
D5
D6
D7
0/11111D70/1100D0D1第n字符幀空閑位停止位奇偶校驗(yàn)停止位8位數(shù)據(jù)8位數(shù)據(jù)起始位起始位奇偶校驗(yàn)第n-1字符幀第n+1字符幀異步通信幀格式8位數(shù)據(jù)
異步通信信息幀格式如圖所示。(1)起始位:在沒有數(shù)據(jù)傳送時(shí),通信線上處于邏輯“1”狀態(tài)。當(dāng)發(fā)送端要發(fā)送1個(gè)字符數(shù)據(jù)時(shí),首先發(fā)送1個(gè)邏輯“0”信號,這個(gè)低電平便是幀格式的起始位。其作用是向接收端表示發(fā)送端開始發(fā)送一幀數(shù)據(jù)。接收端檢測到這個(gè)低電平后,就準(zhǔn)備接收數(shù)據(jù)信號。(2)數(shù)據(jù)位:在起始位之后,發(fā)送端發(fā)出(或接收端接收)的是數(shù)據(jù)位,數(shù)據(jù)的位數(shù)沒有嚴(yán)格的限制,5~8位均可。由低位到高位逐位傳送。(3)奇偶校驗(yàn)位:數(shù)據(jù)位發(fā)送完(接收完)之后,可發(fā)送一位用來檢驗(yàn)數(shù)據(jù)在傳送過程中是否出錯(cuò)的奇偶校驗(yàn)位。奇偶校驗(yàn)是收發(fā)雙方預(yù)先約定好的有限差錯(cuò)檢驗(yàn)方式之一。有時(shí)也可不用奇偶校驗(yàn)。(4)停止位:字符幀格式的最后部分是停止位,邏輯“1”電平有效,它可占1/2位、1位或2位。停止位表示傳送一幀信息的結(jié)束,也為發(fā)送下一幀信息作好準(zhǔn)備。1.2串行通信的波特率
波特率(BaudRate)是串行通信中一個(gè)重要概念,它是指傳輸數(shù)據(jù)的速率,亦稱比特率。波特率的定義是每秒傳輸二進(jìn)制數(shù)碼的位數(shù)。如:波特率為1200bps是指每秒鐘能傳輸1200位二進(jìn)制數(shù)碼。
波特率的倒數(shù)即為每位數(shù)據(jù)傳輸時(shí)間。例如:波特率為1200bps,每位的傳輸時(shí)間為:1)(833.01200msdT==
波特率和字符的傳輸速率不同,若采用圖9.4的數(shù)據(jù)幀格式,并且數(shù)據(jù)幀連續(xù)傳送(無空閑位),則實(shí)際的字符傳輸速率為1200/11=109.09幀/秒。
波特率也不同于發(fā)送時(shí)鐘和接收時(shí)鐘頻率。同步通信的波特率和時(shí)鐘頻率相等,而異步通信的波特率通常是可變的。1.3串行通信的制式1)單工制式(Simplex)
單工制式是指甲乙雙方通信只能單向傳送數(shù)據(jù)。單工制式如圖9.5所示。
在串行通信中,數(shù)據(jù)是在兩個(gè)站之間傳送的。按照數(shù)據(jù)傳送方向,串行通信可分為三種制式。發(fā)送器A接收器B圖6.5單工制式2)半雙工制式(Halfduplex)
半雙工制式是指通信雙方都具有發(fā)送器和接收器,雙方既可發(fā)送也可接收,但接收和發(fā)送不能同時(shí)進(jìn)行,即發(fā)送時(shí)就不能接收,接收時(shí)就不能發(fā)送。半雙工制式如圖6.6所示。發(fā)送接收發(fā)送接收A端B端圖6.6半雙工制式3)全雙工制式(Fullduplex)
全雙工制式是指通信雙方均設(shè)有發(fā)送器和接收器,并且將信道劃分為發(fā)送信道和接收信道,兩端數(shù)據(jù)允許同時(shí)收發(fā),因此通信效率比前兩種高。全雙工制式如圖6.7所示。發(fā)送接收接收發(fā)送A端B端圖6.7全雙工制式1.4串行通信的校驗(yàn)
串行通信的目的不只是傳送數(shù)據(jù)信息,更重要的是應(yīng)確保準(zhǔn)確無誤地傳送。因此必須考慮在通信過程中對數(shù)據(jù)差錯(cuò)進(jìn)行校驗(yàn),因?yàn)椴铄e(cuò)校驗(yàn)是保證準(zhǔn)確無誤地通信的關(guān)鍵。常用差錯(cuò)校驗(yàn)方法有奇偶校驗(yàn)、累加和校驗(yàn)以及循環(huán)冗余碼校驗(yàn)等。1)奇偶校驗(yàn)
奇偶校驗(yàn)的特點(diǎn)是按字符校驗(yàn),即在發(fā)送每個(gè)字符數(shù)據(jù)之后都附加一位奇偶校驗(yàn)位(1或0),當(dāng)設(shè)置為奇校驗(yàn)時(shí),數(shù)據(jù)中1的個(gè)數(shù)與校驗(yàn)位1的個(gè)數(shù)之和應(yīng)為奇數(shù);反之則為偶校驗(yàn)。收、發(fā)雙方應(yīng)具有一致的差錯(cuò)檢驗(yàn)設(shè)置,當(dāng)接收1幀字符時(shí),對1的個(gè)數(shù)進(jìn)行檢驗(yàn),若奇偶性(收、發(fā)雙方)一致則說明傳輸正確。奇偶校驗(yàn)只能檢測到那種影響奇偶位數(shù)的錯(cuò)誤,比較低級且速度慢,一般只用在異步通信中。2)累加和校驗(yàn)
累加和校驗(yàn)是指發(fā)送方將所發(fā)送的數(shù)據(jù)塊求和,并將“校驗(yàn)和”附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)時(shí)也是先對數(shù)據(jù)塊求和,將所得結(jié)果與發(fā)送方的“校驗(yàn)和”進(jìn)行比較,若兩者相同,表示傳送正確,若不同則表示傳送出了差錯(cuò)?!靶r?yàn)和”的加法運(yùn)算可用邏輯加,也可用算術(shù)加。累加和校驗(yàn)的缺點(diǎn)是無法檢驗(yàn)出字節(jié)或位序的錯(cuò)誤。3)循環(huán)冗余碼校驗(yàn)(CRC)
循環(huán)冗余碼校驗(yàn)的基本原理是將一個(gè)數(shù)據(jù)塊看成一個(gè)位數(shù)很長的二進(jìn)制數(shù),然后用一個(gè)特定的數(shù)去除它,將余數(shù)作校驗(yàn)碼附在數(shù)據(jù)塊之后一起發(fā)送。接收端收到該數(shù)據(jù)塊和校驗(yàn)碼后,進(jìn)行同樣的運(yùn)算來校驗(yàn)傳送是否出錯(cuò)。目前CRC已廣泛用于數(shù)據(jù)存儲和數(shù)據(jù)通信中,并在國際上形成規(guī)范,市面上已有不少現(xiàn)成的CRC軟件算法。2AT89C51的串行接口AT89C51內(nèi)部有一個(gè)可編程全雙工串行通信接口。該部件不僅能同時(shí)進(jìn)行數(shù)據(jù)的發(fā)送和接收,也可作為一個(gè)同步移位寄存器使用。下面將對其內(nèi)部結(jié)構(gòu)、工作方式以及波特率進(jìn)行介紹。2.1串行接口的結(jié)構(gòu)及功能AT89C51串行口結(jié)構(gòu)框圖發(fā)送SBUF(99H)接收SBUF(99H)同步時(shí)鐘門電路發(fā)送控制器接收控制器輸入移位寄存器串行口控制寄存器(98H)內(nèi)部總線≥1串行口中斷TIRITXD(P3.1)RXD(P3.0)
發(fā)送數(shù)據(jù)過程:CPU通過內(nèi)部總線將并行數(shù)據(jù)寫入發(fā)送SBUF,在發(fā)送控制電路的控制下,按設(shè)定好的波特率,每來一次移位脈沖,通過引腳TXD向外輸出一位。一幀數(shù)據(jù)發(fā)送結(jié)束后,向CPU發(fā)出中斷申請,TI位置1。CPU響應(yīng)中斷后,開始準(zhǔn)備發(fā)送下一幀數(shù)據(jù)。發(fā)送SBUF(99H)接收SBUF(99H)同步時(shí)鐘門電路發(fā)送控制器接收控制器輸入移位寄存器串行口控制寄存器(98H)內(nèi)部總線≥1串行口中斷TIRITXD(P3.1)RXD(P3.0)接收數(shù)據(jù)過程:CPU不停地檢測引腳RXD上的信號,當(dāng)信號中出現(xiàn)低電平時(shí),在接收控制電路的控制下,按設(shè)定好的波特率,每來一次移位脈沖,讀取外部設(shè)備發(fā)送的一位數(shù)據(jù)到移位寄存器。一幀數(shù)據(jù)結(jié)束后,數(shù)據(jù)被存入接收SBUF,同時(shí)向CPU發(fā)出中斷申請,RI位置1。CPU響應(yīng)中斷后,開始接收下一幀數(shù)據(jù)。1)串行數(shù)據(jù)緩沖器SBUFSBUF是串行口緩沖寄存器,包括發(fā)送寄存器和接收寄存器,以便能以全雙工方式進(jìn)行通信。此外,在接收寄存器之前還有移位寄存器,從而構(gòu)成了串行接收的雙緩沖結(jié)構(gòu),這樣可以避免在數(shù)據(jù)接收過程中出現(xiàn)幀重疊錯(cuò)誤。發(fā)送數(shù)據(jù)時(shí),由于CPU是主動(dòng)的,不會發(fā)生幀重疊錯(cuò)誤,因此發(fā)送電路不需要雙重緩沖結(jié)構(gòu)。
在邏輯上,SBUF只有一個(gè),它既表示發(fā)送寄存器,又表示接收寄存器,具有同一個(gè)單元地址99H。但在物理結(jié)構(gòu)上,則有兩個(gè)完全獨(dú)立的SBUF,一個(gè)是發(fā)送緩沖寄存器SBUF,另一個(gè)是接收緩沖寄存器SBUF。如果CPU寫SBUF,數(shù)據(jù)就會被送入發(fā)送寄存器準(zhǔn)備發(fā)送;如果CPU讀SBUF,則讀入的數(shù)據(jù)一定來自接收緩沖器。即CPU對SBUF的讀寫,實(shí)際上是分別訪問上述兩個(gè)不同的寄存器。2)串行控制寄存器SCON
串行控制寄存器SCON用于設(shè)置串行口的工作方式、監(jiān)視串行口的工作狀態(tài)、控制發(fā)送與接收的狀態(tài)等。它是一個(gè)既可以字節(jié)尋址又可以位尋址的8位特殊功能寄存器。其格式如圖6-1所示。見表6-1串行口控制寄存器SCONRITIRB8TB8RENSM2SM1SM0SCON98H99H9AH9BH9CH9DH9EH9FH位地址0:雙機(jī)1:多機(jī)多機(jī)通信0:禁止1:允許接收控制發(fā)送數(shù)據(jù)第9位接收數(shù)據(jù)第9位發(fā)送中斷標(biāo)志接收中斷標(biāo)志(1)SM0SM1:串行口工作方式選擇位。其狀態(tài)組合所對應(yīng)的工作方式如表所示。SM0SM1工作方式功能說明000同步移位寄存器輸入/輸出,波特率固定為fosc/1201110位異步收發(fā),波特率可變(T1溢出率/n,n=32或16)10211位異步收發(fā),波特率固定為fOsc/n,n=64或32)11311位異步收發(fā),波特率可變(T1溢出率/n,n=32或16)6-1串行口工作方式(2)SM2:多機(jī)通信控制器位。在方式0中,SM2必須設(shè)成0。在方式1中,當(dāng)處于接收狀態(tài)時(shí),若SM2=1,則只有接收到有效的停止位“1”時(shí),RI才能被激活成“1”(產(chǎn)生中斷請求)。在方式2和方式3中,若SM2=0,串行口以單機(jī)發(fā)送或接收方式工作,TI和RI以正常方式被激活并產(chǎn)生中斷請求;若SM2=1,RB8=1時(shí),RI被激活并產(chǎn)生中斷請求。(4)TB8:方式2和方式3中要發(fā)送的第9位數(shù)據(jù)。該位由軟件置位或復(fù)位。在方式2和方式3時(shí),TB8是發(fā)送的第9位數(shù)據(jù)。在多機(jī)通信中,以TB8位的狀態(tài)表示主機(jī)發(fā)送的是地址還是數(shù)據(jù):TB8=1表示地址,TB8=0表示數(shù)據(jù)。TB8還可用作奇偶校驗(yàn)位。(3)REN:串行接受允許控制位。該位由軟件置位或復(fù)位。當(dāng)REN=1,允許接收;當(dāng)REN=0,禁止接收。(6)TI:發(fā)送中斷標(biāo)志位。TI=1,表示已結(jié)束一幀數(shù)據(jù)發(fā)送,可由軟件查詢TI位標(biāo)志,也可以向CPU申請中斷。注意:TI在任何工作方式下都必須由軟件清0。(5)RB8:接收數(shù)據(jù)第9位。在方式2和方式3時(shí),RB8存放接收到的第9位數(shù)據(jù)。RB8也可用作奇偶校驗(yàn)位。在方式1中,若SM2=0,則RB8是接收到的停止位。在方式0中,該位未用。(7)RI:接收中斷標(biāo)志位。RI=1,表示一幀數(shù)據(jù)接收結(jié)束。可由軟件查詢RI位標(biāo)志,也可以向CPU申請中斷。
注意:RI在任何工作方式下也都必須由軟件清0。在AT89C51中,串行發(fā)送中斷TI和接收中斷RI的中斷入口地址是同是0023H,因此在中斷程序中必須由軟件查詢TI和RI的狀態(tài)才能確定究竟是接收還是發(fā)送中斷,進(jìn)而作出相應(yīng)的處理。單片機(jī)復(fù)位時(shí),SCON所有位均清0。PCOND7D6D5D4D3D2D1D0位名稱SMOD---GF1GF0PDIDL
SMOD:串行口波特率倍增位。在工作方式1~工作方式3時(shí),若SMOD=1,則串行口波特率增加一倍。若SMOD=0,波特率不加倍。系統(tǒng)復(fù)位時(shí),SMOD=0。2.電源控制寄存器PCON2.2串行口工作方式AT89C51串行通信共有4種工作方式,它們分別是方式0、方式1、方式2和方式3,由串行控制寄存器SCON中的SM0SM1決定,如表9-1所示。1.工作方式0
在方式0下,串行口作為同步移位寄存器使用。此時(shí)SM2、RB8、TB8均應(yīng)設(shè)置為0。
(1)發(fā)送:TI=0時(shí),執(zhí)行“SBUF=0xxx”啟動(dòng)發(fā)送,8位數(shù)據(jù)由低位到高位從RXD引腳送出,TXD發(fā)送同步脈沖。發(fā)送完后,由硬件置位TI。
(2)接收:RI=0,REN=1時(shí)啟動(dòng)接收,數(shù)據(jù)從RXD輸入,TXD輸出同步脈沖。8位數(shù)據(jù)接收完,由硬件置位RI??赏ㄟ^“x=SBUF”讀取數(shù)據(jù)。
方式0的波特率為fosc/12,即一個(gè)機(jī)器周期發(fā)送或接收一位數(shù)據(jù)。
應(yīng)當(dāng)指出:方式0并非是同步通信方式。它的主要用途是外接同步移位寄存器,以擴(kuò)展并行I/O口。2.工作方式1
方式1是一幀10位的異步串行通信方式,包括1個(gè)起始位(0),8個(gè)數(shù)據(jù)位和一個(gè)停止位(1),其幀格式如下:
起始位0D0D1D2D3D4D5D6D7
停止位1(1)數(shù)據(jù)發(fā)送
當(dāng)TI=0時(shí),執(zhí)行“SBUF=0xxx”指令后開始發(fā)送,由硬件自動(dòng)加入起始位和停止位,構(gòu)成一幀數(shù)據(jù),然后由TXD端串行輸出。發(fā)送完后,TXD輸出線維持在“1”狀態(tài)下,并將SCON中的TI置1,表示一幀數(shù)據(jù)發(fā)送完畢。(2)數(shù)據(jù)接收
RI=0,REN=1時(shí),接收電路以波特率的16倍速度采樣RXD引腳,如出現(xiàn)由“1”變“0”跳變,認(rèn)為有數(shù)據(jù)正在發(fā)送。
在接收到第9位數(shù)據(jù)(即停止位)時(shí),必須同時(shí)滿足以下兩個(gè)條件:RI=0和SM2=0或接收到的停止位為“1”,才把接收到的數(shù)據(jù)存入SBUF中,停止位送RB8,同時(shí)置位RI。若上述條件不滿足,接收到的數(shù)據(jù)不裝入SBUF被舍棄。在方式1下,SM2應(yīng)設(shè)定為0。(3)波特率波特率=2SMOD×(T1溢出率)/32T1溢出率=1/T1定時(shí)時(shí)間=(M-T初)·T機(jī)1波特率=32·12·(M-T初)2SMOD·fosc3.工作方式2和方式3
工作方式2和方式3都是11位異步收發(fā)串行通信方式,兩者的差異僅在波特率上有所不同。方式2:波特率=2SMOD·fosc/64(SMOD=0或1)方式3:(與方式1相同)波特率=32·12·(M-T初)2SMOD·fosc(1)數(shù)據(jù)發(fā)送
TI=0,發(fā)送數(shù)據(jù)前,先由軟件設(shè)置TB8,可使用如下指令完成:TB8=1
;將TB8位置1TB8=0
;將TB8位置0
然后再向SBUF寫入8位數(shù)據(jù),并以此來啟動(dòng)串行發(fā)送。一幀數(shù)據(jù)發(fā)送完畢后,CPU自動(dòng)將TI置1,其過程與方式1相同。(2)數(shù)據(jù)接收
REN=1,RI=0時(shí),啟動(dòng)接收
①若SM2=0,接收到的8位數(shù)據(jù)送SBUF,第9位數(shù)據(jù)送RB8。②若SM2=1,接收到的第9位數(shù)據(jù)為0,數(shù)據(jù)不送SBUF;接收到的第9位數(shù)據(jù)為1,數(shù)據(jù)送SBUF,第9位送RB8。
對波特率需要說明的是,當(dāng)串行口工作在方式1或方式3,且要求波特率按規(guī)范取1200、2400、4800、9600…時(shí),若采用晶振12MHz和6MHz,按上述公式算出的T1定時(shí)初值將不是一個(gè)整數(shù),因此會產(chǎn)生波特率誤差而影響串行通信的同步性能。解決的方法只有調(diào)整單片機(jī)的晶振頻率fosc,為此有一種頻率為11.0592MHz的晶振,這樣可使計(jì)算出的T1初值為整數(shù)。下表列出了串行方式1或方式3在不同晶振時(shí)的常用波特率和誤差。常用波特率和誤差
晶振頻率(MHZ)波特率
(HZ)SMODT1方式2定時(shí)初值實(shí)際波特率誤差(%)12.0096001F9H8923712.0048000F9H4460712.0024000F3H24040.1612.0012000E6H12020.1611.0592192001FDH19200011.059296000FDH9600011.059248000EAH4800011.059224000F4H2400011.059212000E8H12000【任務(wù)實(shí)施】利用8位并行輸出串口移位寄存器74LS164擴(kuò)展16位輸出口的電路。串行口的數(shù)據(jù)通過RXD(P3.0)引腳加到74LS164的輸入端。串行口輸出移位時(shí)鐘通過TXD(P3.1)引腳加到74LS164時(shí)鐘端,作為同步移位脈沖,其波特率固定為fOSC/12。串行通信方式0應(yīng)用電路對應(yīng)的程序如下:
#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint//延時(shí)voidDelayMS(uintms){uchari;while(ms--)for(i=0;i<120;i++);}//主程序voidmain(){ucharc=0x80;SCON=0x00;//串口模式0,即移位寄存器輸入/輸出方式
while(1){c=_crol_(c,1);SBUF=c;//TI=0,沒有發(fā)送完
while(TI==0);//等待發(fā)送結(jié)束
TI=0;//TI軟件置位
DelayMS(400);}}【進(jìn)階提高】通過指撥開關(guān)動(dòng)作產(chǎn)生高低電平,作為74LS165的輸入,74LS165將接收到的數(shù)據(jù)發(fā)往串口,串口負(fù)責(zé)接收,串口將接收到的數(shù)據(jù)送P1口顯示。擴(kuò)展串口串口接收電路對應(yīng)的程序如下:#include<reg51.h>#include<intrins.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitSPL=P2^5;//shift/load//延時(shí)voidDelayMS(uintms){uchari;while(ms--)for(i=0;i<120;i++);}//主程序
voidmain(){SCON=0x10;while(1){SPL=0;SPL=1;while(RI==0);RI=0;P0=SBUF;DelayMS(20);}}任務(wù)二單片機(jī)雙機(jī)通信在銀行業(yè)務(wù)系統(tǒng)中,為了提高柜員的登錄安全和授權(quán)操作中的安全性,應(yīng)用動(dòng)態(tài)口令系統(tǒng)。通過單片機(jī)的雙機(jī)通信可模擬動(dòng)態(tài)密碼的獲取。這里就用到了單片機(jī)雙機(jī)通信。假設(shè)單片機(jī)甲機(jī)中存放的動(dòng)態(tài)口令是010086,甲機(jī)發(fā)送動(dòng)態(tài)口令給單片機(jī)乙機(jī),乙機(jī)接收到數(shù)據(jù)以后在6個(gè)數(shù)碼管上顯示接收數(shù)據(jù)。將兩個(gè)獨(dú)立的單片機(jī)系統(tǒng)用連接線進(jìn)行連接,使用串行通信進(jìn)行數(shù)據(jù)傳送。那么單片機(jī)如何利用串口實(shí)現(xiàn)雙機(jī)通信的?【分析任務(wù)】本任務(wù)要實(shí)現(xiàn)雙機(jī)通信,需要掌握雙機(jī)通信編程要領(lǐng)。通信協(xié)議一般如下:
主機(jī)發(fā)送數(shù)據(jù),從機(jī)接收數(shù)據(jù),雙方發(fā)送和接收數(shù)據(jù)采用查詢方式;
雙機(jī)開始通信,主機(jī)發(fā)送握手信號,等待從機(jī)應(yīng)答;
從機(jī)接收到握手信號后,應(yīng)答OK或BUSY;
當(dāng)從機(jī)應(yīng)答OK后,主機(jī)開始向從機(jī)發(fā)送緩沖區(qū)里的數(shù)據(jù);從機(jī)接收完數(shù)據(jù)后,返回接收成功或失敗,若失敗,主機(jī)將重新發(fā)送,從機(jī)將重新接收。主機(jī)發(fā)送的數(shù)據(jù)格式:字節(jié)數(shù)n,數(shù)據(jù)1,數(shù)據(jù)2......數(shù)據(jù)n,字節(jié)校驗(yàn);其中字節(jié)校驗(yàn)是將字節(jié)數(shù)和所有數(shù)據(jù)進(jìn)行相異或?!鞠嚓P(guān)知識】一、串行口雙機(jī)或多機(jī)通信工作方式單片機(jī)串口的初始化要使用單片機(jī)的串口,需要對其進(jìn)行初始化工作。單片機(jī)串口初始化需完成單片機(jī)串口工作方式選擇、波特率設(shè)置、波特率發(fā)生器設(shè)置等基本的設(shè)置。如設(shè)置單片機(jī)晶振頻率為11.0592MHz,串口波特率為9600b/s,串口選擇工作方式1,定時(shí)器配置為工作方式2。初始化程序如下:voidUartInit(void){TMOD=(TMOD&0x0f)|0x20;//設(shè)置定時(shí)器T1為定時(shí)方式2TH1=110592001/12/32/9600;//求波特率為9600時(shí)定時(shí)器初值TL1=TH1;TR1=1;//啟動(dòng)T1計(jì)數(shù)器SCON=0x70;//設(shè)置串行工作方式1,允許接收PCON=0x80;}【任務(wù)實(shí)施】#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint#definekey_portP1#definedis_portP2voidmain(void){ ucharkey_in=0xff; SCON=0x50;//MODER1,REN=1; TMOD=0x20;//TIMER1MODER2; TH1=0xf3;//bode=2400 TL1=0xf3; ET1=1; TR1=1; EA=1; ES=1; while(1){ if(key_in!=key_port) { key_in=key_port; SBUF=key_in; } }}voidget_disp(void)interrupt4using0{ if(RI) //如果是串口輸入引起中斷
{dis_port=SBUF; RI=0; } elseTI=0; //否則就是串口輸出引起的中斷}【進(jìn)階提高】在KeilC51中錄入下面程序,并調(diào)試程序:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharxx=0; //設(shè)計(jì)數(shù)標(biāo)志sbitkey=P1^7; //設(shè)鍵盤ucharbuffer=0;voiddelay(intk) //延時(shí)函數(shù){inti;for(i=0;i<k;i++);}//顯示子程序voiddisplay(ucharm){switch(m) { case0:P2=0x3F;break; case1:P2=0x06;break; case2:P2=0x5B;break; case3:P2=0x4F;break; case4:P2=0x66;break; case5:P2=0x6D;break; case6:P2=0x7D;break; case7:P2=0x07;break; case8:P2=0x7F;break; case9:P2=0x6F;break;
case10:P2=0x77;break; case11:P2=0x7C;break; case12:P2=0x39;break; case13:P2=0x5E;break; case14:P2=0x79;break; default:P2=0x71;break; }}voidint_s()interrupt4//串口中斷服務(wù)程序{ES=0; //關(guān)串口中斷
if(RI==1){buffer=SBUF; RI=0;//清標(biāo)志位
display(buffer);}if(TI==1){TI=0; } ES=1;//開串口中斷
return;}voidmain(){display(buffer);//初始化
EA=1; ES=1;SCON=0X50; //工作方式1 TMOD=0X20;//定時(shí)器1工作方式2 TH1=0XE6;//1200bps,12Mhz TR1=1; //啟動(dòng)定時(shí)器
while(1){while(key==1) //查詢鍵盤是否松開
{;}if(key==0) //查詢鍵盤是否按下
delay(10); if(key==0) { xx=xx+1; //計(jì)數(shù)標(biāo)志加1 if(xx==16) { xx=0; } SBUF=xx;//發(fā)送數(shù)據(jù)
} while(key==0) //鍵盤是否松開
{;} }}任務(wù)三PC與單片機(jī)通信【任務(wù)描述】比較而言,個(gè)人電腦(PC機(jī))具有更強(qiáng)的信息處理能力,經(jīng)常需要將單片機(jī)采集到的現(xiàn)場數(shù)據(jù)傳送給PC機(jī)集中處理,或者由PC機(jī)發(fā)出命令,各終端(單片機(jī))執(zhí)行。本任務(wù)要求由PC機(jī)發(fā)出不同的數(shù)據(jù),單片機(jī)接收后回傳給PC機(jī),從而驗(yàn)證接收數(shù)據(jù)是否正確。【任務(wù)分析】任務(wù)要求通過串口工具向單片機(jī)發(fā)信息,單片機(jī)通過收到信息后將信息回傳給PC機(jī),需要有單片機(jī)發(fā)送信息和接收信息兩個(gè)方面的編程知識?!鞠嚓P(guān)知識】單片機(jī)可以利用“串口”實(shí)現(xiàn)和PC機(jī)的通信,這需要了解PC機(jī)的一些特性。“RS-232C標(biāo)準(zhǔn)”是美國EIA(電子工業(yè)聯(lián)合會)與BELL等公司一起開發(fā)并于1969年公布的通信協(xié)議。目前該通信協(xié)議在微機(jī)通信接口中廣泛使用,IBMPC機(jī)上的COM1、COM2接口就是選用了RS-232接口。RS-232標(biāo)準(zhǔn)包括了按位串行傳輸?shù)碾姎夂蜋C(jī)械方面的規(guī)定,使用數(shù)據(jù)終端設(shè)備和數(shù)據(jù)通信設(shè)備之間的接口。1.機(jī)械特性。2.功能特性。RS-232c接口的主要引腳功能定義。插針序號
符號
功能
方向2(3)TXD
發(fā)送數(shù)據(jù)
輸出3(2)RXD
接收數(shù)據(jù)
輸入4(7)RTS
請求發(fā)送
輸出5(8)CTS
清除發(fā)送
輸入6(6)DSR數(shù)據(jù)通信設(shè)備準(zhǔn)備好
輸入7(5)GND
信號地—8(1)DCD數(shù)據(jù)載體檢測
輸入20(4)DTR
數(shù)據(jù)終端準(zhǔn)備好輸出22(9)RI
振鈴指示
輸入3.電氣特性。RS-232C采用“負(fù)邏輯”,規(guī)定邏輯0:+3~+15V;邏輯1:—15~-3V。RS-232C標(biāo)準(zhǔn)的信號傳輸?shù)淖畲箅娎|長度為幾十米,傳輸速率小于20KB/s。4.電平轉(zhuǎn)換。鑒于AT89C51單片機(jī)的輸入、輸出電平均為TTL/CMOS電平,而計(jì)算機(jī)配置的是RS-232C標(biāo)準(zhǔn)串行接口,使用的是RS-232C標(biāo)準(zhǔn)電平,二者的電氣規(guī)范不一致,因此要完成PC機(jī)與單片機(jī)的數(shù)據(jù)通信,必須進(jìn)行電平轉(zhuǎn)換?!救蝿?wù)實(shí)施】單片機(jī)與PC通信任務(wù)對應(yīng)的程序代碼如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineN26ucharx;//uchardatatable[N];//暫存數(shù)組,可以將10改為你需要的數(shù)值chartable1[N];uintcnt=0;ucharsendFlag=0;//未發(fā)送數(shù)據(jù)時(shí)ucharreceFlag=0;//未接受到數(shù)據(jù)時(shí)uinti=0,j;voidserial_init(void){TMOD=0x20;//計(jì)時(shí)器1作為比特率發(fā)生器,方式2TH1=0xfd;TL1=0xfd;//裝入初值TR1=1;//計(jì)時(shí)中斷允許SM0=0;SM1=1;//串行口工作于方式2ES=1;//串行口中斷允許PS=1;REN=1;//接收允許EA=1;//總中斷允許}voidmain(){serial_init();//初始化
while(1){P2=table1[0];//顯示數(shù)組的第一個(gè)元素
if(receFlag==1){
fasong();
receFlag=0;//發(fā)完了清標(biāo)志
}}}voidserial()interrupt4{
ES=0;//關(guān)串口中斷
if(RI){
table1[cnt]=SBUF;cnt++;
while(!RI);//等待接收完畢
if(cnt==N){cnt=0;receFlag=1;}
RI=0;//軟件清除接收中斷
}if(TI){TI=0;//發(fā)送完一個(gè)數(shù)據(jù)
sendFlag=0;//清標(biāo)志位
}ES=1;//開串口中斷
}【進(jìn)階提高】把任務(wù)3中接收到的從PC機(jī)發(fā)過來的數(shù)據(jù),用數(shù)碼管顯示其ASCII碼,比如發(fā)過來一個(gè)‘1’,顯示的是31,發(fā)過來一個(gè)字符‘2’,顯示的是32。錄入下面程序,并調(diào)試運(yùn)行。單片機(jī)與PC通信用數(shù)碼管顯示對應(yīng)的程序代碼如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineN1ucharx;chartable1[N];//暫存數(shù)組uintcnt=0;ucharsendFlag=0;//未發(fā)送數(shù)據(jù)時(shí)ucharreceFlag=0;//未接受到數(shù)據(jù)時(shí)uinti=0,j;//共陽數(shù)碼管段碼ucharcodedis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};voiddelayms(ucharms)//延時(shí)ms{uchari;while(ms--){for(i=0;i<120;i++);}}voidserial_init(void){TMOD=0x20;//計(jì)時(shí)器1作為比特率發(fā)生器,方式2TH1=0xfd;TL1=0xfd;//裝入初值TR1=1;//計(jì)時(shí)中斷允許SM0=0;SM1=1;//串行口工作于方式2ES=1;//串行口中斷允許PS=1;REN=1;//接收允許EA=1;//總中斷允許}voidsend_char(unsignedchartxd)//傳送一個(gè)字符{ ES=0;SBUF=txd;while(!TI);//等特?cái)?shù)據(jù)傳送
sendFlag=1; ES=1;//清除數(shù)據(jù)傳送標(biāo)志}voidfasong(){//發(fā)送數(shù)組receive[];uchari;for(i=0;i<N;i++){send_char(table1[i]);}
}voiddisplay(){P1=0x01;P2=dis[table1[0]&0x0f];delayms(10);//個(gè)位顯示P1=0x02;P2=dis[table1[0]/16];delayms(10);//十位顯示}voidmain(){serial_init();//初始化
while(1){display();if(receFlag==1){fasong();receFlag=0;//發(fā)完了清標(biāo)志
}}}voidserial()interrupt4{
ES=0;//關(guān)串口中斷
if(RI){
table1[cnt]=SBUF;cnt++;while(!RI);//等待接收完畢
if(cnt==N){cnt=0;receFlag=1;}RI=0;//軟件清除接收中斷
}if(TI){TI=0;//發(fā)送完一個(gè)數(shù)據(jù)
sendFlag=0;//清標(biāo)志位
}ES=1;//開串口中斷
}任務(wù)四DS18B20溫度采集系統(tǒng)【任務(wù)描述】
使用數(shù)字溫度傳感器DS18B20,將采集到的溫度信息送單片機(jī),單片機(jī)處理該實(shí)時(shí)溫度信息后,通過串口送PC串口顯示。【任務(wù)分析】1-wire單總線是Maxim全資子公司Dallas的一項(xiàng)專有技術(shù)。與目前多數(shù)標(biāo)準(zhǔn)串行數(shù)據(jù)通信方式,如SPI/I2C/MICROWIRE不同,它采用單根信號線,既傳輸時(shí)鐘,又傳輸數(shù)據(jù),而且數(shù)據(jù)傳輸是雙向的。它具有節(jié)省I/O口線資源、結(jié)構(gòu)簡單、成本低廉、便于總線擴(kuò)展和維護(hù)等諸多優(yōu)點(diǎn)?!鞠嚓P(guān)知識】一、溫度傳感器DS18B20DS18B20對應(yīng)的程序代碼如下:#include<reg52.h>#include<intrins.h>#define uchar unsignedchar#define uint unsignedint#define u8 unsignedchar#define u16 unsignedint#define u32 unsignedlongint#define uchar32unsignedlongcharunsignedintsdata;//測量到的溫度的整數(shù)部分unsignedcharxiaoshu1;//小數(shù)第一位unsignedcharxiaoshu2;//小數(shù)第二位unsignedcharxiaoshu;//兩位小數(shù)bitfg=1;//溫度正負(fù)標(biāo)志sbitP10=P1^0;sbitP11=P1^1;sbitP12=P1^2;//通信端口使用#define TX_0 P10=0#define TX_1 P10=1//uchar32*p=sort_temp;//=======================================//精確延時(shí)函數(shù)//=======================================//延時(shí)1us==用于在切換引腳電平時(shí),等待引腳電平穩(wěn)定voiddelay1us(void)//12MHz,12分頻單片機(jī){}//延時(shí)7us==讀間隙產(chǎn)生后延時(shí)7us,然后單片機(jī)讀取引腳電平voiddelay7us(void)//12MHz,12分頻單片機(jī){//調(diào)用占2個(gè)周期
_nop_();_nop_(); _nop_();_nop_();_nop_();}//延時(shí)15us==拉低500us復(fù)位后,18B20在15us后會發(fā)出存在脈沖voiddelay15us(void)//12MHz,12分頻單片機(jī){ //調(diào)用占2個(gè)周期
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}//延時(shí)60us==產(chǎn)生寫時(shí)序后,延時(shí)60us,等待18B20成功讀取引腳電平voiddelay60us(void)//12MHz,12分頻單片機(jī){unsignedchara,b;for(b=11;b>0;b--)for(a=1;a>0;a--);}//延時(shí)500us==復(fù)位時(shí)用到voiddelay500us(void)//12MHz,12分頻單片機(jī){unsignedchara,b;for(b=99;b>0;b--)for(a=1;a>0;a--);}//========================//粗略可調(diào)延時(shí)函數(shù)//========================voiddelayms(u16ms){ while(ms--) {unsignedchara,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--); }}voiddelay(void)//417us對應(yīng)2400波特率{unsignedchara;for(a=206;a>0;a--);}//===========================//DS18B20讀一個(gè)字節(jié)//===========================u8DS18B20_Read_Byte(void){ u8i; u8byte=0; for(i=0;i<8;i++) { byte>>=1; P11=0; delay1us(); P11=1; //上升沿產(chǎn)生讀時(shí)間間隙
delay7us(); //至少7us以后,讀取DS18B20數(shù)據(jù),但也不能過大,例如延時(shí)15us就不正常了
if(P11) { byte|=0x80; } delay60us(); P11=1; //釋放總線
} returnbyte;}//===========================//向DS18B20寫一個(gè)字節(jié)//===========================voidDS18B20_Write_Byte(u8byte){ u8i=0; for(i=0;i<8;i++) { P11=0; //下降沿產(chǎn)生寫時(shí)間間隙
delay1us(); if(byte&0x01) //把數(shù)據(jù)對應(yīng)位的電平送到DQ引腳
{ P11=1;} else { P11=0;} delay60us(); //延時(shí)60us,等待DS18b20讀取引腳電平
byte>>=1; P11=1; //釋放總線
}}//===========================//復(fù)位DS18B20//===========================voidDS18B20_RST(void){ P11=1; delay1us(); P11=0;delay500us(); //拉低500us,復(fù)位信號
P11=1; //DQ=1 delay15us(); //15us}//=============================//DS18B20存在檢測返回0表示器件存在,1不存在//=============================u8DS18B20_Check(void){ u8revalue=0; u8times=0; while(times<240&&(P11!=0)) //檢測到低電平跳出或者循環(huán)240次跳出
{ times++; delay1us(); } if(times>=240) revalue=1; elsetimes=0; while(times<240&&(P11==0)) //檢測到高電平跳出
{ times++; delay1us(); } if(times<240) revalue=0; else revalue=1;
returnrevalue;}//===========================//讀取DS18B20溫度值//===========================floatDS18B20_Read_Temp(void){ intTEMP_INT; floatTEMP; u8H8,L8; DS18B20_RST(); //復(fù)位
DS18B20_Check(); DS18B20_Write_Byte(0xcc); //跳過ROM命令單個(gè)傳感器所以不必讀取ROM里的序列號
DS18B20_Write_Byte(0x44); //開始轉(zhuǎn)換
DS18B20_RST(); //復(fù)位
DS18B20_Check(); DS18B20_Write_Byte(0xcc); //跳過ROM命令單個(gè)傳感器所以不必讀取ROM里的序列號DS18B20_Write_Byte(0xbe); //讀寄存器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值
L8=DS18B20_Read_Byte(); //低8位
H8=DS18B20_Read_Byte(); //高8位
if(H8>0x7f)//最高位為1時(shí)溫度是負(fù)
{L8=~L8;H8=~H8+1;//補(bǔ)碼轉(zhuǎn)換,取反加一
fg=1;//讀取溫度為負(fù)時(shí)fg=1} xiaoshu1=(L8&0x0f)*10/16;//小數(shù)第一位
xiaoshu2=(L8&0x0f)*100/16%10;//小數(shù)第二位
xiaoshu=xiaoshu1*10+xiaoshu2;//小數(shù)兩位TEMP_INT=(H8<<8)|L8; //將高8位左移8位后與低8位相加【此處按位或相當(dāng)于相加】 TEMP=TEMP_INT*0.0625; //默認(rèn)為12位ADC對應(yīng)的轉(zhuǎn)換精度為0.0625 returnTEMP;}//===========================//DS18B20初始化配置引腳//===========================u8DS18B20_Init(void){ u8revalue='?'; DS18B20_RST(); revalue=DS18B20_Check(); if(revalue==0) { DS18B20_Read_Temp(); } returnrevalue;}voidSendByte(unsignedcharnum){ unsignedchari; TX_0; delay(); //起始位
for(i=0;i<8;i++) { if(num&0x01) //先發(fā)低位
TX_1; else TX_0; num>>=1; delay(); } TX_1; delay(); //停止}voidmain(){floattemp=0; // u8zhengs=0; u8xiaos=0; DS18B20_Init(); delayms(900); while(1) { temp=DS18B20_Read_Temp(); zhengs=temp; delayms(100); SendByte('T'); SendByte(':'); SendByte(zhengs/10%10+'0');
SendByte(zhengs%10+'0'); SendByte('.'); SendByte(xiaoshu1+'0'); SendByte(xiaoshu2+'0'); SendByte(10); //換行
SendByte(13); //回車
}}【進(jìn)階提高】將DS18B20采集到的信息上傳給PC,先來實(shí)現(xiàn)串口助手發(fā)來的信息發(fā)送給單片機(jī),然后保存于一數(shù)組里,然后將數(shù)組里面的東西發(fā)送給PC端,一發(fā)一收來檢查數(shù)據(jù)的正確性.sbitrw=P0^6;//1602的讀寫控制線sbiten=P0^7;//1602的使能控制線sbitP11=P1^1;sbitP12=P1^2;//通信端口使用//uchar32*p=sort_temp;//=======================================//精確延時(shí)函數(shù)//=======================================//延時(shí)1us==用于在切換引腳電平時(shí),等待引腳電平穩(wěn)定voiddelay1us(void)//12MHz,12分頻單片機(jī){}//延時(shí)7us==讀間隙產(chǎn)生后延時(shí)7us,然后單片機(jī)讀取引腳電平voiddelay7us(void)//12MHz,12分頻單片機(jī){
//調(diào)用占2個(gè)周期
_nop_();_nop_(); _nop_();_nop_();_nop_();}//延時(shí)15us==拉低500us復(fù)位后,18B20在15us后會發(fā)出存在脈沖voiddelay15us(void)//12MHz,12分頻單片機(jī){ //調(diào)用占2個(gè)周期
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}//延時(shí)60us==產(chǎn)生寫時(shí)序后,延時(shí)60us,等待18B20成功讀取引腳電平voiddelay60us(void)//12MHz,12分頻單片機(jī){unsignedchara,b;for(b=11;b>0;b--)for(a=1;a>0;a--);}//延時(shí)500us==復(fù)位時(shí)用到voiddelay500us(void)//12MHz,12分頻單片機(jī){unsignedchara,b;for(b=99;b>0;b--)for(a=1;a>0;a--);}//========================//粗略可調(diào)延時(shí)函數(shù)//========================voiddelayms(u16ms){ while(ms--) {unsignedchara,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--); }}voiddelay(uintn)//延時(shí)函數(shù){uintx,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}//===========================//DS18B20讀一個(gè)字節(jié)//===========================u8DS18B20_Read_Byte(void){ u8i; u8byte=0; for(i=0;i<8;i++) { byte>>=1; P11=0; delay1us(); P11=1; //上升沿產(chǎn)生讀時(shí)間間隙
delay7us(); //至少7us以后,讀取DS18B20數(shù)據(jù),但也不能過大,例如延時(shí)15us就不正常了
if(P11) { byte|=0x80; } delay60us(); P11=1; //釋放總線
} returnbyte;}//===========================//向DS18B20寫一個(gè)字節(jié)//===========================voidDS18B20_Write_Byte(u8byte){ u8i=0; for(i=0;i<8;i++) { P11=0; //下降沿產(chǎn)生寫時(shí)間間隙
delay1us(); if(byte&0x01) //把數(shù)據(jù)對應(yīng)位的電平送到DQ引腳
{ P11=1;} else { P11=0;} delay60us(); //延時(shí)60us,等待DS18b20讀取引腳電平
byte>>=1; P11=1; //釋放總線
}}//=============================//DS18B20存在檢測返回0表示器件存在,1不存在//=============================u8DS18B20_Check(void){ u8revalue=0; u8times=0; while(times<240&&(P11!=0)) //檢測到低電平跳出或者循環(huán)240次跳出
{ times++; delay1us(); }
if(times>=240) revalue=1; else times=0; while(times<240&&(P11==0)) //檢測到高電平跳出
{ times++; delay1us(); }if(times<240) revalue=0; else revalue=1;
returnrevalue;}//===========================//讀取DS18B20溫度值//===========================floatDS18B20_Read_Temp(void){ intTEMP_INT; floatTEMP; u8H8,L8; DS18B20_RST(); //復(fù)位
DS18B20_Check();
DS18B20_Write_Byte(0xcc); //跳過ROM命令單個(gè)傳感器所以不必讀取ROM里的序列號
DS18B20_Write_Byte(0x44); //開始轉(zhuǎn)換
DS18B20_RST(); //復(fù)位
DS18B20_Check(); DS18B20_Write_Byte(0xcc); //跳過ROM命令單個(gè)傳感器所以不必讀取ROM里的序列號DS18B20_Write_Byte(0xbe); //讀寄存器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值
L8=DS18B20_Read_Byte(); //低8位
H8=DS18B20_Read_Byte(); //高8位
TEMP_INT=(H8<<8)|L8; //將高8位左移8位后與低8位相加【此處按位或相當(dāng)于相加】 TEMP=TEMP_INT*0.0625; //默認(rèn)為12位ADC對應(yīng)的轉(zhuǎn)換精度為0.0625 returnTEMP;}//液晶開始/*********************************************************************************/ voidlcd_wcom(ucharcom)//1602寫命令函數(shù)(單片機(jī)給1602寫命令){//1602接收到命令后,不用存儲,直接由HD44780執(zhí)行并產(chǎn)生相應(yīng)動(dòng)作
rs=0;//選擇指令寄存器
rw=0;//選擇寫
P2=com;//把命令字送入P2delay(5);//延時(shí)一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù)
en=1;//使能線電平變化,命令送入1602的8位數(shù)據(jù)口
en=0;}voidlcd_wdat(uchardat)//1602寫數(shù)據(jù)函數(shù){rs=1;//選擇數(shù)據(jù)寄存器
rw=0;//選擇寫
P2=dat;//把要顯示的數(shù)據(jù)送入P2delay(5);//延時(shí)一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù)
en=1;//使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
en=0;}voidlcd_init()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度車間裝修與節(jié)能環(huán)保設(shè)施建設(shè)合同3篇
- 2025版微股東眾籌入股協(xié)議書-智慧城市建設(shè)項(xiàng)目3篇
- 2025年度出國勞務(wù)中介服務(wù)與境外工作環(huán)境適應(yīng)性評估合同4篇
- 二零二四年醫(yī)療設(shè)備消毒供應(yīng)與消毒液研發(fā)合作協(xié)議3篇
- 二零二五年度撤股合同范本:股權(quán)激勵(lì)計(jì)劃撤資操作細(xì)則4篇
- 二零二五年度環(huán)保設(shè)備研發(fā)與銷售服務(wù)合同3篇
- 2025年度大型水庫生態(tài)保護(hù)與恢復(fù)工程承包合同
- 2025年度個(gè)人汽車抵押貸款合同簽訂指南2篇
- 二零二五年度船舶消毒防疫合作協(xié)議3篇
- 二零二五年度車輛運(yùn)輸合同糾紛解決機(jī)制合同4篇
- 幼兒平衡車訓(xùn)練課程設(shè)計(jì)
- 肩袖損傷的護(hù)理查房課件
- 2023屆北京市順義區(qū)高三二模數(shù)學(xué)試卷
- 公司差旅費(fèi)報(bào)銷單
- 我國全科醫(yī)生培訓(xùn)模式
- 2021年上海市楊浦區(qū)初三一模語文試卷及參考答案(精校word打印版)
- 八年級上冊英語完形填空、閱讀理解100題含參考答案
- 八年級物理下冊功率課件
- DBJ51-T 188-2022 預(yù)拌流態(tài)固化土工程應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 《長津湖》電影賞析PPT
- 銷售禮儀培訓(xùn)PPT
評論
0/150
提交評論