版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《單片機(jī)應(yīng)用與仿真訓(xùn)練》設(shè)計(jì)報(bào)告</p><p><b> 單片機(jī)多機(jī)通信</b></p><p> 姓 名: </p><p> 學(xué) 號(hào): </p><p> 專業(yè)班級(jí):
2、 </p><p> 指導(dǎo)老師: </p><p> 所在學(xué)院: </p><p> 2011年7月 5 日</p><p><b> 摘要</b></p><p> 本設(shè)計(jì)是基于AT89S52單片機(jī)溫度檢測(cè)傳輸?shù)娜龣C(jī)通信
3、系統(tǒng),有三個(gè)單片機(jī)組成,其中一個(gè)作為主機(jī)(上位機(jī)),控制并負(fù)責(zé)接收來(lái)自從機(jī)1號(hào)和從機(jī)2號(hào)采集的數(shù)據(jù)信息,并顯示在數(shù)碼管上。由主機(jī)發(fā)送控制信息(通過(guò)按鍵控制),確定是接收來(lái)自想要得到各從機(jī)數(shù)據(jù)。從機(jī)1號(hào)和2號(hào)是數(shù)據(jù)采集模塊,用來(lái)采集室內(nèi)或室外溫度信息,并通過(guò)通信協(xié)議傳送給主機(jī)。為保證三機(jī)通信可靠性,通信口要有識(shí)別功能,51單片機(jī)串行口控制寄存器SCON中SM2位正是滿足這一要求而設(shè)置的。當(dāng)串行口以工作方式三工作時(shí),接收和發(fā)送的信息都是11
4、位數(shù)據(jù),既包含SBUF寄存器傳送的8位數(shù)據(jù),還包括SCON中可編程第9位數(shù)據(jù)即TB8或RB8,主機(jī)可通過(guò)設(shè)定TB8是0或1,來(lái)區(qū)別發(fā)送的是地址還是數(shù)據(jù)。從機(jī)都先將SCON中的SM2設(shè)置為1,待主機(jī)發(fā)送地址信息,與本身的地址對(duì)照,如果是,則令從機(jī)SM2為0,準(zhǔn)備接收主機(jī)信息并發(fā)送溫度信息,如果不是,則繼續(xù)等待。主機(jī)通過(guò)中斷口接收數(shù)據(jù),處理后顯示在數(shù)碼管上。此次設(shè)計(jì)由于只有一個(gè)18b20溫度傳感器,這里用三個(gè)任意的數(shù)據(jù)代替從機(jī)2采集溫度數(shù)據(jù)
5、,由于傳輸距離較短,這里不用MAX232,直接將主機(jī)的發(fā)送端接從機(jī)</p><p><b> 1概述</b></p><p><b> 1.1設(shè)計(jì)概述</b></p><p> 目前在通信領(lǐng)域里,單片機(jī)一對(duì)一通信已經(jīng)不能滿足人們?cè)O(shè)計(jì)的需要,多機(jī)通信已經(jīng)成為主要通信方式。單片機(jī)多機(jī)通信是指兩臺(tái)以上的單片機(jī)組成的網(wǎng)絡(luò)結(jié)構(gòu)
6、,可以通過(guò)串行通信方式共同實(shí)現(xiàn)對(duì)某一過(guò)程的控制。目前單片機(jī)多機(jī)通信形式較多,常見的有星形、環(huán)形,串行總線型通信和主從式多機(jī)型四種。本設(shè)計(jì)采用的是主從式多機(jī)型,它是一種分散性網(wǎng)絡(luò)結(jié)構(gòu),具有接口簡(jiǎn)單、使用靈活等優(yōu)點(diǎn)。下圖為主從式多機(jī)通信示意圖:</p><p><b> 多機(jī)通信示意圖</b></p><p> 1.2多機(jī)通信基本原理</p><p
7、> 51用于多機(jī)通信時(shí)必須工作在方式2或方式3。以方式3為例,每發(fā)送一幀數(shù)據(jù)為11位:1位起始位(0),8位數(shù)據(jù)位和1位停止位(1),附加的第9位數(shù)據(jù)在非多機(jī)系統(tǒng)中為奇偶校驗(yàn)位,在發(fā)送端有SCON的TB8產(chǎn)生,在接收端傳送到開關(guān)電源模塊SCON的RB8。它還可設(shè)定為“0”或“1”作為在MTD2002多機(jī)通信中區(qū)分?jǐn)?shù)據(jù)幀(0標(biāo)志)還是地址幀(1標(biāo)志)的標(biāo)志。在MCS-51多機(jī)系統(tǒng)中有以下協(xié)議:所有的各從機(jī)均處于聽命狀態(tài),即SM2=
8、1,以便接收主機(jī)發(fā)來(lái)的地址,當(dāng)接收到一幀信息的RB8為“1”時(shí),表示主機(jī)發(fā)送來(lái)的是地址信息,所有的從機(jī)均發(fā)生接收中斷,否則中斷屏蔽。當(dāng)一從機(jī)進(jìn)入相應(yīng)的中斷服務(wù)程序,把接收到的地址和本機(jī)的地址比較,如果相符合就令其SM2=0,并向主機(jī)發(fā)回本機(jī)地址以作應(yīng)答,該從機(jī)就與主機(jī)聯(lián)通,準(zhǔn)備接收主機(jī)發(fā)來(lái)的命令或數(shù)據(jù)信息,而其他的未被尋址從機(jī)保持SM2=1并退出各自的中斷服務(wù)程序。這樣,只有SM2=0的從機(jī)才能接收到主機(jī)發(fā)送來(lái)的數(shù)據(jù)信息,順利實(shí)現(xiàn)地址幀
9、和數(shù)據(jù)幀的分離。被尋址從機(jī)在通信完成后重新使SM2=1,并退出中斷服務(wù)程序,等待下次通信。</p><p><b> 1.3 通信協(xié)議</b></p><p> 要實(shí)現(xiàn)單片機(jī)和PC機(jī)的正常通信,必須正確設(shè)定它們兩者之間的通信方式,保證雙方都用相同的波特率、起始位、停止位、奇偶校驗(yàn)位,并且要建立雙方通信的應(yīng)答信號(hào)。</p><p> 單片機(jī)
10、既可工作在同步移位寄存器方式下也可工作在UART(通用異步收發(fā)器)下。串行口的通信方式是由特殊功能寄存器SCON來(lái)控制的。其各控制定義如下:</p><p> SM0,SM1:工作模式設(shè)定位;SM2:允許使用方法2、3多機(jī)通信控制位;RB8:接收數(shù)據(jù)第9位;TB8:發(fā)送數(shù)據(jù)第9位;TI:發(fā)送中斷標(biāo)志;RI:接收中斷標(biāo)志。本文中工作方式為3,即9位UART定時(shí)器T1作為波特率發(fā)生器。</p><
11、;p> 1)串行通信波特率為9600bps;</p><p> 2)幀格式為8位數(shù)據(jù)位,一位起始位,一位可編程的第9位(即發(fā)送和接收的地址/數(shù)據(jù)位的標(biāo)志位),一位停止位;</p><p> 3)主機(jī)和從機(jī)遵循主從原則,主機(jī)用呼叫方式選擇從機(jī),數(shù)據(jù)在主機(jī)和從機(jī)之間雙向傳遞,各從機(jī)之間的相互通信需通過(guò)主機(jī)作為中介;</p><p> 4)主從機(jī)之間還應(yīng)傳送
12、一些供它們識(shí)別的命令和狀態(tài)字,如以‘c’表示主機(jī)發(fā)送從機(jī)接收命令,以‘d’表示從機(jī)發(fā)送主機(jī)接收命令等。</p><p> 2系統(tǒng)總體方案及硬件設(shè)計(jì)</p><p><b> 2.1總體設(shè)計(jì)方案</b></p><p> 多機(jī)通信模塊共有四個(gè)基本模塊組成,一是主單片機(jī),主要功能是控制發(fā)送命令和接受從機(jī)發(fā)送的數(shù)據(jù);二是從單片機(jī)1,負(fù)責(zé)采集溫度
13、數(shù)據(jù),并發(fā)送到主機(jī);三是從機(jī)2,功能作用同上,但也可以是其他數(shù)據(jù),比如空氣空氣濕度、水分、相關(guān)氣體含量等;四是顯示模塊,本設(shè)計(jì)采用數(shù)碼管顯示,數(shù)碼管便宜簡(jiǎn)單、編程容易、易控制,同時(shí)硬件電路比較好設(shè)計(jì)等。下圖為總體設(shè)計(jì)框圖:</p><p><b> 總體設(shè)計(jì)方案框圖</b></p><p><b> 2.2硬件電路設(shè)計(jì)</b></p&g
14、t;<p> 單片機(jī)最小系統(tǒng)有時(shí)鐘電路、復(fù)位電路、電源電路組成,如下圖</p><p><b> 時(shí)鐘電路:</b></p><p> 單片機(jī)工作時(shí),是一條一條地從ROM中取指令,然后一步一步地執(zhí)行。單片機(jī)訪問一次存儲(chǔ)器的時(shí)間,稱之為一個(gè)機(jī)器周期,這是一個(gè)時(shí)間基準(zhǔn)?!獋€(gè)機(jī)器周期包括12個(gè)時(shí)鐘周期。如果一個(gè)單片機(jī)選擇了12MHz晶振,它的時(shí)鐘周期是1
15、/12us,它的一個(gè)機(jī)器周期是12×(1/12)us,也就是1us。沒有晶振,就沒有時(shí)鐘周期,沒有時(shí)鐘周期,就無(wú)法執(zhí)行程序代碼,單片機(jī)就無(wú)法工作。旁邊的兩個(gè)電容叫負(fù)載電容。一般單片機(jī)的晶振工作于并聯(lián)諧振狀態(tài),它是根據(jù)晶振廠家提供的晶振要求負(fù)載電容選值的。晶振的頻率就是在它提供的負(fù)載電容下測(cè)得的,能最大限度的保證頻率值的誤差。兩個(gè)電容的取值都是相同的,或者說(shuō)相差不大,如果相差太大,容易造成諧振的不平衡,容易造成停振或者干脆不起振
16、。</p><p><b> 復(fù)位電路:</b></p><p><b> 上電復(fù)位電路</b></p><p> 上圖是用作上電復(fù)位用的,VCC一上電,由于電容兩端電壓不能突變,所以RST上為高電平,然后電容放電,RST就為低電平了,放電時(shí)間為1/(R10*C),這個(gè)時(shí)間應(yīng)該大于三個(gè)晶振周期。而那個(gè)開關(guān)的作用就是手
17、動(dòng)復(fù)位用的了。</p><p><b> 電源電路:</b></p><p> 電源電路見最小系統(tǒng)中的電源即是,較簡(jiǎn)單。</p><p><b> 顯示電路:</b></p><p> 顯示電路由四位共陰數(shù)碼管組成,其中位選由單片機(jī)P2口提供,段選由P0(P0口已上拉電阻)口提供,其中位選處
18、加限流電阻。</p><p><b> 溫度采集電路:</b></p><p><b> Vcc</b></p><p><b> DA</b></p><p><b> GND</b></p><p> 18B20傳感器
19、是獨(dú)特的一線接口,只需要一條口線通信,簡(jiǎn)化了分布式溫度傳感應(yīng)用 無(wú)需外部元件 可用數(shù)據(jù)總線供電,電壓范圍為3.0 V至5.5 V 無(wú)需備用電源 測(cè)量溫度范圍為-55 ° C至+125 ℃ 。根據(jù)DS18B20的通訊協(xié)議,主機(jī)(單片機(jī))控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過(guò)三個(gè)步驟:每一次讀寫之前都要對(duì)DS18B20進(jìn)行復(fù)位操作,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對(duì)DS18B20進(jìn)行預(yù)定的操作。復(fù)位要求主
20、CPU將數(shù)據(jù)線下拉500微秒,然后 釋放,當(dāng)DS18B20收到信號(hào)后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號(hào)表示復(fù)位成功。</p><p><b> 傳輸電路:</b></p><p> 上圖為MAX232電平轉(zhuǎn)換芯片電路,其主要特點(diǎn)是:</p><p> 符合所有的RS-232C技術(shù)標(biāo)準(zhǔn)。</
21、p><p> 只需要單一 +5V電源供電。</p><p> 片載電荷泵具有升壓、電壓極性反轉(zhuǎn)能力,能夠產(chǎn)生+10V和-10V電壓V+、V- 。</p><p> 功耗低,典型供電電流5mA 。</p><p> 內(nèi)部集成2個(gè)RS-232C驅(qū)動(dòng)器 。6、高集成度,片外最低只需4個(gè)電容即可工作。</p><p>
22、由于本次通信是單片機(jī)之間的通信,距離較近,此次設(shè)計(jì)過(guò)程中沒用,直接將主機(jī)的發(fā)射口接從機(jī)接收口,主機(jī)接收口連接從機(jī)發(fā)射口。</p><p><b> 3軟件設(shè)計(jì)</b></p><p><b> 3.1控制流程圖</b></p><p> 多機(jī)溫度檢測(cè)系統(tǒng)設(shè)計(jì)流程圖</p><p> 主機(jī)發(fā)送
23、控制命令,確定由哪一個(gè)從機(jī)傳送采集的溫度數(shù)據(jù),然后經(jīng)過(guò)處理,顯示在數(shù)碼管上。</p><p> 3.2串行口采集步驟</p><p> 主機(jī)發(fā)送信息,可以傳送到各個(gè)從機(jī)或指定從機(jī),各從機(jī)發(fā)送的信息只能被主機(jī)接收。</p><p> 多機(jī)通信(關(guān)鍵是地址幀的識(shí)別)</p><p> 主機(jī)發(fā)送:地址幀、數(shù)據(jù)幀的鑒別是通過(guò)第9位數(shù)據(jù)確定:T
24、B8=1,地址幀,TB8=0,數(shù)據(jù)幀;從機(jī)接收:各從機(jī)串行口工作在方式2、方式3下;多機(jī)通信標(biāo)志SM2(SCON.5)=1;檢查接收到的第9位RB8(SCON.2),當(dāng) RB8=1:地址幀,將地址裝入SBUF,置位RI,發(fā)出接收中斷請(qǐng)求;判斷主機(jī)發(fā)送地址是否與本機(jī)相符,若相符,則將從機(jī)SM2清0(變成直通方式),準(zhǔn)備接收其后傳送來(lái)的數(shù)據(jù)。RB8=0:數(shù)據(jù)幀,對(duì)SM2=1,RB8=0的從機(jī),接收數(shù)據(jù)丟棄,而對(duì)SM2=0的從機(jī):直通方式,不
25、論RB8是0還是1,都將接受到的數(shù)據(jù)送SBUF,并發(fā)出中斷請(qǐng)求。</p><p> 多機(jī)通信的過(guò)程總結(jié)如下:</p><p> ?。?)全部從機(jī)串行口工作方式初始化為2或3,置位SM2,允許中斷;</p><p> ?。?)主機(jī)置位TB8,發(fā)送要尋址的從機(jī)地址;</p><p> (3)所有的從機(jī)均接收主機(jī)發(fā)送的地址,進(jìn)入中斷進(jìn)行地址比較
26、;</p><p> (4)確認(rèn)尋址從機(jī),自身SM2清0,向主機(jī)返回地址供主機(jī)核對(duì);</p><p> ?。?)主機(jī)核對(duì)無(wú)誤,向被尋址從機(jī)發(fā)送發(fā)送命令,通知從機(jī)進(jìn)行一對(duì)一數(shù)據(jù)通信。</p><p><b> 3.3軟件流程圖</b></p><p><b> PROTEUS仿真</b><
27、/p><p><b> 從機(jī)1顯示如下:</b></p><p> 按下開關(guān)后,主機(jī)發(fā)送從機(jī)A地址,從機(jī)A收到地址和自己相比較,如果正確,則回應(yīng)主機(jī),然后發(fā)送溫度數(shù)據(jù),如果不正確,則繼續(xù)等待。</p><p> 從機(jī)B溫度顯示如下:</p><p> 按下開關(guān)后,主機(jī)發(fā)送從機(jī)B地址,從機(jī)B收到地址和自己相比較,如果正
28、確,則回應(yīng)主機(jī),然后發(fā)送溫度數(shù)據(jù),如果不正確,則繼續(xù)等待。</p><p><b> 課程設(shè)計(jì)體會(huì)</b></p><p> 通過(guò)本次課程設(shè)計(jì),進(jìn)一步熟悉了單片機(jī)編程原理和數(shù)字控制電路技術(shù)的相關(guān)知識(shí),使自己所學(xué)的理論知識(shí)得到鞏固,并充分認(rèn)識(shí)到了自己所學(xué)的專業(yè)知識(shí)的實(shí)用性和重要性,同時(shí)對(duì)Proteuls操作更加熟練。</p><p> 過(guò)程
29、中遇到了一些困難,如:多機(jī)通信協(xié)議部分地址和數(shù)據(jù)的如何安排發(fā)送等,顯示電路中的驅(qū)動(dòng)是否需要驅(qū)動(dòng)等問題。經(jīng)過(guò)查找相關(guān)資料和科技文獻(xiàn),和電子發(fā)燒友的同學(xué)們交流,一步步解決所遇到的困難。但是在解決這些問題的過(guò)程無(wú)疑是對(duì)自己自身專業(yè)素質(zhì)的一種提高,同時(shí)也加深自己對(duì)專業(yè)技術(shù)的認(rèn)識(shí)。這次課程設(shè)計(jì),使我看到自身的不足和缺點(diǎn),也使我學(xué)到了如何克服電子電路設(shè)計(jì)時(shí)的困難,希望今后類似這樣的課程設(shè)計(jì)會(huì)更多,讓我多一些機(jī)會(huì)鍛煉自己的創(chuàng)新能力!</p>
30、;<p><b> 參考文獻(xiàn):</b></p><p> [1] 康華光.電子技術(shù)基礎(chǔ)(模擬部分)(第五版).北京:高等教育出版社,2006.</p><p> [2] 康華光.電子技術(shù)基礎(chǔ)(數(shù)字部分)(第五版).北京:高等教育出版社,2006.</p><p> [3]單片機(jī)原理及應(yīng)用技術(shù)(第一版).中國(guó)礦業(yè)大學(xué)出版社,
31、2008</p><p> 附件1:主機(jī)A源程序代碼</p><p> #include <reg51.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar ch[]={0
32、x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};</p><p> uchar ch1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};</p><p> uchar Mode;</p><p> uchar m1,m2,m3,m4;</p&g
33、t;<p> sbit P10 = P1^0;</p><p> sbit P13 = P1^3;</p><p> sbit P17 = P1^7;</p><p> sbit P20 = P2^0;</p><p> sbit P21 = P2^1;</p><p> sbit P23 =
34、 P2^3;</p><p> sbit P22 = P2^2;</p><p> sbit P24 = P2^4;</p><p> sbit P25 = P2^5;</p><p> sbit key=P1^4;</p><p> sbit key0=P1^2;</p><p>
35、 void UART_init()</p><p><b> {</b></p><p> TMOD = 0x20;</p><p> TH1 = 0xfd;</p><p> TL1 = 0xfd;</p><p><b> TR1 = 1;</b></p&
36、gt;<p> SCON = 0xd0;</p><p><b> ES = 1;</b></p><p><b> EX0 = 1;</b></p><p> IT0 = 1; //INT0下跳觸發(fā)</p><p><b> EA = 1;</b>&l
37、t;/p><p><b> TI = 0;</b></p><p><b> }</b></p><p> void DelayMs(int ms)</p><p><b> {</b></p><p><b> uchar i;<
38、/b></p><p> while(ms--) </p><p> for(i=0; i<120; i++);</p><p><b> }</b></p><p> void putc_to_SerialPort(uchar c)</p><p><b> {&
39、lt;/b></p><p><b> SBUF = c;</b></p><p> while(TI == 0);</p><p><b> TI = 0;</b></p><p><b> }</b></p><p> void Ma
40、sterControl(unsigned char Addr)//, unsigned char Comd)</p><p><b> {</b></p><p><b> TB8 = 1;</b></p><p> putc_to_SerialPort(Addr);</p><p> De
41、layMs(50);</p><p><b> TB8 = 0;</b></p><p><b> }</b></p><p> void delay(int us) </p><p> { int s;</p><p> for ( s=0; s<us;
42、 s++);</p><p><b> }</b></p><p> void disp()</p><p><b> { </b></p><p> //int t1,t2, t0;</p><p> P0 = 0xff;</p><p>
43、 P0 = ch[m1];</p><p><b> P23=0;</b></p><p> delay(200);</p><p><b> P23=1;</b></p><p> P0 = 0xff;</p><p> P0= ch1[m2];</p&g
44、t;<p><b> P22=0;</b></p><p> delay(200);</p><p><b> P22=1;</b></p><p> P0 = 0xff;</p><p> P0 = ch[m3];</p><p><b>
45、 P24=0;</b></p><p> delay(200);</p><p><b> P24=1;</b></p><p> P0 = 0xff;</p><p> P0 = ch[0];</p><p><b> P20=0;</b></
46、p><p> delay(200);</p><p><b> P20=1;</b></p><p><b> }</b></p><p> com_int(void) interrupt 4</p><p><b> {</b></p>
47、;<p> uchar i,k;</p><p><b> ES=0;</b></p><p><b> if(RI==1)</b></p><p><b> {</b></p><p><b> RI = 0;</b></p
48、><p> if(SBUF=='b')</p><p><b> {</b></p><p><b> i=i+1; </b></p><p><b> }else</b></p><p> if(SBUF=='d
49、9;)</p><p><b> {</b></p><p><b> k=k+1;</b></p><p> }else if(i==1)</p><p><b> {</b></p><p><b> m1=0;</b&g
50、t;</p><p><b> m1=SBUF;</b></p><p><b> i=i+1;</b></p><p> }else if(i==2)</p><p><b> {</b></p><p><b> m2=0;<
51、;/b></p><p><b> m2=SBUF;</b></p><p><b> i=i+1;</b></p><p> } else if(i==3)</p><p><b> {</b></p><p><b>
52、//i=0;</b></p><p><b> m3=0;</b></p><p><b> m3=SBUF;</b></p><p><b> i=i+1;</b></p><p><b> } </b></p>&l
53、t;p> else if(i==4)</p><p><b> {</b></p><p><b> i=0;</b></p><p><b> m4=0;</b></p><p><b> m4=SBUF;</b></p>
54、<p><b> }</b></p><p> else if(k==1)</p><p><b> {</b></p><p><b> m1=0;</b></p><p><b> m1=SBUF;</b></p>
55、<p><b> k=k+1;</b></p><p> }else if(k==2)</p><p><b> {m2=0;</b></p><p><b> m2=SBUF;</b></p><p><b> k=k+1;</b>
56、;</p><p> }else if(k==3)</p><p> { //k=0;</p><p><b> m3=0;</b></p><p><b> m3=SBUF;</b></p><p><b> k=k+1;</b><
57、;/p><p><b> }</b></p><p> else if(k==4)</p><p><b> { k=0;</b></p><p><b> m4=0;</b></p><p><b> m4=SBUF;</b
58、></p><p><b> }</b></p><p><b> }</b></p><p><b> ES=1;</b></p><p><b> }</b></p><p> void main(void)&
59、lt;/p><p><b> {</b></p><p> P1 = 0xff;</p><p> UART_init();</p><p><b> Mode = 0;</b></p><p><b> while(1)</b></p>
60、;<p><b> {</b></p><p> if(key==0)</p><p><b> {</b></p><p> DelayMs(35);</p><p> if(key==0)</p><p><b> {</b>
61、;</p><p><b> key0==1;</b></p><p><b> P10 = 1;</b></p><p> MasterControl('b');//,'O');</p><p><b> }</b></p>
62、<p><b> }</b></p><p> if(key0==0)</p><p><b> {</b></p><p> DelayMs(35);</p><p> if(key0==0)</p><p><b> {</b&g
63、t;</p><p><b> key==1;</b></p><p> P13 = 1; </p><p> MasterControl('c');</p><p><b> }</b></p><p><b> }</b>
64、;</p><p><b> disp();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 從機(jī)B程序代碼:</b></p><p> #include &l
65、t;reg51.h></p><p> #include"DS18B20.H"</p><p> #include"intrins.h"</p><p> #define uchar unsigned char</p><p> uchar m1,m2,m3;</p><
66、;p> uchar RecData;</p><p> sbit P10 = P1^0;</p><p> sbit P13 = P1^3;</p><p> sbit P24 = P2^4;</p><p> sbit P23 = P2^3;</p><p> sbit P25 = P2^5;<
67、;/p><p> void UART_init()</p><p><b> {</b></p><p> TMOD = 0x21;</p><p> TH1 = 0xfd;</p><p> TL1 = 0xfd;</p><p><b> TR1 =
68、1;</b></p><p> SCON = 0xf0;</p><p><b> ES = 1;</b></p><p><b> PS = 1;</b></p><p><b> EA = 1;</b></p><p><b
69、> }</b></p><p> void DelayMs(int ms)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> while(ms--) </p><p> for(i=0;
70、i<120; i++);</p><p><b> }</b></p><p> void delay1(uint ms) </p><p><b> {</b></p><p><b> uchar y ;</b></p><p>
71、 while(ms--)</p><p><b> {</b></p><p> for(y = 0 ; y<250 ; y++)</p><p><b> {</b></p><p><b> _nop_() ;</b></p><p>
72、<b> _nop_() ;</b></p><p><b> _nop_() ;</b></p><p><b> _nop_() ;</b></p><p><b> }</b></p><p><b> }</b>&l
73、t;/p><p><b> }</b></p><p> void putc_to_SerialPort(uchar c)</p><p><b> {</b></p><p><b> SBUF = c;</b></p><p> while(T
74、I == 0);</p><p><b> TI = 0;</b></p><p><b> }</b></p><p> void dispy()</p><p><b> { </b></p><p> //P0 = 0xff;</
75、p><p> P0 = ch[disp[0]];</p><p><b> P23=0;</b></p><p> delay(60);</p><p><b> P23=1;</b></p><p> //P0 = 0xff;</p><p>
76、; P0= ch[disp[1]];</p><p><b> P25=0;</b></p><p> delay(60);</p><p><b> P25=1;</b></p><p> //P0 = 0xff;</p><p> P0 = ch[disp[
77、2]];</p><p><b> P24=0;</b></p><p> delay(60);</p><p><b> P24=1;</b></p><p><b> }</b></p><p> com_int(void) interru
78、pt 4</p><p><b> {</b></p><p><b> ES=0;</b></p><p><b> if(RI)</b></p><p><b> {</b></p><p><b> uch
79、ar i;</b></p><p> RecData = SBUF;</p><p><b> RI = 0;</b></p><p> if(RB8 == 1) </p><p><b> {</b></p><p> if(RecData == &
80、#39;b') </p><p><b> {</b></p><p><b> SM2 = 0;</b></p><p> putc_to_SerialPort('b');</p><p> delay1(20); </p><p> f
81、or(i=0;i<=3;i++)</p><p><b> { </b></p><p> putc_to_SerialPort(disp[i]); </p><p> delay1(300);</p><p><b> }</b></p><p><b
82、> SM2=1;</b></p><p><b> }</b></p><p> else {</p><p><b> SM2 = 1;</b></p><p><b> } </b></p><p>&l
83、t;b> } </b></p><p><b> } </b></p><p><b> RI=0;</b></p><p><b> TI=0;</b></p><p><b> SM2=1; </b></p>
84、<p><b> ES=1; </b></p><p><b> }</b></p><p> void main(void)</p><p><b> {</b></p><p> P0 = 0xff;</p><p> P1
85、 = 0xff;</p><p> UART_init();</p><p> // dispy();</p><p><b> while(1)</b></p><p><b> { </b></p><p><b> dispy();</b&
86、gt;</p><p> ReadTemperature();</p><p><b> }</b></p><p><b> }</b></p><p> 其中18B20.H文件如下:</p><p> #define uchar unsigned char<
87、;/p><p> #define uint unsigned int</p><p> sbit DQ =P2^2; //定義通信端口</p><p> uchar disp[3]; //待顯示的數(shù)據(jù),高2位整數(shù)部分,低2位小數(shù)部分</p><p><b> //延時(shí)函數(shù)</b></p>
88、<p> void delay(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p><b> //初始化函數(shù)</b></p>&
89、lt;p> Init_DS18B20(void)</p><p><b> {</b></p><p> uchar x=0;</p><p> DQ = 1; //DQ復(fù)位</p><p> delay(8); //稍做延時(shí)</p><p> DQ = 0; //
90、單片機(jī)將DQ拉低</p><p> delay(80); //精確延時(shí) 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay(14);</p><p> x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗</p><p> dela
91、y(20);</p><p><b> }</b></p><p><b> //讀一個(gè)字節(jié)</b></p><p> ReadOneChar(void)</p><p><b> {</b></p><p> uchar i=0;</p
92、><p> uchar dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> DQ = 0; // 給脈沖信號(hào)</p><p><b> dat>>=1;</b></p&g
93、t;<p> DQ = 1; // 給脈沖信號(hào)</p><p><b> if(DQ)</b></p><p> dat|=0x80;</p><p><b> delay(4);</b></p><p><b> }</b></p>&l
94、t;p> return(dat);</p><p><b> }</b></p><p><b> //寫一個(gè)字節(jié)</b></p><p> WriteOneChar(unsigned char dat)</p><p><b> {</b></p>
95、<p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p>
96、<p><b> delay(5);</b></p><p><b> DQ = 1;</b></p><p><b> dat>>=1;</b></p><p><b> }</b></p><p><b>
97、delay(4);</b></p><p><b> }</b></p><p><b> //讀取溫度</b></p><p> void ReadTemperature(void)</p><p><b> {</b></p><p&
98、gt; uchar a=0,temp;</p><p> uchar b=0;</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作</p><p> WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p>
99、 Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度</p><p> a=ReadOneChar(); //讀取溫度值低位</p><p> b=R
100、eadOneChar(); //讀取溫度值高位</p><p><b> temp=b;</b></p><p> temp&=0xf0;</p><p> if(temp==0) //正溫</p><p><b> {</b></p><p&g
101、t; disp[3]=(b<<4)|(a>>4)/100;</p><p> disp[2]=(((b<<4)|(a>>4))%100)/10;</p><p> disp[1]=(((b<<4)|(a>>4))%100)%10;</p><p> disp[0]=((a&0x0
102、f)*625)/1000;</p><p><b> }</b></p><p> else //負(fù)溫</p><p><b> {</b></p><p><b> if(a==0)</b></p><p><b> {
103、</b></p><p><b> a=~a+1;</b></p><p><b> b=~b+1; </b></p><p><b> }</b></p><p><b> else</b></p><p>&
104、lt;b> { </b></p><p><b> a=~a+1;</b></p><p><b> b=~b;</b></p><p><b> }</b></p><p> disp[3]=22;</p><p&g
105、t; disp[2]=((b<<4)|(a>>4))/10;</p><p> disp[1]=((b<<4)|(a>>4))%10;</p><p> disp[0]=((a&0x0f)*625)/1000;</p><p><b> }</b></p><p
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)多機(jī)通信課程設(shè)計(jì)
- 單片機(jī)多機(jī)通信課程設(shè)計(jì)
- 51單片機(jī)課程設(shè)計(jì)
- 基于51單片機(jī)課程設(shè)計(jì)
- 51單片機(jī)課程設(shè)計(jì)題目
- 51單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)單片機(jī)課程設(shè)計(jì)-雙機(jī)串行通信
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的定時(shí)鬧鐘設(shè)計(jì)
- 基于51單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的紅外線設(shè)計(jì)
- 基于51單片機(jī)課程設(shè)計(jì)報(bào)告
- c51單片機(jī)課程設(shè)計(jì)
- 基于51單片機(jī)的課程設(shè)計(jì)
- 單片機(jī)單片機(jī)課程設(shè)計(jì)-雙機(jī)串行通信e
- c51單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)溫度傳感器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于51單片機(jī)的電子鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)—基于51單片機(jī)的溫度監(jiān)控系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的交通燈
- 單片機(jī)課程設(shè)計(jì)-- 基于51單片機(jī)的電子時(shí)鐘系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的簡(jiǎn)易電子琴
評(píng)論
0/150
提交評(píng)論