單片機雙機通信課程設(shè)計報告_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計說明書</b></p><p>  課程設(shè)計名稱: 單片機課程設(shè)計 </p><p>  課程設(shè)計題目: 單片機與單片機之間的串行通訊 </p><p>  學 院 名 稱: 信息工程學院 </p><

2、;p>  專業(yè): 電子信息科學與技術(shù) 班級: </p><p>  學號: xxx 姓名: xxx </p><p>  評分: 教師: xxx </p><p>  2012年6月25日</p><p>  電

3、子信息工程專業(yè) 課程設(shè)計任務(wù)書</p><p>  20 10 -20 11學年 第 2 學期 第 17 周- 20 周 </p><p>  注:1、此表一組一表二份,課程設(shè)計小組組長一份;任課教師授課時自帶一份備查。</p><p>  課程設(shè)計結(jié)束后與“課程設(shè)計小結(jié)”、“學生成績單”一并交院教務(wù)存檔</p><p><b>

4、  摘要</b></p><p>  串行通訊是單片機的一個重要應(yīng)用。本設(shè)計就是利用兩塊單片機來完成一個系統(tǒng),實現(xiàn)單片機之間的串行通訊。</p><p>  隨著計算機的不斷普及,在我們的周圍可能會同時出現(xiàn)多臺微型計算機,而且這些計算機的牌號,后型號不同,而且有的格式不兼容。于是利用單片機串行口實現(xiàn)不同計算機之間的相互通信,以達到信息或程序的共享是非常有用的。從智能家用電器到工

5、業(yè)上的控制系統(tǒng)都采用了上位機與下位機基于串行通信的主從工作方式,這樣就充分利用了微機分析處理能力強、速度快的特點及下位機(單片機)面向控制、使用靈活方便的優(yōu)勢。由于AT09C52系列單片機具有性能穩(wěn)定、工作可靠、價格低廉等可特點,因此其應(yīng)用相當廣泛。AT09C52單片機中有異步通信串行接口,能方便的構(gòu)成雙機,多機通訊接口。隨著測量向自動化,智能化,網(wǎng)絡(luò)化方向的發(fā)展。利用多機通訊構(gòu)成的分布式系統(tǒng)逐漸普及。本實驗就點對點的雙機通信進行訓練。

6、學習串口的工作方式,初始化編程,和單片機與單片機點對點通信的編程方法以及硬件電路的設(shè)計方法。</p><p>  在此基礎(chǔ)上可以進一步提高,實現(xiàn)多機通信以及單片機與PC機的通訊,手機通過藍牙與單片機通訊,電腦通過藍牙與單片機通訊等一系列功能擴展。</p><p>  【關(guān)鍵字】 雙機串行通訊 AT89C52 異步通訊 功能擴展</p><p><b&

7、gt;  目錄</b></p><p><b>  前言1</b></p><p>  第一章、系統(tǒng)功能2</p><p>  1.1 設(shè)計要求和系統(tǒng)的組成及工作原理2</p><p>  第二章、系統(tǒng)設(shè)計方案3</p><p><b>  2.1硬件設(shè)計3<

8、/b></p><p>  2.1.1 AT89C52和RS232說明3</p><p>  2..12 雙機通訊的方案選擇7</p><p><b>  2.1軟件設(shè)計8</b></p><p>  2.2.1 甲機程序的編寫說明8</p><p>  2.2.2 甲機程序的編寫說

9、明12</p><p>  第三章、調(diào)試與操作19</p><p>  3.1 開發(fā)板調(diào)試19</p><p>  3.2 測試結(jié)果與分析20</p><p><b>  第四章、結(jié)論21</b></p><p>  附錄一、參考文獻22</p><p>  附

10、錄二、元器件清單23</p><p>  附錄三、 電路總圖24</p><p>  附錄四、 實物圖25</p><p><b>  前言</b></p><p>  電子科學技術(shù)是人類在生產(chǎn)斗爭和科學實驗中發(fā)展起來的。隨著科學技術(shù)的發(fā)展和人類的進步,電子技術(shù)已經(jīng)成了各種工程技術(shù)的核心,特別是進入信息時代以來,電

11、子技術(shù)更是成了基本技術(shù),其具體應(yīng)用領(lǐng)域涵蓋了通信領(lǐng)域、控制系統(tǒng)、測試系統(tǒng)、計算機等等各行各業(yè)。</p><p>  單片機之間的數(shù)據(jù)通訊在當今社會應(yīng)用相當廣泛,單片機之間的數(shù)據(jù)通訊。由于52系列單片機具有性能穩(wěn)定、工作可靠、價格低廉等特點,因此其應(yīng)用相當廣泛。一個52系列的單片機(如At89c52)內(nèi)部包含有RAM、FLASH ROM、三個16位的定時器/計數(shù)器、一個通用異步串行通信控制器(UART)等多種資源。

12、但即便如此,在一些相對復(fù)雜的單片機應(yīng)用系統(tǒng)中,僅僅一個單片機資源還是不夠的,因此而常常需要擴充I/O接口、定時器/計數(shù)器、串行通信接口、RAM、ROM等。采用通用的標準器件進行擴充是通常的做法,但將單片機本身作為一個通用的擴充器件來使用,也不失為一個好的方法。在這種情況下,一個系統(tǒng)中就使用了兩個或兩個以上的單片機,而單片機之間就要通過互連來進行數(shù)據(jù)通信。52系列的單片機(以下簡稱單片機)都帶有串口,利用串口進行互連通信極為方便,其各種連

13、接方式在許多書籍和資料上都有介紹,在此不再重述。但如果系統(tǒng)要求擴充的資源是對外連接的串口,或?qū)ο嗷ブg的數(shù)據(jù)傳送有一定的速度要求,則單片機的串口就不能用作系統(tǒng)內(nèi)兩單片機的通信接口了。所幸的是,單片機的并行端口也能相互連接來進行數(shù)據(jù)通信。根據(jù)單片機端口內(nèi)部結(jié)構(gòu)的</p><p>  本文就是關(guān)于用單片機與單片機之間的串行通訊的過程及基本原理。</p><p><b>  第一章

14、系統(tǒng)功能</b></p><p>  1.1設(shè)計要求和系統(tǒng)的組成及工作原理</p><p><b>  一.設(shè)計要求</b></p><p>  1.用RS232串行芯片實現(xiàn)雙向通訊。</p><p>  2.傳送的數(shù)據(jù)在顯示器上(數(shù)碼管和發(fā)光二極管)顯示。</p><p><b

15、>  二.系統(tǒng)組成</b></p><p><b>  圖1 總體框圖</b></p><p><b>  三.工作原理</b></p><p>  雙機通信系統(tǒng)通過甲乙單片機的串行口來實現(xiàn)數(shù)據(jù)的收發(fā)。</p><p>  甲單片機通過開關(guān)電路來啟動發(fā)送程序,甲機當開關(guān)按下時向乙

16、機發(fā)送一個數(shù)據(jù),乙機上蜂嚀器發(fā)出聲音提示有數(shù)據(jù)發(fā)送過來,乙機通過接收中斷來接收和開關(guān)判斷是否接收甲機發(fā)送過來的數(shù)據(jù),并通過編寫好的數(shù)據(jù)代碼在8個發(fā)光二極管上顯示主機發(fā)送過來的數(shù)據(jù)。</p><p>  乙單片機通過開關(guān)電路來啟動發(fā)送程序,乙機給甲機發(fā)送一數(shù)據(jù),甲機上蜂嚀器發(fā)出聲音提示有數(shù)據(jù)發(fā)送過來,甲機通過接收中斷來接收和開關(guān)判斷是否接收乙機發(fā)送過來的數(shù)據(jù),并通過編寫好的數(shù)據(jù)代碼在8個發(fā)光二極管上顯示乙機發(fā)送過來

17、的數(shù)據(jù)。</p><p>  第二章 系統(tǒng)設(shè)計方案</p><p><b>  2.1 硬件設(shè)計</b></p><p>  2.1.1 AT89C52和RS23說明</p><p>  一. At89c52單片機內(nèi)部有1個功能很強大的全雙工串行口,可以同時發(fā)送和接收數(shù)據(jù)。串行口的內(nèi)部有數(shù)據(jù)接收緩沖器和數(shù)據(jù)發(fā)送緩沖器,

18、數(shù)據(jù)接收緩沖器只能讀出不能寫入,數(shù)據(jù)發(fā)送緩沖器只能寫入不能讀出,這兩個數(shù)據(jù)緩沖器都是用SBUF來表示,地址都是99H,CPU對特殊功能寄存器SBUF執(zhí)行寫操作就將數(shù)據(jù)寫入發(fā)送緩沖器,對SBUF執(zhí)行度操作就是讀出接收緩沖器中的內(nèi)容。特殊功能寄存器SCON參訪串行口的控制狀態(tài)信號,串行口用T1或者T2作為波特率發(fā)生器(發(fā)送和接收時鐘),特殊功能寄存器PCON的最高位SMOD為串行口波特率的倍率控制位。</p><p>

19、;  SCON:串行口控制寄存器</p><p>  寄存器地址98H,位尋址9FH~98H。</p><p>  SM0、SM1:串行口工作方式選擇位</p><p>  SM2:多機通信控制位</p><p>  REN:允許/禁止串行口接收的控制位</p><p>  TB8:在方式2和方式3中,是被發(fā)送的第9位

20、數(shù)據(jù),可根據(jù)需要由軟件置1或清</p><p>  零,也可以作為奇偶校驗位,在方式1中是停止位。</p><p>  RB8:在方式2和方式3中,是被接收的第9位數(shù)據(jù)(來自第TB8位);在方式</p><p>  中,RB8收到的是停止位,在方式0中不用。</p><p>  TI——串行口發(fā)送中斷請求標志位: 當發(fā)送完一幀串行數(shù)據(jù)后,由硬

21、件置1;在轉(zhuǎn) </p><p>  向中斷服務(wù)程序后,用軟件清0。</p><p>  RI——串行口接收中斷請求標志位: 當接收完一幀串行數(shù)據(jù)后,由硬件置1;在轉(zhuǎn) 向中斷服務(wù)程序后,用軟件清0。</p><p>  SM0、SM1:串行口工作方式選擇位,其組合含義如下所示:</p><p>  PCON的D7位作為串行波特率系數(shù)SMOD控制

22、位,PCON不可位尋址,其地址為87H,當SMOD=1時,波特率加倍。SMOD在PCON中的位置如下所示:</p><p>  RS232近程通訊總線適合于數(shù)據(jù)傳輸速率在0~20000b/s范圍內(nèi)的通信,由于通行設(shè)備廠商都生產(chǎn)與RS-232C制式兼容的通信設(shè)備,因此,它作為一種標準,目前已在微機通信接口中廣泛采用。如圖2所示:</p><p><b>  圖2 DB9<

23、/b></p><p><b>  1.電氣特性</b></p><p>  EIA-RS-232C對電器特性、邏輯電平和各種信號線功能都作了規(guī)定。</p><p>  在TxD和RxD上:邏輯1(MARK)=-3V~-15V</p><p>  邏輯0(SPACE)=+3~+15V</p><

24、p>  在RTS、CTS、DSR、DTR和DCD等控制線上:</p><p>  信號有效(接通,ON狀態(tài),正電壓)=+3V~+15V</p><p>  信號無效(斷開,OFF狀態(tài),負電壓)=-3V~-15V</p><p>  RS232C與TTL轉(zhuǎn)換:EIA-RS-232C是用正負電壓來表示邏輯狀態(tài),與TTL以高低電平表示邏輯狀態(tài)的規(guī)定不同。因此,為了能

25、夠同計算機接口或終端的TTL器件連接,必須在EIA-RS-232C與TTL電路之間進行電平和邏輯關(guān)系的變換。</p><p>  最大直接傳輸距離說明:RS-232C標準規(guī)定,若不使用MODEM,在碼元畸變小于4%的情況下,DTE和DCE之間最大傳輸距離為15m(50英尺。</p><p><b>  2.DB-9連接器</b></p><p>

26、;  使用DB-9連接器,作為提供多功能I/O卡或主板上COM1和COM2兩個串行接口的連接器。它只提供異步通信的9個信號。DB-25型連接器的引腳分配與DB-25型引腳信號完全不同。因此,若與配接DB-25型連接器的DCE設(shè)備連接,必須使用專門的電纜線。</p><p>  最大直接傳輸距離說明:RS-232C標準規(guī)定,若不使用MODEM,在碼元畸變小于4%的情況下,DTE和DCE之間最大傳輸距離為15m(50

27、英尺)。</p><p>  用RS-232總線連接系統(tǒng)有近程通訊方式和遠程通訊方式兩種,近程通訊是指傳輸距離小于15米的通訊,可以用RS-232 電纜直接連接。15米以上的長距離通訊,需要采用調(diào)制調(diào)解器。</p><p>  當計算機與終端之間利用RS-232作近程連接時,有幾根線實現(xiàn)交換連接。本次實驗不需要檢測數(shù)據(jù)等信號狀態(tài)的</p><p>  RS-232

28、是異步通訊中最廣泛的標準總線,適用于數(shù)據(jù)中端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間的接口。在微機通訊中,通常使用 的RS-232接口信號是九根引腳。如圖3:各引腳功能如下:</p><p>  圖3 DB9管腳說明</p><p>  用RS-232總線連接系統(tǒng)有近程通訊方式和遠程通訊方式兩種,近程通訊是指傳輸距離小于15米的通訊,可以用RS-232 電纜直接連接。15米以上的長距

29、離通訊,需要采用調(diào)制調(diào)解器。</p><p>  計算機和終端用RS-232連接的交叉圖4如下,圖中“發(fā)送數(shù)據(jù)”與“接收數(shù)據(jù)”是交叉相連的,是得兩臺設(shè)備都能正常的發(fā)送和接收。</p><p>  圖4 通訊連接 </p><p><b>  數(shù)據(jù)發(fā)送與接收線:</b></p><p>  發(fā)送數(shù)據(jù)(TxD)——

30、通過TxD終端將串行數(shù)據(jù)發(fā)送到MODEM。</p><p>  接收數(shù)據(jù)(RxD)——通過RxD線終端接收從MODEM發(fā)來的串行數(shù)據(jù)。</p><p>  2.1.2 雙機通訊的方案選擇</p><p><b>  設(shè)計方案:</b></p><p>  該系統(tǒng)采用主從共兩片AT89C52單片機來實現(xiàn)上位機對下位機的控

31、制,由于是近距離的雙機通信,我們采用單片機直接交叉連接的方式,上位機發(fā)送的數(shù)據(jù)由串行口TXD端輸出,直接由下位機的串行口數(shù)據(jù)接收端RXD接收。需要注意的是一定要保證主從機相同的數(shù)據(jù)傳輸速率,即要求設(shè)置相同的波特率。電路分為數(shù)碼管顯示模塊,指示模塊、以及單片機工作的基本復(fù)位、晶振模塊。</p><p>  甲機由3個數(shù)碼管,4個獨立鍵盤開關(guān),1個蜂嚀器組成。</p><p>  乙機由8個發(fā)

32、光二極管,一個蜂嚀器,1個數(shù)字溫度傳感器DS18B20組成。</p><p>  單片機上最基本的兩個電路: 復(fù)位電路(圖5)和晶振電路(圖6)</p><p><b>  圖5 復(fù)位電路</b></p><p><b>  圖6 晶振電路</b></p><p><b>  2.2 軟件

33、設(shè)計</b></p><p>  本系統(tǒng)的軟件設(shè)計流程圖。系統(tǒng)設(shè)計代碼分為以下幾個部分:初始化串行、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、鍵盤輸入、數(shù)值轉(zhuǎn)換、LED顯示,數(shù)碼管顯示,用keil編譯。</p><p>  甲機程序設(shè)計框圖(圖7):</p><p>  圖7 甲程序設(shè)計框圖</p><p>  /*******************

34、***********</p><p>  程序名稱: 雙機通信甲機程序</p><p>  實驗地點: 信工學院E404</p><p>  ******************************/</p><p>  #include<reg51.h></p><p>  #define uc

35、har unsigned char</p><p>  #define uint unsigned int</p><p>  sbit k1=P3^4;</p><p>  sbit k2=P3^5;</p><p>  sbit k3=P3^6;</p><p>  sbit k4=P3^7; /

36、/四個獨立鍵盤</p><p>  sbit dula=P2^6; //段選</p><p>  sbit wela=P2^7; //位選</p><p>  sbit beep=P2^3; //蜂鳴器</p><p>  uchar wendu,temp;</p><p>  unsign

37、ed char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,</p><p>  0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不帶小數(shù)點顯示0到9</p><p>  unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6

38、,0xed,0xfd,</p><p>  0x87,0xff,0xef}; // 帶小數(shù)點顯示0到9</p><p>  /******************************</p><p>  延時程序 x (ms) </p><p>  *****

39、*************************/</p><p>  void delay(uint x)</p><p><b>  {</b></p><p><b>  char i;</b></p><p>  while(x--)</p><p>  for(i

40、=0;i<120;i++);</p><p><b>  }</b></p><p>  /******************************</p><p>  數(shù)碼管顯示溫度值 </p><p>  ******************************/</p><p&

41、gt;  void display(uint temp)</p><p><b>  {</b></p><p>  uchar A1,A2,A3;</p><p>  if(wendu>=110) //溫度大于31度蜂鳴器發(fā)聲</p><p><b>  { </

42、b></p><p><b>  beep=0;</b></p><p>  delay(50);</p><p><b>  beep=1;</b></p><p><b>  }</b></p><p>  temp=temp+200;<

43、/p><p>  A1=temp/100;</p><p>  A2=temp%100/10;</p><p>  A3=temp%100%10;</p><p><b>  dula=1;</b></p><p>  P0=table[A1]; //顯示百位</p&

44、gt;<p><b>  dula=0;</b></p><p><b>  wela=1;</b></p><p>  P0=0x7f; //0111 1111 選中第一個數(shù)碼管</p><p><b>  wela=0;</b></p>

45、<p><b>  delay(5);</b></p><p><b>  dula=1;</b></p><p>  P0=table1[A2]; //顯示十位</p><p><b>  dula=0;</b></p><p><b&

46、gt;  wela=1;</b></p><p>  P0=0x7e; //0111 1111 選中第一個數(shù)碼管</p><p><b>  wela=0;</b></p><p><b>  delay(5);</b></p><p><b>  dula=1

47、;</b></p><p>  P0=table[A3]; //顯示個位</p><p><b>  dula=0;</b></p><p><b>  wela=1;</b></p><p>  P0=0x7b; //0111 1111 選中第一個數(shù)碼管&l

48、t;/p><p><b>  wela=0;</b></p><p><b>  delay(5);</b></p><p><b>  }</b></p><p>  /******************************</p><p>  甲機

49、向乙機發(fā)送程序 </p><p>  ******************************/</p><p>  void com(uchar com)</p><p><b>  {</b></p><p><b>  SBUF=com;</b></p><p&g

50、t;  while(!TI); //是否發(fā)送完</p><p><b>  TI=0;</b></p><p><b>  }</b></p><p>  void main()</p><p>  { </p><p><b>

51、  uchar b;</b></p><p>  SCON=0x50; //SM0=1,SM1=1,SEN=1</p><p>  TMOD=0X20; //定時器工作于方式一</p><p><b>  TH1=0XFD;</b></p><p>  TL1

52、=0XFD; //波特率9600</p><p>  TR1=1; //啟動定時器</p><p>  IE=0X90; //開中斷</p><p>  beep=1; //蜂鳴器初始狀態(tài)不響</p><p><b>  while(1)<

53、/b></p><p><b>  { </b></p><p>  if(k1==0) //接收乙機溫度值顯示</p><p><b>  {</b></p><p>  while(k4==1)</p><p><b>  {</

54、b></p><p>  display(wendu);</p><p>  delay(10);</p><p><b>  } </b></p><p><b>  } </b></p><p>  if(k2==0) //發(fā)送流水燈指令&l

55、t;/p><p><b>  {</b></p><p><b>  b=2;</b></p><p><b>  com(b);</b></p><p><b>  }</b></p><p>  if(k3==0) //

56、發(fā)送搖擺燈指令</p><p><b>  {</b></p><p><b>  b=3;</b></p><p><b>  com(b);</b></p><p><b>  }</b></p><p>  if(k4==0)

57、 //關(guān)閉甲乙機所有顯示 </p><p><b>  {</b></p><p>  P0=0XFF; </p><p><b>  delay(1);</b></p><p><b>  wela=1;</b></p>

58、;<p><b>  delay(1);</b></p><p><b>  wela=0;</b></p><p><b>  b=4;</b></p><p><b>  com(b);</b></p><p><b>  }&

59、lt;/b></p><p><b>  delay(5);</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************************</p><p>

60、;  甲機從乙機接收程序 </p><p>  ******************************/</p><p>  void ert()interrupt 4</p><p><b>  {</b></p><p><b>  RI=0; </b></p><

61、p>  wendu=SBUF;</p><p><b>  }</b></p><p>  乙機程序設(shè)計框圖(圖8):</p><p><b>  圖8 乙機設(shè)計框圖</b></p><p>  /******************************</p><p&

62、gt;  程序名稱: 雙機通信乙機程序</p><p>  實驗地點: 信工學院E404</p><p>  ******************************/</p><p>  #include<reg52.h></p><p>  #include <intrins.h></p>&

63、lt;p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit DS=P2^2; //ds18b20片選信號</p><p>  uint temp; // 記錄ds18b20的溫度值</p>&

64、lt;p>  sbit k1=P3^4;</p><p>  sbit k2=P3^5;</p><p>  sbit k3=P3^6;</p><p>  sbit k4=P3^7; //四個獨立鍵盤</p><p>  sbit beep=P2^3;</p><p><b>  uchar k

65、;</b></p><p>  /******************************</p><p>  延時程序 x (ms) </p><p>  ******************************/</p><p>  void delay(uint x)</p><p>&

66、lt;b>  {</b></p><p><b>  char i;</b></p><p>  while(x--)</p><p>  for(i=0;i<120;i++);</p><p><b>  }</b></p><p>  /*****

67、*************************</p><p>  send reset and initialization command </p><p>  ******************************/</p><p>  void dsreset(void) </p><p><b>

68、  {</b></p><p><b>  uint i;</b></p><p><b>  DS=0;</b></p><p><b>  i=103;</b></p><p>  while(i>0)i--;</p><p>&l

69、t;b>  DS=1;</b></p><p><b>  i=4;</b></p><p>  while(i>0)i--;</p><p><b>  }</b></p><p>  /******************************</p>&

70、lt;p>  read a bit </p><p>  ******************************/</p><p>  bit tmpreadbit(void) </p><p><b>  {</b></p><p><b>  uint i;</b>&l

71、t;/p><p><b>  bit dat;</b></p><p>  DS=0;i++; //i++ for delay</p><p>  DS=1;i++;i++;</p><p><b>  dat=DS;</b></p><p>  i=8;whi

72、le(i>0)i--;</p><p>  return (dat);</p><p><b>  }</b></p><p>  /******************************</p><p>  read a byte date </p><p>  *********

73、*********************/</p><p>  uchar tmpread(void) </p><p><b>  {</b></p><p>  uchar i,j,dat;</p><p><b>  dat=0;</b></p><p>  fo

74、r(i=1;i<=8;i++)</p><p><b>  {</b></p><p>  j=tmpreadbit();</p><p>  dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里</p><p><b>  }&l

75、t;/b></p><p>  return(dat);</p><p><b>  }</b></p><p>  /******************************</p><p>  write a byte to ds18b20 </p><p>  *********

76、*********************/</p><p>  void tmpwritebyte(uchar dat) </p><p><b>  {</b></p><p><b>  uint i;</b></p><p><b>  uchar j;</b>&l

77、t;/p><p>  bit testb;</p><p>  for(j=1;j<=8;j++)</p><p><b>  {</b></p><p>  testb=dat&0x01;</p><p>  dat=dat>>1;</p><p>

78、  if(testb) //write 1</p><p><b>  {</b></p><p><b>  DS=0;</b></p><p><b>  i++;i++;</b></p><p><b>  DS=1;</b></p&g

79、t;<p>  i=8;while(i>0)i--;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  DS=0; //write 0</p&g

80、t;<p>  i=8;while(i>0)i--;</p><p><b>  DS=1;</b></p><p><b>  i++;i++;</b></p><p><b>  }</b></p><p><b>  }</b>&

81、lt;/p><p><b>  }</b></p><p>  /******************************</p><p>  DS18B20 begin change </p><p>  ******************************/</p><p>  vo

82、id tmpchange(void) </p><p><b>  {</b></p><p>  dsreset();</p><p><b>  delay(1);</b></p><p>  tmpwritebyte(0xcc); // address all drivers on bus

83、</p><p>  tmpwritebyte(0x44); // initiates a single temperature conversion</p><p><b>  }</b></p><p>  /******************************</p><p>  get the tem

84、perature </p><p>  ******************************/</p><p>  uint tmp() </p><p><b>  {</b></p><p><b>  float tt;</b></p><

85、;p>  uchar a,b;</p><p>  dsreset();</p><p><b>  delay(1);</b></p><p>  tmpwritebyte(0xcc);</p><p>  tmpwritebyte(0xbe);</p><p>  a=tmpread()

86、;</p><p>  b=tmpread();</p><p><b>  temp=b;</b></p><p>  temp<<=8; //two byte compose a int variable</p><p>  temp=temp|a;</p><

87、;p>  tt=temp*0.0625;</p><p>  temp=tt*10+0.5;</p><p>  return (temp-200);</p><p><b>  }</b></p><p>  /******************************</p><p>

88、  乙機向甲機發(fā)送程序 </p><p>  ******************************/</p><p>  void com(uchar com)</p><p><b>  {</b></p><p><b>  SBUF=com;</b></p><p

89、>  while(!TI);</p><p><b>  TI=0;</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  uchar temp,a,

90、i;</p><p>  SCON=0x50; //SM0=1,SM1=1,SEN=1</p><p>  TMOD=0X20;//定時器工作于方式一</p><p>  TH1=0XFD;//波特率9600</p><p><b>  TL1=0XFD;</b>

91、;</p><p>  TR1=1;//啟動定時器</p><p>  IE=0X90;//開中斷</p><p>  beep=1;//蜂鳴器初始狀態(tài)不響</p><p><b>  while(1)</b></p><p><b>  { <

92、;/b></p><p>  if(k1==0)//采集當前溫度值并向甲機發(fā)送</p><p><b>  {</b></p><p>  while(k2==1&&k3==1&&k4==1)</p><p><b>  {</b></p>

93、<p>  tmpchange();</p><p><b>  delay(5);</b></p><p>  for(a=10;a>0;a--)</p><p><b>  { </b></p><p>  com(tmp());</p><p>

94、<b>  delay(1);</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  } </p><p>  if(k==2) //接收甲機流水燈指令并用蜂

95、鳴器提示</p><p><b>  {</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  beep=0;</b></p><p>  if(k1==0

96、) //決定接收流水燈指令并關(guān)閉蜂鳴器</p><p><b>  { </b></p><p><b>  beep=1;</b></p><p><b>  break;</b></p><p><b>  }</b></p>

97、<p><b>  }</b></p><p>  while(1) //顯示流水燈現(xiàn)象</p><p><b>  {</b></p><p>  temp=0x7f;</p><p>  P1=temp; </p><p>  for(i=

98、1;i<8;i++) </p><p><b>  {</b></p><p>  a=temp>>i;</p><p><b>  P1=a; </b></p><p>  delay(50);</p><p><b>  }</b&g

99、t;</p><p>  if(k==4) //關(guān)閉所有顯示</p><p><b>  { </b></p><p><b>  P1=0x0ff;</b></p><p><b>  beep=0;</b></p><p>  delay

100、(50);</p><p><b>  beep=1;</b></p><p><b>  break;</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>

101、  }</b></p><p>  if(k==3) //接收甲機搖擺燈指令并用蜂鳴器提示</p><p><b>  {</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p&g

102、t;<b>  beep=0;</b></p><p>  if(k1==0) //決定接收搖擺燈指令并關(guān)閉蜂鳴器</p><p><b>  { </b></p><p><b>  beep=1;</b></p><p><b>  break;</b&g

103、t;</p><p><b>  }</b></p><p><b>  }</b></p><p>  while(1)//顯示搖擺燈現(xiàn)象</p><p><b>  {</b></p><p>  delay(50);</p>&l

104、t;p>  P1=0x55;</p><p>  delay(50);</p><p><b>  P1=0x0aa;</b></p><p>  if(k==4) //關(guān)閉所有顯示</p><p><b>  { </b></p><p><b&g

105、t;  P1=0x0ff;</b></p><p><b>  beep=0;</b></p><p>  delay(50);</p><p><b>  beep=1;</b></p><p><b>  break;</b></p><p&

106、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  

107、/******************************</p><p>  乙機從甲機接收程序 </p><p>  ******************************/</p><p>  void ert()interrupt 4</p><p><b>  {</b></p>&l

108、t;p><b>  RI=0; </b></p><p><b>  k=SBUF;</b></p><p><b>  }</b></p><p>  最后用Proteus畫好原理圖,把編譯好的甲乙機程序HEX文件,下載到原理圖里,點擊運行仿真,查看效果!</p><p&g

109、t;<b>  第三章 調(diào)試與操作</b></p><p><b>  3.1開發(fā)板調(diào)試</b></p><p>  通過Proteus仿真(附錄三)得出甲乙程序在理論上已經(jīng)通過,接下來通過下載軟件STC-ISP把甲乙機程序分別下載到兩塊單片機里,上電調(diào)試。</p><p>  首先進行甲機向乙機發(fā)送數(shù)據(jù),按下流水燈按鈕,

110、這時乙機蜂嚀器發(fā)出聲音提示有數(shù)據(jù)傳送過來,按下乙機接收按鈕,這是可以看到乙機上的八個發(fā)光二極管顯示流水燈的現(xiàn)象(圖9所示)。</p><p><b>  圖9 流水燈現(xiàn)象</b></p><p>  按下甲機上的關(guān)閉所有顯示按鈕,再發(fā)送要搖擺燈按鈕這時乙機蜂嚀器發(fā)出聲音提示有數(shù)據(jù)傳送過來,按下乙機接收按鈕,這是可以看到乙機上的八個發(fā)光二極管顯示搖擺燈的現(xiàn)象(圖10所示

111、)。</p><p><b>  圖10 搖擺燈現(xiàn)象</b></p><p>  甲機向乙機發(fā)送的數(shù)據(jù)可以在乙機上顯示出來的,然后進行乙機向甲機發(fā)送乙機通過DS18B20采集到的溫度值傳輸?shù)郊讬C上顯示。按下乙機發(fā)送溫度值按鈕,這時甲機蜂嚀器發(fā)出聲音提示有數(shù)據(jù)傳送過來,按下甲機接收按鈕,這是可以看到甲機上的數(shù)碼管上顯示溫度值的現(xiàn)象(圖11所示)。</p>

112、<p><b>  圖11 溫度顯示</b></p><p>  這時如果用手觸摸乙機上數(shù)字溫度傳感器DS18B20,可以發(fā)現(xiàn)甲機上的顯示數(shù)字不斷上升,當溫度上升超過程序設(shè)置的31度時,甲機上的蜂嚀器發(fā)出報警信號!并且溫度不斷閃爍。</p><p>  3.2測試結(jié)果與分析</p><p>  通過甲乙相互通信在開發(fā)板上的現(xiàn)象和測量的

113、結(jié)果,可以知道甲乙機程序開發(fā)板上是可行的。甲機傳送的數(shù)據(jù)通過乙機八個發(fā)光二極管顯示,結(jié)果可以看到流水燈和搖擺燈現(xiàn)象;乙機傳送的數(shù)據(jù)通過甲機數(shù)碼管來顯示,結(jié)果可以知道乙機當時采集到的溫度是29.9度。</p><p><b>  第四章 總結(jié)</b></p><p>  一 .設(shè)計中注意事項</p><p>  1.串行通信,使用的晶振是11.0

114、5926MHZ,波特率是9600 兩塊板子要嚴格一致。</p><p>  2.程序下載時通過P3.1(TXD)下載進去的,因此下載時此端口不用被占用。</p><p>  3.雙機通信的基本原理是對RXD和TXD操作,RS23最大通信距離為15m。</p><p>  4.如果之間用三根線 TXD RXD GND連接兩個單片機,這時候的傳輸距離在1m 內(nèi),

115、距離越大干擾越大,因為導線存在電阻。</p><p>  5.由于SBUF是8位的,最大是256,如果乙機直接傳輸必然,甲機顯示的溫度就不是正常的溫度!這時在乙的程序中溫度值減去200,甲的程序加回200就是!</p><p><b>  二.設(shè)計體會和收獲</b></p><p>  最初選擇雙機串行通信這個實驗時,由于從未接觸過這類設(shè)計,感

116、到新鮮的同時不乏挑戰(zhàn)性?,F(xiàn)在終于將它完成了,感到受益頗多。第一,這是一份考驗我們自覺性、動手能力與協(xié)作意識的任務(wù)。在長達二個禮拜的時間里,我們不斷發(fā)現(xiàn)自身不足也不斷自我完善。第二,未知并不可怕,可怕的是因未知而止步。我們在課堂上所學的知識是非常有限的,這次的課程設(shè)計就是個很好的體現(xiàn)。很多函數(shù)的運用我們還沒掌握,一些簡單的循環(huán)語句都可能出錯。實踐后才能真的知道我們真正掌握了多少。第三,團結(jié)就是力量一點都不假,三個臭皮匠頂一個諸葛亮。在團組

117、合作時我們更便于互相取長補短,相互討論,效果很好。</p><p><b>  附錄一 參考文獻</b></p><p>  1《C語言程序設(shè)計》清華大學出版社;譚浩強主編   1999.12</p><p>  2《C語言程序設(shè)計技巧及應(yīng)用》  上??茖W普及出版社;陳進編著 1992

118、.6</p><p>  3《微型計算機原理與應(yīng)用》(第二版)西安電子科技大學出版社;王永山,楊宏五, 楊嬋娟編著 1999.12</p><p>  4《單片機原理及應(yīng)用教程》北京大學出版社;范立南,謝子殿編著 2007.8</p><p>  5.《51單片機C語言應(yīng)用程序設(shè)計實例精講》(第二版)電子工業(yè)出版社;戴佳 戴衛(wèi)恒編著 2

119、008.12 </p><p>  6.《單片機語言C51典型應(yīng)用設(shè)計》 人民郵電出版社;劉文濤編著 2005.10 </p><p>  7.《μVision2單片機應(yīng)用程序開發(fā)指南》科學出版社;尹勇 李宇編著 2005.2 </p><p><b>  附錄二 元器件清單</b></p>&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論