欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19216|回復: 19
收起左側

單片機數字溫度計的 課程設計

  [復制鏈接]
ID:125453 發表于 2016-6-6 15:57 | 顯示全部樓層 |閱讀模式
很簡單,很基礎的,共享給大家
完整的課程設計下載:
數字溫度計的設計.doc (525 KB, 下載次數: 190)



隨著“信息時代”的到來,作為獲取信息的手段——傳感器技術得到了顯著的進步,其應用領域越來越廣泛,對其要求越來越高,需求越來越迫切。傳感器技術已成為衡量一個國家科學技術發展水平的重要標志之一。因此,了解并掌握傳感器的基本結構、工作原理及特性是非常重要的。在日常生活及工農業生產中,經常要用到溫度的檢測及控制,傳統的測溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測出的一般都是電壓,再轉換成對應的溫度,需要比較多的外部硬件支持, 其缺點如下:1. 硬件電路復雜;2. 軟件調試復雜;3. 制作成本高。為了提高對傳感器的認識和了解,尤其是對溫度傳感器的深入研究以及其用法與用途,基于實用、廣泛和典型的原則而設計了本系統。本文利用單片機結合傳感器技術開發設計,文中把傳感器理論與單片機實際應用有機結合,詳細地講述了利用溫度傳感器DS18B20測量環境溫度,同時51單片機在現代電子產品中廣泛應用以及其技術已經非常成熟,DS18B20可以直接讀出被測溫度值,而且采用三線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點。

關鍵詞: 信息時代 溫度傳感器 51單片機


目 錄


摘 要

目 錄

第一章              緒論

1.1   背景
1.2  設計目的
1.2.1掌握溫度計,報警系統的設計、組裝與調試方法。
1.2.2熟悉仿真軟件(proteus)的使用。
1.2.3重點掌握單片機的使用及其各引腳的功能。

第二章 原理分析

2.1原理框圖
2.2 原理分析

第三章 實現過程

3.1顯示電路
3.2數碼管驅動電路
3.3報警電路
3.4數字溫度傳感器
3.5單片機最小系統電路
3.6 按鍵電路
3.7數字溫度計的實物圖
3.8系統板上硬件連錢
3.9 系統調試與分析
3.10 元件清單及程序代碼

心得體會




  •      緒論

1.1   背景

在日常生活及工農業生產中,經常要用到溫度的檢測及控制,傳統的測溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測出的一般都是電壓,再轉換成對應的溫度,需要比較多的外部硬件支持, 其缺點如下:1. 硬件電路復雜;2. 軟件調試復雜;3. 制作成本高。為了提高對傳感器的認識和了解,尤其是對溫度傳感器的深入研究以及其用法與用途,基于實用、廣泛和典型的原則而設計了本系統。

1.2 設計目的

1.2.1掌握溫度計,報警系統的設計、組裝與調試方法。

1.2.2熟悉仿真軟件(proteus)的使用。

1.2.3重點掌握單片機的使用及其各引腳的功能。

第二章 原理分析

2.1原理框圖

protues仿真圖

1.001.jpg

Protues仿真圖顯示當前溫度30℃

2.2 原理分析

整個系統由單片機控制,溫度傳感器采用18B20。18b20采用單總線方式與單片機相連.把采集到得溫度信息傳給單片機。單片機采集到的溫度輸出到四個數碼管上進行顯示。當四位數碼管顯示的溫度超過上限值時可以實現報警功能。

DS18B20原理與分析

DS18B20是美國DALLAS半導體公司繼DS1820之后最新推出的一種改進型智能溫度傳感器。與傳統的熱敏電阻相比,他能夠直接讀出被測溫度并且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式?梢苑謩e在93.75 ms和750 ms內完成9位和12位的數字量,并且從DS18B20讀出的信息或寫入DS18B20的信息僅需要一根口線(單線接口)讀寫,溫度變換功率來源于數據總線,總線本身也可以向所掛接的DS18B20供電,而無需額外電源。因而使用DS18B20可使系統結構更趨簡單,可靠性更高。他在測溫精度、轉換時間、傳輸距離、分辨率等方面較DS1820有了很大的改進,給用戶帶來了更方便的使用和更令人滿意的效果。

1.DS18B20簡介

    (1)獨特的單線接口方式:DS18B20與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊。

    (2)在使用中不需要任何外圍元件。

    (3)可用數據線供電,電壓范圍:+3.0~ +5.5 V。

    (4)測溫范圍:-55 ~+125 ℃。固有測溫分辨率為0.5 ℃。

    (5)通過編程可實現9~12位的數字讀數方式。

    (6)用戶可自設定非易失性的報警上下限值。

    (7)支持多點組網功能,多個DS18B20可以并聯在惟一的三線上,實現多點測溫。

    (8)負壓特性,電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作。

DS18B20的測溫原理

    DS18B20的測溫原理如圖2所示,圖中低溫度系數晶振的振蕩頻率受溫度的影響很小〔1〕,用于產生固定頻率的脈沖信號送給減法計數器1,高溫度系數晶振隨溫度變化其震蕩頻率明顯改變,所產生的信號作為減法計數器2的脈沖輸入,圖中還隱含著計數門,當計數門打開時,DS18B20就對低溫度系數振蕩器產生的時鐘脈沖后進行計數,進而完成溫度測量。計數門的開啟時間由高溫度系數振蕩器來決定,每次測量前,首先將-55 ℃所對應的基數分別置入減法計數器1和溫度寄存器中,減法計數器1和溫度寄存器被預置在 -55 ℃ 所對應的一個基數值。減法計數器1對低溫度系數晶振產生的脈沖信號進行減法計數,當減法計數器1的預置值減到0時溫度寄存器的值將加1,減法計數器1的預置將重新被裝入,減法計數器1重新開始對低溫度系數晶振產生的脈沖信號進行計數,如此循環直到減法計數器2計數到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數值即為所測溫度。圖2中的斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于修正減法計數器的預置值,只要計數門仍未關閉就重復上述過程,直至溫度寄存器值達到被測溫度值,這就是DS18B20的測溫原理。

第三章 實現過程

3.1顯示電路

四位共陽LED數碼管:用來顯示溫度的大小,可直接讀取,溫度精確到0.1℃。四位數碼管如圖所示,從左到右依次是百位,十位,個位,十分位。

1.002.jpg
圖 1 數碼管

3.2數碼管驅動電路

三極管8050:來驅動四位數碼管,如下圖所示三極管Q1 、Q2 、Q3、Q4。
1.003.jpg
圖 2 三極管8050

3.3報警電路

三極管8550驅動蜂鳴器:如下圖所示三極管Q6來驅動蜂鳴器BUZ1。
1.004.jpg
圖 3 三極管8550、蜂鳴器BUZ1

3.4數字溫度傳感器

數字溫度傳感器DS18B20:如下圖所示
1.005.jpg
圖 4  DS18B20

3.5單片機最小系統電路

單片機最小化系統:如下圖所示系統工作時,最小化系統運行。

1.006.jpg
圖 5 最小化系統

3.6 按鍵電路

按鍵:如圖所示按鍵K1為進入/退出設置鍵;K2為增加鍵;K3為減少鍵。

1.007.jpg

圖 6  按鍵

   3.7數字溫度計的實物圖

數字溫度計顯示當前溫度25.7℃

I 1.008.jpg

圖7 數字溫度計實物圖

3.8系統板上硬件連錢

1). 把“單片機系統“區域中的P0.0-P0.7端口用8芯排線依次連接到數碼管A-DP端口上;

(2). 把“單片機系統”區域中的P3.0-P3.2端口用線連接到按鍵K1-K3的一端上,如圖表7所示,其他所有連線按圖表7連接即可。

(3)把單片機的P2.0端口接數碼管的位選3,P2.1端口接數碼管的位選2,P2.2端口接數碼管的位選1,P2.3端口接數碼管的位選4。

(4).電源可用外接電源(用手機充電器可做電源),但必須申明電源小于+5V當然也不能太小

3.9 系統調試與分析

在系統制作和調試過程中遇到了不少問題,下面是具體問題與解決方法。
  • 4個數碼管顯示一樣
檢查之后發現原來是4個8550三極管管腳接錯,改正之后該問題即解決了。
②4個數碼管亮度不一樣
8550管腳改正過后,顯示不一樣了,但4個數碼管亮度不一樣。當某一個數碼管顯示的字段較少,比如“1”時,亮度較強,但是當顯示的字段較多比如“8”時,亮度較暗。分析其原因是:共陰數碼管限流電阻用在控制位選的共陰極的輸入端,這樣當顯示“1”時,電流相對集中,顯示“8”字段較多,電流分配后較小,因此“1”顯示時比顯示“8”時亮。
解決方法:減小這里的限流電阻,使其流入數碼管的電流變的很大,這樣在較大電流時,即使字段多的電流較小,也比原來大了。這樣就減小了差距,雖然還是有差距但已不太明顯。

3.10 元件清單及程序代碼

元件清單:

單片機AT89C52:1個

     40引腳底座:1個

     DS18B20:1個

     蜂鳴器:1個
     三極管:8050  5個;8550  1個
     電阻:1k  6個;10K   1個
    電容:極性電容10uf   1個;瓷片電容10pf  2個
    按鍵:3個
晶振:1個
四位共陽數碼管:1個
程序代碼:
  1. #include

  2. #define uchar unsigned char

  3. #define uint unsigned int

  4. sbit d1=P2^2;

  5. sbit d2=P2^1;

  6. sbit d3=P2^0;

  7. sbit d4=P2^3;

  8. sbit key1=P3^0;

  9. sbit key2=P3^1;

  10. sbit key3=P3^2;

  11. sbit beep=P3^3;

  12. sbit DS=P1^2;

  13. sbit ACC_7=ACC^7;

  14. uint count=1000,alarm=300;

  15. uchar shu;

  16. uchar shi,fen,ri,yue,nian,xq,miao,ss;      

  17. uint temp;             // 溫度變量

  18. uchar flag;

  19. uchar code tab[]=

  20. {0xc0,0xf9,0xa4,0xb0,

  21. 0x99,0x92,0x82,0xf8,

  22. 0x80,0x90

  23. };

  24. uchar code tab1[]=//小數點點亮

  25. {0x40,0x79,0x24,0x30,

  26. 0x19,0x12,0x02,0x78,0x00,0x10

  27. };

  28. void delay(uint z)

  29. {

  30.               uint x,y;

  31.               for(x=z;x>0;x--)

  32.                             for(y=120;y>0;y--);

  33. }

  34. void dsreset()//發復位

  35. {     

  36.               uint i;

  37.               DS=0;

  38.               i=103;

  39.               while(i>0)i--;

  40.               DS=1;

  41.               i=4;

  42.               while(i>0)i--;

  43. }

  44. uchar tmpread()   //讀取一字節

  45. {

  46.               uchar j,k,dat;

  47.               uint i;

  48.     for(j=1;j<=8;j++)

  49.     {

  50.                   DS=0;i++;          //延時

  51.                   DS=1;i++;i++;

  52.                             k=DS;

  53.                   i=8;while(i>0)i--;

  54.                             dat=(k<<7)|(dat>>1);//讀出的數據最低位在最前面存一個字節在DAT里

  55.     }

  56.     return(dat);

  57. }

  58. void tmpwritebyte(uchar dat)   //寫一個字節

  59. {

  60.     uint i;

  61.     uchar j;

  62.     bit testb;

  63.     for(j=1;j<=8;j++)

  64.     {

  65.                   testb=dat&0x01;

  66.                   dat=dat>>1;

  67.                   if(testb)     //寫 1

  68.                                 {

  69.                                   DS=0;

  70.                                   i++;i++;

  71.                                   DS=1;

  72.                                   i=8;while(i>0)i--;

  73.                                 }

  74.     else

  75.     {

  76.               DS=0;       //寫 0

  77.               i=8;while(i>0)i--;

  78.               DS=1;

  79.               i++;i++;

  80.     }

  81.   }

  82. }

  83. void tmpchange()  //DS18B20溫度變換

  84. {

  85.               dsreset();

  86.               delay(1);

  87.               tmpwritebyte(0xcc);  //跳過讀取內存rom

  88.               tmpwritebyte(0x44);  //開始轉換

  89. }

  90. uint tmp()               //讀取溫度

  91. {

  92.               float tt;

  93.               uchar a,b;

  94.               dsreset();

  95.               delay(1);

  96.               tmpwritebyte(0xcc);

  97.               tmpwritebyte(0xbe);

  98.               a=tmpread(); //a為低字節8位

  99.               b=tmpread(); //b為高字節8位

  100.               temp=b;     //temp為溫度值UINT 16bit

  101.               temp<<=8;             //兩個字節組合到一起

  102.               temp=temp|a;   

  103.               if(b>127)

  104.               {

  105.               flag=1;

  106.               ss=flag;

  107.               temp=~temp+1;

  108.               }

  109.               tt=temp*0.0625; // temp/16 則是溫度的真實值tt.7位整數,4位小數

  110.               temp=tt*10+0.5; // 擴大十倍取出了第一位小數

  111.               return(temp);

  112. }

  113. void displayTemp(uint temp)   //顯示溫度程序

  114. {

  115.               uchar ge,shi,bai,qian,ser;

  116.               d1=0;

  117.               d1=0;

  118.               d3=0;

  119.               d4=0;

  120.               dsreset();

  121.               ser=temp/10;     //分離出三位要顯示的數字

  122.               SBUF=ser;

  123.               qian=temp/1000;

  124.               bai=temp/100%10; // 百位數字

  125.               shi=temp/10%10;   // 十位數字

  126.               ge=temp%10;   // 個位數字

  127.               if(flag==1)

  128.               {

  129.                             flag=0;

  130.                             P0=0xbf;

  131.                             d1=1;

  132.                             delay(2);

  133.                             d1=0;

  134.               }

  135.               if(qian!=0)

  136.               {

  137.                             P0=tab[qian];

  138.                             d1=1;

  139.                             delay(2);

  140.                             d1=0;            

  141.               }

  142.               else

  143.               {

  144.                             P0=0xff;

  145.                             d1=1;

  146.                             delay(2);

  147.                             d1=0;            

  148.               }

  149.               if(temp>99)

  150.               {

  151.                             P0=tab[bai];

  152.                             d2=1;

  153.                             delay(2);

  154.                             d2=0;

  155.               }

  156.                             P0=tab1[shi];

  157.                             d3=1;

  158.                             delay(2);

  159.                             d3=0;

  160.                             P0=tab[ge];

  161.                             d4=1;

  162.                             delay(2);

  163.                             d4=0;

  164. }

  165. uint keyscan()

  166. {

  167.               if(key1==0)

  168.               {

  169.                             delay(5);

  170.                             if(key1==0)

  171.                             {

  172.                                           while(!key1);

  173.                                           shu++;

  174.                             }

  175.             



  176.               }

  177.                                           if(key2==0)

  178.                                           {

  179.                                                         delay(5);

  180.                                                         if(key2==0)

  181.                                                         {

  182.                                                                       while(!key2);

  183.                                                                       count=count+10;

  184.                                                                       if(shu==2)

  185.                                                                       {

  186.                                                                                     alarm+=10;

  187.                                                                       }

  188.                                                                      

  189.                                                         }

  190.                                           }

  191.                                           if(key3==0)

  192.                                           {

  193.                                                         delay(5);

  194.                                                         if(key3==0)

  195.                                                         {

  196.                                                                       while(!key3);

  197.                                                                       count=count-10;

  198.                                                                                     if(shu==2)

  199.                                                                       {

  200.                                                                                     alarm-=10;

  201.                                                                       }

  202.                                                         }

  203.                                           }

  204.               return(count);



  205. }



  206. void main()

  207. {

  208.               beep=0;

  209.               delay(10);

  210.               while( 1 )

  211.               {

  212.               tmpchange();

  213.               if(shu==0)

  214.               {

  215.                             displayTemp(tmp( ));

  216.               }

  217.               keyscan();

  218.               if(shu==1)

  219.                             {

  220.                                           displayTemp(count);

  221.                             }

  222.               if(shu==2)

  223.               {

  224.                                           displayTemp(alarm);

  225.                             }

  226.               if(shu==3)

  227.               {

  228.                             shu=0;            

  229.                             }

  230.               if(temp>count||(temp<alarm))

  231.               {

  232.               beep=0;



  233.               }

  234.               else

  235.               beep=1;



  236.               }

  237. }



復制代碼


評分

參與人數 6黑幣 +75 收起 理由
junmoxiao + 5 共享資料的黑幣獎勵!
去瞧瞧去去去 + 5 絕世好帖!
hellsing + 5 很不錯
Maiyan + 5 贊一個!
348652560 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:210644 發表于 2017-6-12 23:37 來自觸屏版 | 顯示全部樓層
為什么元件清單上有七個電阻仿真圖上卻只有六個?
回復

使用道具 舉報

ID:211258 發表于 2017-6-15 17:43 | 顯示全部樓層
非常好
回復

使用道具 舉報

ID:251885 發表于 2017-11-21 14:54 | 顯示全部樓層
很棒的論文
回復

使用道具 舉報

ID:254845 發表于 2017-11-29 13:22 來自觸屏版 | 顯示全部樓層
為什么控制的不是溫度計顯示的溫度
回復

使用道具 舉報

ID:261181 發表于 2017-12-13 18:29 | 顯示全部樓層
好的不錯行啊
回復

使用道具 舉報

ID:287721 發表于 2018-3-5 13:55 | 顯示全部樓層
樓主啊  這個數字溫度計的doc能否發一個給我啊   沒黑幣  郵箱836764562@qq.com多謝
回復

使用道具 舉報

ID:297514 發表于 2018-3-26 21:03 | 顯示全部樓層
836764562 發表于 2018-3-5 13:55
樓主啊  這個數字溫度計的doc能否發一個給我啊   沒黑幣  郵箱多謝

發了嗎
回復

使用道具 舉報

ID:296265 發表于 2018-4-14 10:37 | 顯示全部樓層
感覺不錯
回復

使用道具 舉報

ID:323854 發表于 2018-5-8 15:13 | 顯示全部樓層
寫得非常好,都列出來了
回復

使用道具 舉報

ID:349206 發表于 2018-6-11 12:06 來自觸屏版 | 顯示全部樓層
還好能看懂  要做畢業設計的
回復

使用道具 舉報

ID:367788 發表于 2018-7-11 15:03 | 顯示全部樓層
棒棒棒
回復

使用道具 舉報

ID:372443 發表于 2018-7-16 16:41 | 顯示全部樓層
大圖看不清啊,哪位大佬給發一個啊
回復

使用道具 舉報

ID:373768 發表于 2018-7-18 11:00 | 顯示全部樓層
很有用的分享
回復

使用道具 舉報

ID:399005 發表于 2018-9-17 21:23 | 顯示全部樓層
我的數碼管怎么不顯示
回復

使用道具 舉報

ID:576282 發表于 2019-7-2 19:01 | 顯示全部樓層
非常不錯
回復

使用道具 舉報

ID:672212 發表于 2019-12-24 11:26 | 顯示全部樓層
很棒!!。!
回復

使用道具 舉報

ID:773523 發表于 2020-6-9 11:07 | 顯示全部樓層
為什么我的數碼管不亮
回復

使用道具 舉報

ID:773419 發表于 2020-6-10 11:12 來自觸屏版 | 顯示全部樓層
怎么實現報警哦!
回復

使用道具 舉報

ID:775255 發表于 2020-6-10 20:21 | 顯示全部樓層
第一句函數reg51.h還是需要寫全呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表