單片機課程設計報告--遠程溫度采集系統(tǒng)_第1頁
已閱讀1頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  單片機原理及應用課程設計</p><p>  學院: 信息電子學院 </p><p>  班級: 08電子信息工程 </p><p>  學號: </p><p>  姓名: </p><p>

2、  指導老師: </p><p>  日期: 2010\01\14 </p><p><b>  任務書</b></p><p><b>  目錄</b></p><p>  1、課程設計目的………………………………………………………………4&

3、lt;/p><p>  2、課程設計工具及題目………………………………………………………4</p><p>  2.1、課程設計工具…………………………………………………...……4</p><p>  2.2、課程設計題目……………………………………………...…………4</p><p>  3、課程設計內(nèi)容、步驟及電路原理圖………………………

4、………………4</p><p>  3.1、課程設計內(nèi)容………………………………………………………..4</p><p>  3.2、課程設計步驟………………………………………………………..4</p><p>  3.3、整個系統(tǒng)的電路原理圖……………………………………………..5</p><p>  4、課程設計各模塊工作原理………………

5、…………………………………5</p><p>  4.1、溫度采集模塊.………………………………………………………...5</p><p>  4.1.1、 LM20經(jīng)AD1674轉換為12位數(shù)據(jù)給從機……………….6</p><p>  4.1.2、從機接收主機發(fā)送的波特率并且設置自己的波特率……....8</p><p>  4.1.3、

6、撥碼開關實現(xiàn)地址的變換…………………………………....8</p><p>  4.1.4、定時器實現(xiàn)5秒間隔…………………………………………8</p><p>  4.1.5、發(fā)送溫度和地址,及其通信協(xié)議……………………………9</p><p>  4.2、溫度接收模塊……………………………………………………….10</p><p>  4

7、.2.1、波特率設定及發(fā)送…………………………………………...11</p><p>  4.2.2、波特率顯示并且延時3s……………………………………...11</p><p>  4.2.3、溫度、地址的接收和判斷……………………………………11</p><p>  4.2.4、數(shù)碼管顯示…….……………………………………………...12</p>

8、<p>  4.2.5、系統(tǒng)報警………………………………………………………12</p><p>  5、課程設計成果………………………………………………………………13</p><p>  5.1、顯示波特率…………………………………………………………..13</p><p>  5.2、顯示溫度與地址……………………………………………………..14<

9、;/p><p>  5.3、改變溫度地址后重新顯示…………………………………………..14</p><p>  5.4、報警…………………………………………………………………..14</p><p>  6、課程設計心得……………………………………………………………....15</p><p>  7、參考文獻………………………………………………

10、…………………....16</p><p>  8、附錄:源程序代碼及注釋…………………………………………………17</p><p>  8.1、從機源代碼…………………………………………………………..17</p><p>  8.2、主機源代碼…………………………………………………………..20</p><p>  課程設計目的:單片機具

11、有體積小、功能強、成本低、應用面廣等優(yōu)點,可以說,智能控制與自動控制的核心就是單片機。目前,一個學習與應用單片機的高潮在全社會大規(guī)模地興起。學習單片機的最有效方法就是理論與實踐并重。系統(tǒng)地運用已學的理論知識解決實際問題的能力和查閱資料的能力。培養(yǎng)一定的自學能力和獨立分析問題、解決問題的能力,能通過獨立思考、查閱工具書、參考文獻,尋找解決方案;</p><p>  課程設計工具及題目: </p>&l

12、t;p>  1、課程設計工具:PC機、Keil uVision4、Protues7.64</p><p>  2、課程設計題目:遠程溫度采集系統(tǒng)</p><p><b>  課程設計內(nèi)容及步驟</b></p><p>  使用proteus作為開發(fā)工具,完成雙機通訊的溫度采集功能:</p><p>  使用LM20

13、溫度傳感器、AD1674模數(shù)轉換器、AT89C51單片機、4位撥碼開關組成溫度采集模塊(從機),撥碼開關用于設定模塊的地址(00-15),從機在采集完溫度信號(間隔5S)后通過串口發(fā)送到主機;</p><p>  使用AT89C51單片機、4位撥碼開關、LED顯示組成溫度接收模塊(主機),4位撥碼開關用于設定通訊波特率(1200,2400,4800,9600)當主機波特率改變后,從機波特率也自動改變,上電運行顯示

14、波特率信息(停3S),之后顯示接收地址與溫度信息,當接收時間間隔超過6S未收到數(shù)據(jù),系統(tǒng)報警;</p><p>  單片機一次只能發(fā)送一個字節(jié)的信息,使用多字節(jié)數(shù)據(jù)組成一幀數(shù)據(jù),自定義一套通信協(xié)議來完成一、二的功能;</p><p><b>  擴展要求:</b></p><p>  將雙機通信改成多機通訊(一個接收器,多個發(fā)送器)</p

15、><p>  各功能模塊的工作原理:</p><p><b>  溫度采集模塊</b></p><p>  使用LM20溫度傳感器、AD1674模數(shù)轉換器、AT89C51單片機、4位撥碼開關組成溫度采集模塊(從機),撥碼開關用于設定模塊的地址(00-15),從機在采集完溫度信號(間隔5S)后通過串口發(fā)送到主機;</p><p&g

16、t;  (1)LM20經(jīng)AD1674轉換為12位數(shù)據(jù)給從機</p><p>  LM20溫度傳感器經(jīng)過電壓跟隨器后輸入到AD1674的10VIN口,AD1674組成雙峰。STS、CS、A0、CE、RC分別接到從機的P0-P4口實現(xiàn)AD1674的控制作用。一開始CE=1,CS=0,RC=0,A0=0啟動12位溫度轉換,然后等待數(shù)據(jù)采集結束while(STS==1); 接著CE=1,CS=0,RC=1,12/8=1,

17、A0=0允許高八位數(shù)據(jù)并行輸出,最后CE=1,CS=0,RC=1,12/8=0,A0=1允許低四位數(shù)據(jù)并行輸出。讀出的12位數(shù)據(jù)存放在變量temp中。經(jīng)過AD1674轉換后輸出的結果精確到(10.0/4095.0)。若LM20溫度轉換為電壓值是1.13598v時,經(jīng)過AD1674轉換后輸出的12位數(shù)為1.13598*4095/10=465轉換為2進制為000111010001。12位數(shù)據(jù)經(jīng)過公式轉換T = (1.8525-temp*10

18、/4095.0)*10000/11.79.然后把低位小數(shù)位給temp1,temp就為整數(shù)部分,接著就是等待發(fā)送給主機。</p><p>  /*讀取AD1674轉換結果*/</p><p>  uint AD1674_Read(void)</p><p><b>  {</b></p><p>  uint temp;&

19、lt;/p><p>  uchar temp1,temp2;</p><p><b>  CS = 1;</b></p><p>  CE = 0; //初始化,關閉數(shù)據(jù)采集</p><p><b>  CS = 0; </b></p><p><b>  A0 = 0

20、; </b></p><p><b>  RC = 0; </b></p><p>  CE = 1; //CE=1,CS1=0,RC=0,A0=0啟動12位溫度轉換</p><p><b>  _nop_();</b></p><p>  while(STS==1);//等待數(shù)據(jù)采集結

21、束</p><p>  CE = 0; //芯片使能關閉</p><p><b>  RC = 1; </b></p><p><b>  A0 = 0; </b></p><p>  CE = 1; //CE=1,CS1=0,RC=1,12/8=1,A0=0允許高八位數(shù)據(jù)并行輸出</p>

22、;<p><b>  _nop_();</b></p><p>  temp1 = P0;//讀取轉換結果的高八位</p><p>  CE = 0;//芯片使能關閉</p><p><b>  RC = 1;</b></p><p><b>  A0 = 1; </b

23、></p><p>  CE = 1;//CE=1,CS1=0,RC=1,12/8=0,A0=1允許低四位數(shù)據(jù)并行輸出</p><p><b>  _nop_();</b></p><p>  temp2 = P0;//讀取轉換結果的低四位</p><p>  temp = (temp1<<8)|tem

24、p2;//高位和低位合成實際溫度,temp2為P0口的高四位</p><p>  return (temp>>4);//返回轉換結果,右移四位是因為temp2為P0口的高四位</p><p><b>  }</b></p><p>  (2)從機接收主機發(fā)送的波特率并且設置自己的波特率</p><p>  主

25、機發(fā)送波特率給從機,從機查詢法判斷是否接收到主機發(fā)送的波特率,如果接收到主機發(fā)送的波特率則改變自己的波特率,跳出循環(huán)來實現(xiàn)發(fā)送溫度地址的發(fā)送,否則一直循環(huán)判斷是否接收到主機發(fā)送的波特率。</p><p>  /*查詢法接收波特率*/</p><p><b>  while(1)</b></p><p><b>  {</b>

26、;</p><p>  if(RI == 1)</p><p><b>  {</b></p><p>  temp = SBUF;</p><p>  set_bote(temp);//設置波特率</p><p><b>  break;</b></p>&l

27、t;p><b>  }</b></p><p><b>  }</b></p><p> ?。?)撥碼開關實現(xiàn)地址的變換</p><p>  撥碼開關接從機的P1口,然后改變撥碼開關的值,P1口的數(shù)據(jù)變換,等待傳送給主機。</p><p>  (4)定時器實現(xiàn)5秒間隔</p>&

28、lt;p>  定時器0工作方式1,初值裝(65536-50000)實現(xiàn)50ms的定時,num為定時次數(shù),當num=100時,定時為5s的間隔。</p><p> ?。?)發(fā)送溫度和地址,及其通信協(xié)議</p><p>  由于溫度經(jīng)過轉換后發(fā)送給主機要保留一位小數(shù)的話大于255(即8位),還有溫度有正負要判斷,所以要發(fā)送多次數(shù)據(jù)給主機,主機經(jīng)過判斷才能確認從機發(fā)送的溫度是整數(shù)部分、小數(shù)

29、部分還是地址。</p><p><b>  通信協(xié)議如下:</b></p><p>  因為采集到的溫度有正負,所以定義j表示溫度的正負,j=0表示正,j=1表示負。j = 0;//溫度正負標志位</p><p>  temp = AD1674_Read();//讀取轉換后的12位溫度值</p><p>  te

30、mp = (int)((1.8528-temp*addo)*10000/11.79); //實現(xiàn)實際溫度的轉換其中add=10.0/4095</p><p>  if(temp < 0) {temp = - temp;j = 0x20;} //溫度若為負,則標志位00100000</p><p>  temp2 = temp % 10;//溫度小數(shù)位存放在temp2中</p&

31、gt;<p>  temp = temp / 10;</p><p><b>  小數(shù)部分</b></p><p>  temp2 = temp2+132;//溫度小數(shù)位+132用于接收時的判斷</p><p><b>  溫度正負標志和地址</b></p><p>  temp =

32、P1;</p><p>  temp = temp & 0x0f; //地址為P1口的低4位</p><p>  temp1 = temp1 << 4;</p><p>  temp1 = temp1 | 0xc0; //地址高位置1即11000000用于接收判斷</p><p>  temp = temp | tem

33、p1; </p><p>  temp = temp | j; //正負標志位存于temp中</p><p>  因為溫度值是0-130之間的由于精度在1.41所以是0-132之間。所以溫度值是小于132的。小數(shù)部分是0-9,所以小數(shù)部分+133即133-142之間的。而地址低4位0-15,高位直接置為1100,即大于192。所以主機只要判斷在0-132之間就為溫度的整數(shù)部分,1

34、33-142之間的就為溫度的小數(shù)部分。剩下的就是地址、溫度正負標志位的組合了。</p><p><b>  溫度接收模塊</b></p><p>  使用AT89C51單片機、4位撥碼開關、LED顯示組成溫度接收模塊(主機),4位撥碼開關用于設定通訊波特率(1200,2400,4800,9600)當主機波特率改變后,從機波特率也自動改變,上電運行顯示波特率信息(停3S

35、),之后顯示接收地址與溫度信息,當接收時間間隔超過6S未收到數(shù)據(jù),系統(tǒng)報警;</p><p>  (1)波特率設定及發(fā)送</p><p>  撥碼開關接主機的P1口,用于設定主機的波特率。P1口的數(shù)據(jù)分別為1、2、4、8時的波特率為1200、2400、4800、9600。然后發(fā)送給從機波特率,接著自己的波特率也隨之改變。</p><p> ?。?)波特率顯示并且延時

36、3s</p><p>  由P1口可以得到不同的值,從而用軟件設定波特率(即設定定時器1的初值),不同的值存放在bote[]數(shù)組中用以數(shù)碼管的顯示。定時器T0實現(xiàn)定時功能,初值裝(65536-50000)實現(xiàn)50ms的定時,num為定時次數(shù),當num為60的時候定時到了3s,以后就不用顯示波特率了,所以用m變量為1表示波特率顯示結束,不再顯示波特率。</p><p> ?。?)溫度、地址的

37、接收和判斷</p><p>  溫度地址接收是用串口中斷實現(xiàn)的。RI為1的時候表示一幀數(shù)據(jù)已經(jīng)接收完了,所以就開始判斷是溫度的整數(shù)部分、小數(shù)部分、還是地址和正負標志位組成的數(shù)據(jù)。通信協(xié)議如上:</p><p>  if(temp < 132)// 若所接收到的數(shù)小于132則是溫度正數(shù)部分值</p><p><b>  {</b>

38、</p><p>  HEXTOBCD(temp, aa, cc); //轉換為溫度值</p><p><b>  }</b></p><p>  else if(temp < 143)//若小于143,則為溫度的小數(shù)部分值</p><p><b>  {</b></p>

39、<p>  cc = temp - 132; //小數(shù)部分還原</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {</b></p><p>  bb = temp & 0x0f;

40、 //溫度為低4位</p><p>  disnum[6] = bb / 10; //存于數(shù)組中用于顯示中</p><p>  disnum[7] = bb % 10;</p><p>  aa = temp & 0x20; //溫度正負標志位</p><p>  if(aa == 0) aa = 0;</p>

41、<p>  else aa = 1;</p><p><b>  }</b></p><p> ?。?)數(shù)碼管顯示模塊</p><p>  數(shù)據(jù)存于disnum數(shù)組中,用8位數(shù)碼管來顯示溫度、地址以及波特率。段選接主機的P0口,片選接主機的P2口。一開始顯示波特率,就選中最后4位。</p><p>  然后

42、就是要顯示溫度和地址的信息了。溫度為-55—130所以前面4位顯示溫度后2位顯示地址即:XXX.XC-XX。由于數(shù)碼管是動態(tài)掃描的,所以要一定速度才可以實現(xiàn)視覺殘留。看上去好像是一直點亮一樣的。</p><p>  void display_led()</p><p><b>  {</b></p><p><b>  uchar i

43、;</b></p><p>  for(i = 0; i < 8; i++) </p><p><b>  {</b></p><p>  P2 = disbit[i]; //使用查表法進行位選 </p><p>  if(i != 2)</p><p>  P0 = t

44、able[disnum[i]]; </p><p><b>  else </b></p><p>  P0 = table1[disnum[i]];</p><p>  delay(150); //掃描間隔時間 太長會數(shù)碼管會有閃爍感</p><p><b>  }</b></p&

45、gt;<p><b>  }</b></p><p><b>  (5)系統(tǒng)報警</b></p><p>  定時器0實現(xiàn)定時功能,num1為報警的時間的計算,定時器是實現(xiàn)50ms的,所以要120才能實現(xiàn)6s。num1 = 120,那么判斷一下flag(是否接收到傳送過來的數(shù)據(jù))如果flag = 0;說明沒有接收到采集的數(shù)據(jù),接著就

46、報警,還要把num1和flag重新清0,實現(xiàn)下次的報警功能。 </p><p><b>  {</b></p><p>  m = 0; //波特率顯示結束</p><p>  if(num1 == 120) //若已經(jīng)計時6s</p><p><b>  {</b></p&g

47、t;<p>  if(flag == 0) //若沒有接收到數(shù)據(jù)</p><p><b>  {</b></p><p>  uchar t = 8;</p><p>  while(t--) //報警</p><p><b>  BEEP();</b></p>&l

48、t;p><b>  }</b></p><p><b>  else </b></p><p>  flag = 0; //否則接收到數(shù)據(jù)標志位清0</p><p>  num1 = 0; //計數(shù)次數(shù)清0</p><p><b>  } </b></p>

49、;<p>  display_led();//顯示溫度和地址</p><p><b>  }</b></p><p><b>  課程設計成果</b></p><p><b>  顯示波特率</b></p><p><b>  2、顯示溫度與地址&l

50、t;/b></p><p>  3、改變溫度地址后重新顯示</p><p><b>  4、報警</b></p><p><b>  課程設計心得</b></p><p>  通過本次課程設計我學到了很多很多,雖然一開始的時候已經(jīng)學過了C語言。并且自認為學得不錯。但是到了實際的單片機還是有點區(qū)

51、別的。不是再控制臺下直接運行的,他還有他的一個方式,一個功能來實現(xiàn)的。還好開學的時候學過單片的C語言。并且也買了很好的郭天祥的單片機C語言教程,還買了實際的開發(fā)板來做很多很多的實驗?;旧蠁纹瑱CC語言已經(jīng)入門了。但是那個開發(fā)板是已經(jīng)焊好了的。不知道怎么連AD1674,不知道怎么連數(shù)碼管。用protues仿真也是一開始用那個匯編編的。所以還是要慢慢地學習。</p><p>  第一天、看到題目覺得一片茫然。不知道從

52、何下手。慢慢地一點一點地來。首先是LM20。查看它的功能和作用。知道了他的轉換公式。接著要用單片機采集的話,必須經(jīng)過模數(shù)轉換才可以實現(xiàn)。于是便開始AD1674芯片的學習了。被這個芯片搞得頭都大了?;?天時間總算弄好了采集那個部分。不過只是用了8位采集,還沒有12位的,精度不夠。因為一開始用了12位的一直是出錯的,后來8位居然是對的。就用了8位。</p><p>  第二天、開始了從機采集到的數(shù)據(jù)發(fā)給主機。還得學

53、習下串口怎么發(fā)送,怎么接收,怎么初始化,怎么設定波特率,好多好多問題。迎面而來。此時又找不到任何一個人幫幫忙。于是便自己找資料,看書,圖書館。上網(wǎng)。最后終于興奮地完成了從機發(fā)送采集到的數(shù)據(jù)給主機。</p><p>  第三天、那便是怎么把接收到的數(shù)據(jù)用數(shù)碼管顯示出來,這個倒是很容易。很快地,一個顯示模塊搞定了。此時整個系統(tǒng)基本上已經(jīng)形成了。看著這一天天學到的,遠遠比課堂學到的多多了,所以理論聯(lián)系實際才是最最重要的

54、。接著便是改變地址,改變波特率,報警等等功能。也很快得到了解決。</p><p>  第四天、通過了微機的課程設計,于是便是單片機的了,早上很早就到了,心想得用12位的,于是便開始改了,居然人品爆了,改了以后一次性通過。所有的功能都實現(xiàn)了。真是太開心了。最后便交給老師檢查,通過了。好開心啊!</p><p>  不僅學到了這么多,對于單片機還興趣更加濃厚了。相信再努力點,以后會得到很多很多

55、。</p><p>  此次課程設計,我知道了,做事不能猶豫,不能害怕,遇到困難就想辦法解決。不要總是等著別人去完成,自信的自己才是最最好的。相信自己肯定可以完成一切。可以戰(zhàn)勝困難,最后得到成功!</p><p><b>  參考文獻</b></p><p>  [1] 郭天祥。新概念51單片機C語言教程[M] 2009.12</p>

56、;<p>  附錄:源程序代碼及注釋</p><p><b>  從機代碼:</b></p><p>  #include<reg51.h></p><p>  #include<intrins.h></p><p>  #define uchar unsigned char <

57、;/p><p>  #define uint unsigned int</p><p>  #define addo (10.0/4095.0)//轉換進率,12位精度(2^12-1=4095),滿量程為10V</p><p>  uint num; //計數(shù)次數(shù)</p><p><b>  /*管腳定義*/</b><

58、/p><p>  sbit STS = P2^0;</p><p>  sbit CS = P2^1;</p><p>  sbit A0 = P2^2;</p><p>  sbit CE = P2^3;</p><p>  sbit RC = P2^4;</p><p>  /*毫秒延時函數(shù)*/

59、</p><p>  void delay_ms(uint n)</p><p><b>  {</b></p><p><b>  uint i;</b></p><p>  while(n--)</p><p><b>  {</b></p&g

60、t;<p>  for(i=0;i<110;i++);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*讀取AD1674轉換結果*/</p><p>  uint AD1674_Read(void)</p>&

61、lt;p><b>  {</b></p><p>  uint temp;</p><p>  uchar temp1,temp2;</p><p><b>  CS = 1;</b></p><p>  CE = 0; //初始化,關閉數(shù)據(jù)采集</p><p><

62、;b>  CS = 0; </b></p><p><b>  A0 = 0; </b></p><p><b>  RC = 0; </b></p><p>  CE = 1; //CE=1,CS1=0,RC=0,A0=0啟動12位溫度轉換</p><p><b>  

63、_nop_();</b></p><p>  while(STS==1);//等待數(shù)據(jù)采集結束</p><p>  CE = 0; //芯片使能關閉</p><p><b>  RC = 1; </b></p><p><b>  A0 = 0; </b></p><

64、p>  CE = 1; //CE=1,CS1=0,RC=1,12/8=1,A0=0允許高八位數(shù)據(jù)并行輸出</p><p><b>  _nop_();</b></p><p>  temp1 = P0;//讀取轉換結果的高八位</p><p>  CE = 0;//芯片使能關閉</p><p><b> 

65、 RC = 1;</b></p><p><b>  A0 = 1; </b></p><p>  CE = 1;//CE=1,CS1=0,RC=1,12/8=0,A0=1允許低四位數(shù)據(jù)并行輸出</p><p><b>  _nop_();</b></p><p>  temp2 = P

66、0;//讀取轉換結果的低四位</p><p>  temp = (temp1<<8)|temp2;//高位和低位合成實際溫度,temp2為P0口的高四位</p><p>  return (temp>>4);//返回轉換結果,右移四位是因為temp2為P0口的高四位</p><p><b>  }</b></p&g

67、t;<p><b>  /*數(shù)據(jù)發(fā)送*/</b></p><p>  void putbyte(uchar byte)// 利用硬件串口方式2 發(fā)送一個字節(jié)數(shù)據(jù)</p><p><b>  {</b></p><p>  SBUF = byte;//將要發(fā)送的數(shù)據(jù)送到發(fā)送緩沖區(qū)域,系統(tǒng)自動發(fā)送</p&g

68、t;<p>  while(!TI);//查詢是否發(fā)送結束 當TI=1 代表發(fā)送結束</p><p>  TI = 0;//清發(fā)送結束位方便下一次發(fā)送</p><p><b>  }</b></p><p>  void init()</p><p><b>  {</b><

69、/p><p>  TMOD=0x21;//定時器為方式2</p><p><b>  TL1=0xFD;</b></p><p>  TH1=0xFD;//波特率為9.6K</p><p>  TH0 = (65536 - 50000) / 256; //裝初值實現(xiàn)50ms</p><p>  

70、TL0 = (65526 - 50000) % 256;</p><p>  TR0 = 1; //啟動定時器0</p><p>  TR1 = 1; //啟動定時器1</p><p>  ET0 = 1; //開定時器0</p><p>  SM0 = 0; //方式2<

71、/p><p><b>  SM1 = 1;</b></p><p><b>  RI = 0;</b></p><p><b>  TI = 0;</b></p><p><b>  REN = 1;</b></p><p>  EA

72、= 1; //開總中斷</p><p>  ES = 1; //開串口中斷 </p><p><b>  }</b></p><p><b>  //設置波特率</b></p><p>  void set_bote(uchar temp)</p><p>

73、;<b>  {</b></p><p>  if(temp==1)</p><p><b>  {</b></p><p><b>  TL1=0xE8;</b></p><p>  TH1=0xE8;//波特率為1.2k</p><p><b&

74、gt;  }</b></p><p>  else if(temp==2)</p><p><b>  {</b></p><p><b>  TL1=0xF4;</b></p><p>  TH1=0xF4;//波特率為2.4K</p><p><b>

75、;  }</b></p><p>  else if(temp==4)</p><p><b>  {</b></p><p><b>  TL1=0xFA;</b></p><p>  TH1=0xFA;//波特率為4.8K</p><p><b> 

76、 }</b></p><p>  else if(temp==8)</p><p><b>  {</b></p><p><b>  TL1=0xFD;</b></p><p>  TH1=0xFD;//波特率為9.6K</p><p><b>  }

77、</b></p><p><b>  }</b></p><p><b>  /*主函數(shù)*/</b></p><p>  void main(void)</p><p><b>  {</b></p><p>  int temp,temp

78、1; </p><p>  uchar a, temp2;</p><p><b>  uchar j; </b></p><p><b>  init();</b></p><p>  /*查詢法接收波特率*/</p><p><b>  while(1)<

79、/b></p><p><b>  {</b></p><p>  if(RI == 1)</p><p><b>  {</b></p><p>  temp = SBUF;</p><p>  set_bote(temp);//設置波特率</p>&l

80、t;p><b>  break;</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  while(1) </p><p><b>  {</b></p><p> 

81、 while(num==100); //num計數(shù)100實現(xiàn)5秒的延時</p><p><b>  num = 0;</b></p><p>  j = 0;//溫度正負標志位</p><p>  temp = AD1674_Read();//讀取轉換后的12位溫度值</p><p>  temp = (in

82、t)((1.8528-temp*addo)*10000/11.79); //實現(xiàn)實際溫度的轉換</p><p>  if(temp < 0) {temp = - temp;j = 0x20;} //溫度若為負,則標志位00100000</p><p>  temp2 = temp % 10;//溫度小數(shù)位存放在temp2中</p><p>  temp =

83、temp / 10;</p><p>  a = (uchar)temp; </p><p>  putbyte(a); //發(fā)送溫度</p><p>  delay_ms(10);//延時一段時間</p><p>  temp2 = temp2+132;//溫度小數(shù)位+132用于接收時的判斷</p><p>  pu

84、tbyte(temp2);</p><p>  delay_ms(10); //發(fā)送溫度小數(shù)位</p><p>  temp = P1;</p><p>  temp = temp & 0x0f; //地址為P1口的低4位</p><p>  temp1 = temp1 << 4;</p><p

85、>  temp1 = temp1 | 0xc0; //地址高位置1即11000000用于接收判斷</p><p>  temp = temp | temp1; </p><p>  temp = temp | j; //正負標志位存于temp中</p><p>  putbyte(temp); //發(fā)送地址</p><p>

86、<b>  }</b></p><p><b>  }</b></p><p>  /*定時器0中斷*/</p><p>  void t0() interrupt 1</p><p><b>  {</b></p><p>  TH0 = (65536

87、 - 50000) / 256;//裝初值50000實現(xiàn)50ms</p><p>  TL0 = (65526 - 50000) % 256;</p><p>  num++; //計數(shù)次數(shù)</p><p><b>  }</b></p><p><b>  主機代碼:</b></

88、p><p>  #include <reg51.h></p><p>  #include <intrins.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  /*數(shù)碼管顯示’

89、0‘-’9‘,‘-’,’C‘無小數(shù)點*/</p><p>  uchar code table[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,</p><p>  0x92, 0x82, 0xf8, 0x80, 0x90,0xbf, 0xc6};</p><p>  /*數(shù)碼管顯示’0‘-’9‘有小數(shù)點*/</p><p>

90、  uchar code table1[]={0x40, 0x79, 0x24, 0x30, 0x19,</p><p>  0x12, 0x02, 0x78, 0x00, 0x10,0x3f};</p><p>  /*位選信號選中數(shù)碼管*/</p><p>  uchar disbit[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x

91、20,0x40,0x80};</p><p>  uchar disnum[8],bote[4];//存放要顯示的數(shù)據(jù)</p><p>  uchar flag, num, num1, m, aa, cc;</p><p>  sbit beep = P1^7; //蜂鳴器報警</p><p>  sbit led = P1^6;//紅燈

92、亮報警</p><p><b>  /*延時子程序*/</b></p><p>  void delay(uint i)</p><p><b>  {</b></p><p><b>  char j;</b></p><p>  for(i; i &

93、gt; 0; i--)</p><p>  for(j = 200; j > 0; j--);</p><p><b>  }</b></p><p>  /*向緩沖器中寫入要顯示的數(shù)據(jù)*/</p><p>  void HEXTOBCD(uint temp, uchar a,uchar cc)</p>

94、<p><b>  {</b></p><p>  temp = temp * 10 + cc;</p><p>  /*若為正數(shù)即0-130*/</p><p>  if(a == 0)</p><p><b>  {</b></p><p>  disnum

95、[0] = temp/1000; //百位</p><p>  disnum[1] = temp%1000/100; //十位</p><p>  disnum[2] = temp%100/10; //各位</p><p>  disnum[3] = temp%10; //小數(shù)位</p><p>  disnum[4] = 1

96、1; //顯示C</p><p>  disnum[5] = 10; //顯示-</p><p><b>  } </b></p><p>  /*若為負數(shù)即-55-0*/</p><p>  else if (a == 1) </p><p><b>  {<

97、/b></p><p>  disnum[0] = 10; //顯示-</p><p>  disnum[1] = temp/100; //十位</p><p>  disnum[2] = temp%100/10; //個位</p><p>  disnum[3] = temp%10; //小數(shù)位</p&

98、gt;<p>  disnum[4] = 11; //顯示C</p><p>  disnum[5] = 10; //顯示-</p><p><b>  }</b></p><p><b>  }</b></p><p>  void init()</p>

99、;<p><b>  {</b></p><p>  SCON = 0x50; </p><p>  TMOD=0x21;//定時器為方式2</p><p><b>  TL1=0xFD;</b></p><p>  TH1=0xFD;//波特率為9.6K</p><

100、;p>  TH0 = (65536 - 50000) / 256; //裝初值實現(xiàn)50ms</p><p>  TL0 = (65526 - 50000) % 256;</p><p>  TR0 = 1; //開定時器0</p><p>  TR1 = 1; //開定時器1</p><p>  ET0 = 1;

101、 //開定時器0</p><p>  REN= 1; //允許接收</p><p>  SM0 = 0; //方式2</p><p><b>  SM1 = 1;</b></p><p>  EA = 1; //開總中斷</p><p>  ES = 1;

102、 //開串口中斷</p><p><b>  }</b></p><p><b>  /*數(shù)據(jù)發(fā)送*/</b></p><p>  void putbyte(uchar byte)// 利用硬件串口方式2 發(fā)送一個字節(jié)數(shù)據(jù)</p><p><b>  {</b></p&

103、gt;<p>  SBUF = byte;//將要發(fā)送的數(shù)據(jù)送到發(fā)送緩沖區(qū)域,系統(tǒng)自動發(fā)送</p><p>  while(!TI);//查詢是否發(fā)送結束 當TI=1 代表發(fā)送結束</p><p>  TI = 0;//清發(fā)送結束位方便下一次發(fā)送</p><p><b>  }</b></p><p>

104、  /*設置波特率 */</p><p>  void set_bote()</p><p><b>  {</b></p><p>  uint temp=P1;</p><p>  temp=temp&0x0f;</p><p>  putbyte(temp);</p>

105、<p>  if(temp==1)</p><p><b>  {</b></p><p><b>  TL1=0xE8;</b></p><p>  TH1=0xE8;//波特率為1.2K</p><p><b>  }</b></p><p&g

106、t;  else if(temp==2)</p><p><b>  {</b></p><p><b>  TL1=0xF4;</b></p><p>  TH1=0xF4;//波特率為2.4K</p><p><b>  }</b></p><p>

107、  else if(temp==4)</p><p><b>  {</b></p><p><b>  TL1=0xFA;</b></p><p>  TH1=0xFA;//波特率為4.8K</p><p><b>  }</b></p><p>  

108、else if(temp==8)</p><p><b>  {</b></p><p><b>  TL1=0xFD;</b></p><p>  TH1=0xFD;//波特率為9.6K</p><p><b>  }</b></p><p><

109、b>  }</b></p><p>  void display_led()</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  for(i = 0; i < 8; i++) </p><p&g

110、t;<b>  {</b></p><p>  P2 = disbit[i]; //使用查表法進行位選 </p><p>  if(i != 2)</p><p>  P0 = table[disnum[i]]; </p><p><b>  else </b></p>&l

111、t;p>  P0 = table1[disnum[i]];</p><p>  delay(150); //掃描間隔時間 太長會數(shù)碼管會有閃爍感</p><p><b>  }</b></p><p><b>  }</b></p><p>  void BEEP()</p>

112、;<p><b>  {</b></p><p>  uchar i , j;</p><p><b>  led = 1;</b></p><p>  for (i = 0; i < 100; i++)</p><p><b>  { </b></

113、p><p>  beep = !beep; //beep取反</p><p>  for(j = 0; j < 250 ; j++) //需要產(chǎn)生方波</p><p><b>  _nop_();</b></p><p><b>  } </b></p&g

114、t;<p>  beep = 1; //關閉蜂鳴器</p><p><b>  }</b></p><p>  void main(void)</p><p><b>  {</b></p><p><b>  uchar i;<

115、;/b></p><p>  init(); //初始化</p><p>  set_bote(); //設置波特率并且發(fā)送給從機</p><p>  num = 0; //計數(shù)次數(shù)清0</p><p>  num1 = 0; //報警計數(shù)次數(shù)清0</p><p>  m

116、 = 1; //波特率顯示結束標志</p><p>  flag = 1; //是否接收到從機發(fā)送的數(shù)據(jù)標志</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  led = 0;</p><p

117、>  if(num <= 60 && m == 1)</p><p><b>  {</b></p><p>  uchar temp = P1 & 0x0f; </p><p>  if(temp==1) //顯示波特率1200</p><p><b>  {<

118、/b></p><p>  bote[0] = 1;bote[1] = 2;bote[2] = 0;bote[3] = 0;</p><p><b>  }</b></p><p>  else if(temp==2) //顯示波特率2400</p><p><b>  {</b></p

119、><p>  bote[0] = 2;bote[1] = 4;bote[2] = 0;bote[3] = 0;</p><p><b>  }</b></p><p>  else if(temp==4) //顯示波特率4800</p><p><b>  {</b></p><p

120、>  bote[0] = 4;bote[1] = 8;bote[2] = 0;bote[3] = 0;</p><p><b>  } </b></p><p>  else if(temp==8) //顯示波特率9600</p><p><b>  {</b></p><p> 

121、 bote[0] = 9;bote[1] = 6;bote[2] = 0;bote[3] = 0;</p><p><b>  }</b></p><p>  for(i = 0; i < 4; i++) </p><p><b>  {</b></p><p>  P2 = disbit[

122、i+4];//使用查表法進行位選 </p><p>  P0 = table[bote[i]]; </p><p>  delay(150); //掃描間隔時間 太長會數(shù)碼管會有閃爍感</p><p><b>  }</b></p><p><b>  } </b></p

123、><p><b>  else </b></p><p><b>  {</b></p><p>  m = 0; //波特率顯示結束</p><p>  if(num1 == 120) //若已經(jīng)計時6s</p><p><b>  {</b&g

124、t;</p><p>  if(flag == 0) //若沒有接收到數(shù)據(jù)</p><p><b>  {</b></p><p>  uchar t = 8;</p><p>  while(t--) //報警</p><p><b>  BEEP();</b><

125、/p><p><b>  }</b></p><p><b>  else </b></p><p>  flag = 0; //否則接收到數(shù)據(jù)標志位清0</p><p>  num1 = 0; //計數(shù)次數(shù)清0</p><p><b>  } </b>

126、;</p><p>  display_led();//顯示溫度和地址</p><p><b>  } </b></p><p><b>  } </b></p><p><b>  }</b></p><p>  void t0() inte

127、rrupt 1</p><p><b>  {</b></p><p>  TH0 = (65536 - 50000) / 256; //裝初值實現(xiàn)50ms </p><p>  TL0 = (65526 - 50000) % 256;</p><p><b>  num++;</b></p&

128、gt;<p><b>  num1++;</b></p><p><b>  }</b></p><p>  void recieve() interrupt 4</p><p><b>  {</b></p><p>  uchar temp, bb;</

129、p><p>  if(RI) //RI=1,表示一楨數(shù)據(jù)接收完</p><p><b>  {</b></p><p>  flag = 1; </p><p>  temp = SBUF;</p><p>  if(temp <

130、; 132)// 若所接收到的數(shù)小于132則是溫度正數(shù)部分值</p><p><b>  {</b></p><p>  HEXTOBCD(temp, aa, cc); //轉換為溫度值</p><p><b>  }</b></p><p>  else if(temp < 1

131、43)//若小于143,則為溫度的小數(shù)部分值</p><p><b>  {</b></p><p>  cc = temp - 132; //小數(shù)部分還原</p><p><b>  } </b></p><p><b>  else </b></p>

132、<p><b>  {</b></p><p>  bb = temp & 0x0f; //溫度為低4位</p><p>  disnum[6] = bb / 10; //存于顯示中</p><p>  disnum[7] = bb % 10;</p><p>  aa = temp &a

133、mp; 0x20; //溫度正負標志位</p><p>  if(aa == 0) aa = 0;</p><p>  else aa = 1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  RI=0; //RI清0

溫馨提示

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

評論

0/150

提交評論