久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5502|回復: 0
收起左側

單片機測溫系統設計報告 含上位機與下位機程序與實物制作

[復制鏈接]
ID:232645 發表于 2017-9-12 18:41 | 顯示全部樓層 |閱讀模式
單片機接口設計報告
——測溫系統設計

姓名安潔
學號201*815
班級試1504班     
時間2017/6/29 ~ 2017/7/8  

目錄
一、 設計內容與要求
二、 設計方案
三、 方案實現
3.1系統的軟件設計
1、 主程序
2、 AD轉換程序
3、 溫度顯示程序
4、 步進電機控制程序
5、 中斷系統程序
3.2系統的硬件設計
1、 時鐘電路
2、 復位電路
3、 AD轉換
4、 步進電機
5、 數碼顯示
6、 串口通信
7、 完整原理圖
四、 系統調試
1、功能子程序的調試
2、程序流程的調試
3、程序的通調
五、 結論
參考文獻
附錄

1、設計內容與要求

1、通過按鍵設置溫度上、下限,基準溫度20℃,AD信號的0V~5V對應-20℃~70℃。

2、讀入A/D轉換數據,若數據<=下限,則顯示溫度、溫度調節范圍并顯示L,并使步進電機正轉,若數據>上限,則顯示溫度、溫度調節范圍并顯示H,并使步進電機反轉,下限<若數據<=上限,則顯示溫度、溫度調節范圍并顯示C,步進電機不轉動。

3、本機地址為08H,當接到上位機發的08H(P1.0口接開關,高電平發送)時,則回發08H,且本機P1.4口輸出高電平,上位機接受后P1.3口輸出高電平。

當接到上位機發的AAH(P1.1口接開關,高電平發送)時,則將當前溫度發給上位機,且本機P1.5口輸出高電平,上位機數碼管顯示溫度。

當收到上位機發的55H(P1.2口接開關,高電平發送)時,下位機修改設定上、下限,且本機P1.6口輸出高電平,數碼管全部顯示0。

當收到上位機發送的信號不是上面三個時,本機P1.7口輸出高電平,數碼管全部顯示0。

2、設計方案

本設計采用AT89C51單片機實現。單片機軟件編程的自由度大,可通過編程實現各種各樣的算術算法和邏輯控制,而且體積小,硬件實現簡單,安裝方便,可以與PC機進行通信。

本設計利用單片機最小系統和ADC0809芯片、電位計設計溫度采集系統。并設計一個人機接口電路:鍵盤采用獨立式按鍵(功能是調節溫度的上下限),同時設計了步進電機控制電路,顯示器采用共陰極LED顯示。系統的總體設計方案框圖如圖1所示:

圖1

按照系統設計功能的要求,系統主要由單片機、ADC0809芯片、電位器、步進電機、LED數碼顯示管和PC機等組成,如圖2所示:

圖2

系統的硬件電路主要由復位電路、顯示電路、AD轉換電路、步進電路控制電路、晶振電路組成,系統總體結構方框圖如圖3所示:

圖3

3、方案實現3.1系統的軟件設計

本系統的軟件設計主要可分為主程序,AD轉換程序,溫度顯示程序,步進電機控制程序,中斷系統程序等幾個模塊。

1、主程序

⑴功能

主程序的主要功能是負責讀取當前溫度,并進行判斷,從而實時顯示溫度并根據判斷結果控制步進電機的工作。

⑵程序流程圖

如圖4所示:

圖4

2、AD轉換程序

⑴功能

AD轉換程序分為AD采樣程序和采樣溫度轉換程序兩部分。其中,AD采樣程序的功能是啟動AD轉換并在100μs的延時后得到AD采樣值;采樣溫度轉換程序的功能是得到16次AD采樣值,然后取平均值,得到平均AD采樣值,并通過公式將平均AD采樣值轉換為實際溫度。

⑵程序流程圖

如圖5所示:

圖5

3、溫度顯示程序

⑴功能

溫度顯示程序分為數碼管溫度顯示程序和顯示數據刷新程序。數碼管溫度顯示程序的功能是將數碼管需要顯示的溫度與溫度上下限進行比較,并送入相應的段碼,讓數碼管顯示溫度的正負(若為正顯示0,若為負顯示負號)、當前溫度、溫度狀態(L、C、H)以及溫度上下限的范圍;顯示數據刷新程序的功能是利用定時器T0,定時1ms,每隔1ms從右到左依次點亮數碼管,并進行循環,數碼管能夠進行動態、平穩的顯示。

⑵程序流程圖

如圖6所示:

圖6

4、步進電機控制程序

⑴功能

步進電機控制程序的功能是通過判斷步進電機工作方式控制位,控制步進電機的正轉以及反轉。

⑵程序流程圖

如圖7所示:

圖7

5、中斷系統程序

⑴功能

中斷系統程序分為溫度上下限設定程序和串口通信程序。溫度上下設定程序的功能是通過兩個外部中斷程序,采用下降沿觸發方式并設置兩個按鍵來設定上下限;串口通信程序的功能是通過串口中斷,并選擇串行口方式2的工作方式,進行數據的接受和發送。

⑵程序流程圖

如圖8所示:

圖8

3.2系統的硬件設計

本系統的硬件設計主要可分為時鐘電路、復位電路、AD轉換、步進電機、數碼顯示及串口通信等幾個模塊。

1、時鐘電路

如圖9:

圖9

2、復位電路

如圖10:

圖10

3、AD轉換

如圖11:

圖11

4、步進電機

如圖12:

圖12

5、數碼顯示

如圖13:

圖13

6、串口通信

如圖14:

圖14

7、完整原理圖

如圖15:

圖15

4、系統調試

系統的軟件調試借助于Lab6000通用微控制器實驗系統。在進行系統軟件的連續調試之前要先進行軟件的初調,就是要使各個子程序模塊運行正確,程序的運行流程正確。軟件調試主要分以下幾個步驟進行:

1、功能子程序的調試

功能子程序的調試包括AD轉換、溫度顯示以及步進電機控制等子程序的調試。在調試功能子程序時,許多參數都是未知的,要根據其所需的條件,給出假定的數據,使其運行,如果能完成預定的處理功能或與手工計算的結果相符,就說明該子程序己調試通過。調試時由小到大,由里到外。例如,調試溫度顯示子程序時,先調通其需要的AD轉換子程序和參數處理子程序,然后將它們連起來進行通調。通調時,也是假定一些數據、參數和初始條件,然后運行程序。當運算結果與手工計算的結果相同時,該算法子程序則調試完成,反之,就要進行相應的修改。其它子程序的調試同理。

2、程序流程的調試

程序流程的調試主要是查看程序運行的步驟是否正確,在某時刻程序運行所處的位置是否正確,是否能正確運行各個中斷服務程序。在調試過程中,在各個中斷服務子程序設置斷點,然后運行程序,查看程序是否能運行到所有的斷點,若所有斷點都能運行到,則程序流程基本正確。

3、程序的通調

在完成整個程序流程的調試后,運行程序,進行程序的通調,通過器件的現象來判斷程序的正確性。若不正確則設置斷點檢查錯誤。

如圖16為上位機調試實物圖:

圖16

如圖17為下位機調試實物圖:

圖17

5、結論

本次測溫系統設計主要由AT89C51和ADC0809來實現功能。因此需要通過查閱資料來了解這些器件的基本結構,主要功能和注意事項等等。

整個設計從確定題目,到尋找相關資料,再到選擇合適的器件,接著對電路圖的繪制,程序的編寫,最終調試。一步步走過來,一點點的進步,花了大量的時間和精力,而成果也是喜人的。

通過這次設計,不僅鍛煉自己分析問題、處理問題的能力,還提高了自己的動手能力。在以后的學習中,要理論聯系實際,把我們所學的理論知識用到實際當中,學習單片機更是如此,程序只有在經常的寫與讀的過程中才能提高,這是我在這次課程設計中的最大收獲。但同時也發現了自己的不足,特別是在程序的編寫方面,有些細節部分沒有考慮到,比如開始沒有考慮到雙機通信時獨立運行的問題,這樣編出的程序運行起來效率會大大降低,沒有實用性,但在不斷的改進中,最終解決了這個問題;但在上位機實現對下位機的溫度調控這一設計中,沒有設計好,未能實現遠距離溫度控制,自己程序方面還有待加強。

總的來說,自己從此課程設計收獲了很多,一個設計的完成需要團隊間的密切合作,而且需要提升自己的自學能力,腳踏實地。通過這次設計,相信自己在未來的學習和生活中會繼續努力,提升自己的知識水平,不斷完善自我。

參考文獻

[1]《單片機原理與應用設計》第二版.張毅剛主編.電子工業出版社

[2]《Altium Designer電路設計標準教程》程曉鴿編著.科學出版社

附錄

上位機程序

  1. #include<reg51.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define LEDLen 6
  5. uchar send,p,t,Pos;
  6. char receive;
  7. sbit P1_0=P1^0;                                                                                                         //P1.0口為高電平,發送0x08
  8. sbit P1_1=P1^1;                                                                                                         //P1.1口為高電平,發送0xaa
  9. sbit P1_2=P1^2;                                                                                                         //P1.2口為高電平,發送0x55
  10. Uchar code LEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                                                                                                                                                                                                                                                //共陰極數碼管段碼表
  11. xdata unsigned char OUTBIT _at_ 0x8002;                                  //位選線地址
  12. xdata unsigned char OUTSEG _at_ 0x8004;                                //段選線地址
  13. uchar LEDBuf[LEDLen];                        //顯示緩存
  14. void DisplayLED();                                                                                 //數碼管顯示函數
  15. void main()
  16. {
  17.   EA=1;
  18.   ET0=1;
  19.   TMOD=0x21;
  20.   TH1=0xfa;                                                                                                               //波特率2400
  21.   TL1=0xfa;
  22.   TR1=1;
  23.   TR0=1;                                                                                        //定時器T0開啟
  24.   TH0=0xfe;                                                                                     //定時器T1賦初值,1ms
  25.   TL0=0x0c;
  26.   IP=0;                                                                                        //設置各個中斷均為低優先級
  27.   SCON=0x50;
  28.   PCON=0x00;
  29.   P1=0xf7;
  30.   while(1)
  31.   {
  32.     if(P1_0==1)
  33.       send=0x08;
  34.     if(P1_1==1)
  35.       send=0xaa;
  36.     if(P1_2==1)
  37.       send=0x55;
  38.     SBUF=send;
  39.     while(TI==0);
  40.     TI=0;
  41.     while(RI==0);
  42.     RI=0;
  43.     receive=SBUF;
  44.     if(receive==0x08)
  45.       P1=0x0f;
  46.     if(receive!=0x08)
  47.     {
  48.       P1=0x07;
  49.       DisplayLED();
  50.      }
  51.    }
  52. }
  53. void timer0() interrupt 1
  54. {
  55.   TH0=0xfe;
  56.   TL0=0x0c;
  57.   if(t==0)
  58.     Pos=0x20;
  59.   OUTBIT=0;                                                                                                                                         //關所有數碼管
  60.   OUTSEG=LEDBuf[t];                                                                                                                                 //送段碼
  61.   OUTBIT=Pos;                                                                                                                                       //選中一位數碼管
  62.   Pos>>=1;                                                                                                                                           //顯示下一位
  63.   t++;
  64.   if(t==6)
  65.     t=0;
  66. }
  67. void DisplayLED()                                                                                                                       //數碼管溫度顯示函數
  68. {
  69.   if(receive<0)
  70.     LEDBuf[0]=0x40;                                                                        //溫度低于零攝氏度高位顯示負號
  71.   if(receive>=0)
  72.     LEDBuf[0]=LEDMAP[0];                   //溫度高于零攝氏度高位顯示零
  73.   if(receive<0)
  74.     receive=-receive;
  75.   LEDBuf[1]=LEDMAP[receive/10];                                                                                      //數碼管顯示溫度
  76.   LEDBuf[2]=LEDMAP[receive%10];
  77.   LEDBuf[3]=0x3f;
  78.   LEDBuf[4]=0x3f;
  79.   LEDBuf[5]=0x3f;
  80. }
復制代碼


下位機程序:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define out P1                                        //步進電機脈沖控制輸出口
  4. #define LEDLen 6
  5. #define LowTemp (-20)                    // A/D 0
  6. #define HighTemp  70                    // A/D 255
  7. xdata unsigned char OUTBIT _at_ 0x8002;    //位選線地址
  8. xdata unsigned char OUTSEG _at_ 0x8004;   //段選線地址
  9. xdata unsigned char ADPort _at_ 0x9000;     //AD轉化地址
  10. uchar code LEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
  11. //共陰極數碼管段碼表
  12. Uchar code turns[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};                                                                                                                                                                                                    //步進電機正轉相序表
  13. uchar code turnd[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};                                                                                                                                                                                                    //步進電機反轉相序表
  14. uchar LEDBuf[LEDLen];                                                                //顯示緩存
  15. signed char CurTemp;                                                                               //定義當前溫度
  16. signed char r;                                                                                     //數碼管顯示溫度
  17. char send;
  18. uchar receive,t,p,Pos;
  19. signed char tl,th,tw;
  20. signed char tb=20;                                                     //初始化標準溫度為20攝氏度
  21. uchar m=0;                                               //初始化設置溫上線按鍵次數為0
  22. uchar n=0;                                               //初始化設置溫下線按鍵次數為0
  23. uchar mode;                                              //步進電機正反轉工作方式控制位
  24. void DisplayLED();                                       //數碼管顯示函數
  25. unsigned char ReadAD();                                                //A/D采樣程序
  26. void ReadTemp();                                         //采樣溫度讀取
  27. void Motorcontrol();                                                   //步進電機控制程序
  28. void Delay(uchar CNT)
  29. {
  30.   uchar i;
  31.   while(CNT--!=0)
  32.     for(i=100;i!=0;i--);
  33. }
  34. void main()
  35. {
  36.   EA=1;
  37.   ES=1;                                                           //總中斷允許
  38.   EX0=1;                                                            //外部中斷0允許
  39.   EX1=1;                                                            //外部中斷1允許
  40.   ET0=1;                                                            //定時器T0中斷允許
  41.   TMOD=0x21;                                          //定時器T0工作在方式1
  42.   IT0=1;                                                            //選擇外中斷0為跳沿觸發
  43.   IT1=1;                                                            //選擇外中斷1為跳沿觸發
  44.   TR0=1;                                                            //定時器T0開啟
  45.   TR1=1;
  46.   TH0=0xfe;                                                         //定時器T0賦初值,1ms
  47.   TL0=0x0c;
  48.   TH1=0xfa;                                                         //波特率2400
  49.   TL1=0xfa;
  50.   SCON=0x50;
  51.   PCON=0x00;
  52.   IP=0;                                                             //設置各個中斷均為低優先級
  53.   P1=0x00;
  54.   while(1)
  55.   {
  56.     th=tb+m;                                                        //溫上線
  57.     tl=tb-n;                                                        //溫下線
  58.     tw=th-tl;
  59.     ReadTemp();                                                    //讀取當前溫度
  60.     r=CurTemp;
  61.     if(r<=tl)                                                                     //溫度低于下線溫度
  62.     {
  63.       DisplayLED();
  64.       mode=1;
  65.       Motorcontrol();
  66.      }
  67.     if((r>tl)&&(r<=th))
  68.       DisplayLED();
  69.     if(r>th)
  70.     {
  71.       DisplayLED();
  72.       mode=2;
  73.       Motorcontrol();
  74.      }
  75.    }
  76. }
  77. void timer0() interrupt 1
  78. {
  79.   TH0=0xfe;
  80.   TL0=0x0c;
  81.   if(t==0)
  82.     Pos=0x20;
  83.   OUTBIT=0;                                                                                                             //關所有數碼管
  84.   OUTSEG=LEDBuf[t];                                                                                                     //送段碼
  85.   OUTBIT=Pos;                                                                                                           //選中一位數碼管
  86.   Pos>>=1;                                                                                                              //顯示下一位
  87.   t++;
  88.   if(t==6)
  89.     t=0;
  90. }
  91. void int0() interrupt 0                                                                                                      //外部中斷0程序
  92. {
  93.   m++;                                                                                                        //溫上線按鍵次數
  94. }
  95. void int1() interrupt 2                                                                                                      //外部中斷1程序
  96. {
  97.   n++;                                                                                                         //溫下線按鍵次數
  98. }
  99. void Port() interrupt 4
  100. {
  101.   ES=0;
  102.   if(TI==1)
  103.     TI=0;
  104.   if(RI==1)
  105.   {
  106.     receive=SBUF;
  107.     RI=0;
  108.     if(receive==0x08)
  109.     {
  110.       send=receive;
  111.       P1=0x10;
  112.      }
  113.     if(receive==0xaa)
  114.     {
  115.       send=CurTemp;
  116.       P1=0x20;
  117.      }
  118.     if(receive==0x55)
  119.     {
  120.       send=0;
  121.       P1=0x40;
  122.      }
  123.     if((receive!=0x08)&&(receive!=0xaa)&&(receive!=0x55))
  124.     {
  125.       send=0;
  126.       P1=0x80;
  127.      }
  128.    }
  129.   SBUF=send;
  130.   ES=1;
  131. }
  132. void DisplayLED()                                                               //數碼管溫度顯示函數
  133. {
  134.   if(r<=tl)                                                                     //溫度低于下線溫度
  135.   {
  136.     if(r<0)
  137.       LEDBuf[0]=0x40;                                                           //溫度低于零攝氏度高位顯示負號
  138.     if(r>=0)
  139.       LEDBuf[0]=LEDMAP[0];     //溫度高于零攝氏度高位顯示零
  140.     if(r<0)
  141.       r=-r;
  142.     LEDBuf[1]=LEDMAP[r/10];    //數碼管顯示溫度及L
  143.     LEDBuf[2]=LEDMAP[r%10];
  144.     LEDBuf[3]=0x38;
  145.     LEDBuf[4]=LEDMAP[tw/10];
  146.     LEDBuf[5]=LEDMAP[tw%10];
  147.    }
  148.   if((r>tl)&&(r<=th))
  149.     {
  150.       if(r<0)
  151.         LEDBuf[0]=0x40;                                             //溫度低于零攝氏度高位顯示負號
  152.       if(r>=0)
  153.         LEDBuf[0]=LEDMAP[0];   //溫度高于零攝氏度高位顯示零
  154.       if(r<0)
  155.         r=-r;
  156.       LEDBuf[1]=LEDMAP[r/10];                                              //數碼管顯示溫度及C
  157.       LEDBuf[2]=LEDMAP[r%10];
  158.       LEDBuf[3]=0x39;
  159.       LEDBuf[4]=LEDMAP[tw/10];
  160.       LEDBuf[5]=LEDMAP[tw%10];
  161.      }
  162.   if(r>th)
  163.   {
  164.     LEDBuf[0]=LEDMAP[0];                                                               //數碼管高位顯示零
  165.     LEDBuf[1]=LEDMAP[r/10];                                                            //數碼管顯示溫度及H
  166.     LEDBuf[2]=LEDMAP[r%10];
  167.     LEDBuf[3]=0x76;
  168.     LEDBuf[4]=LEDMAP[tw/10];
  169.     LEDBuf[5]=LEDMAP[tw%10];
  170.    }
  171. }
  172. unsigned char ReadAD()                                                                                                      //A/D采樣程序
  173. {
  174.   unsigned int i;
  175.   ADPort=0;                                                                                                  //啟動A/D變換
  176.   for(i=0;i<20;i++);                                                                                                       //延時100us
  177.   return(ADPort);                                                                                                         //得到A/D采樣值
  178. }
  179. void ReadTemp()                                                                                                           //采樣溫度讀取
  180. {
  181.   unsigned char i;
  182.   signed int Temp;
  183. ……………………

  184. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


完整論文下載(word格式 可編輯):
單片機課設.doc (7.34 MB, 下載次數: 20)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品 | 国产69精品久久99不卡免费版 | 欧美在线综合 | 国产精品久久久久久吹潮日韩动画 | 一级黄a视频 | 野狼在线社区2017入口 | 一级黄色片在线看 | 欧美一区二 | 色视频在线观看 | 亚洲aⅴ | 亚洲国产小视频 | 麻豆精品国产91久久久久久 | 久久久久久久一区二区三区 | 爱爱视频在线观看 | 91av免费观看 | 天天久久 | av福利网 | 91av免费版 | 欧美成人免费在线视频 | 亚洲精品一区二三区不卡 | аⅴ资源新版在线天堂 | 男女羞羞视频免费 | 成人天堂| 久久久久久久久99 | 久久999| 免费一二区 | 一区二区三区中文字幕 | 精品久久久久久 | 视频一区二区三区在线观看 | 99re热精品视频 | 欧美一区永久视频免费观看 | 91天堂 | 在线看av的网址 | 色在线视频网站 | 伊人网综合在线观看 | 伊人久久麻豆 | 免费观看一级视频 | 久久久久久久国产精品视频 | 色综合久久久 | 国产人成精品一区二区三 | 久久久www成人免费精品 |