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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10931|回復: 5
打印 上一主題 下一主題
收起左側(cè)

51單片機檢測電動機溫度并控制電動的啟停,LCD1602顯示數(shù)據(jù),按鍵輸入設定溫度

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:490975 發(fā)表于 2019-3-15 22:43 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我做去年做的設計,51單片機檢測電動機溫度并控制電動的啟停同時蜂鳴器報警,LCD1602顯示數(shù)據(jù),按鍵輸入設定溫度.DS18B20測定溫度。附件包含protues仿真圖與單片機源碼

選用51系列單片機或其他型號的單片機,設計步進電機溫度監(jiān)控電路。
一、設計DS18B20溫度檢測電路,當溫度超過每個設定值的時候,可自動停止步進電機電機轉(zhuǎn)動(可實現(xiàn)溫度自動控制);
二、根據(jù)需要將溫度值顯示在數(shù)碼管上(本次設計個人采用LCD1602顯示屏),顯示相應的輸入?yún)?shù);
三,可通過按鍵改變溫度設定值。


本設計的整體思路是:首先利用溫度傳感器DS18B20檢測環(huán)境溫度并直接輸出數(shù)字溫度信號給單片機AT89C52進行處理,在LCD1602顯示屏上顯示當前環(huán)境溫度值與設定溫度值。其中設定溫度值只能為三位整數(shù)加兩位小數(shù)形式,最高設定溫度為655攝氏度。檢測到的當前環(huán)境溫度可精確到小數(shù)點后兩位。通過十三個按鍵改變預設溫度值,其中十一個鍵設定溫度,另兩個確認與取消設定溫度值。防誤觸碰系統(tǒng),當不知情誤碰按鍵的情況下,系統(tǒng)自動顯示按鍵值在若干秒后沒有得到確定命令時自動回歸顯示設定值。在觸發(fā)溫度報警后電機停轉(zhuǎn)、峰鳴報警,其余各部件正常工作,必須等電機溫度下降低于40攝氏度且低于設定溫度電機自動開始工作。系統(tǒng)結構框圖如圖一所示:

圖一 系統(tǒng)構成框圖

2.2 方案選擇

本設計要實現(xiàn)直流電機的溫度控制,使電機能根據(jù)環(huán)境溫度的變化自動啟停與報警,需要比較高的溫度變化分辨率以及穩(wěn)定可靠的換擋停機控制部件。

2.3 溫度傳感器的選擇

采用數(shù)字式的集成溫度傳感器DS18B20作為溫度檢測的核心元件,由其檢測并直接輸出數(shù)字溫度信號給單片機進行處理。
原理圖如圖六:

圖六 原理圖

3.6 PCB圖

PCB圖如圖七:
圖七 PCB圖



5 系統(tǒng)調(diào)試仿真

程序中溫度的設定值為60℃,即當溫度大于或等于60℃時,電機自動停機。可通過按鍵改變設定值。

5.1 電機正常工作

在Proteus軟件中調(diào)節(jié)溫度傳感器溫度到37℃,電機正常工作。下圖分別為LCD1602,溫度傳感器,電機仿真圖。
分別如圖九、圖十:

圖九 LCD1602

         

圖十 溫度傳感器與電機


5.2 電機停止工作

在Proteus軟件中調(diào)節(jié)溫度傳感器溫度到61℃,電機停止工作。下圖分別為1602,溫度傳感器,電機仿真圖。
分別如圖十一、圖十二:

圖十一 LCD1602

        

圖十二 溫度傳感器與電動機

5.3 按鍵改變設定溫

按鍵改變設定值如圖十三、圖十四:

               

圖十三 默認設定溫度                              圖十四 按鍵改變設定溫度



6總結

,本人首次學習、采用分層編程思想,在c51語言的編寫上大大的減少了程序的復雜性,為今后的編程打下了堅實的基礎。通過對各種傳感器、芯片、元件的使用,我了解了傳感器的基本理論知識,更深入的了解單片機的開發(fā)應用和PC編程控制,同時也讓我明白各種芯片元件、傳感器的出廠數(shù)據(jù)對于我們編寫程序有著不可忽略的作用。總的來說,這次學習為我們以后從事單片機軟硬件產(chǎn)品的設計開發(fā)、PC軟件開發(fā)打下了良好的基礎,樹立獨立從事產(chǎn)品研發(fā)的信心,同時也培養(yǎng)了我們認真的做事態(tài)度與動手實踐的能力。學以致用,用以溫學,這個過程就是經(jīng)驗知識與動手能力的雙重收獲過程。
本設計的重點、難點是:
(1) 要掌握溫度傳感器的原理、結構、應用;LCD1602的原理、結構、應用。
(2) 考慮從非電量信號到電量信號的電路實現(xiàn)原理以及與單片機的接口;
(3) 熟悉c51編程的技術,實現(xiàn)單片機對溫度的調(diào)節(jié)控制;
(4) 整體電路的仿真調(diào)試。
本次設計優(yōu)點:采用的單片機AT89C52 性價比高;熱敏電阻溫度傳感器轉(zhuǎn)化溫度的方法非常簡潔且精度高、測試范圍較廣;LCD1602顯示簡潔明了!
實物圖如圖十五:


圖十五 實物圖

單片機源程序:
  1. /*********************************************************************
  2. **********************************************************************
  3. 實驗任務: 驅(qū)動DS18B20檢測溫度值并顯示在LCD1602上。按鍵輸入設置溫度,顯示
  4.           在LCD1602上控制電機運行,檢測溫度超過設定值,電機停止運行。電機
  5.                   停止運行后當電機溫度下降到50攝氏度以下,電機重新運行。               
  6. 實現(xiàn)現(xiàn)象:程序執(zhí)行后LCD1602上面一排顯示溫度值,格式類似于:"ACT T:031.28℃"
  7.          (表示實際溫度)在LCD1602下面一排顯示設定溫度值,
  8.                   格式類似于:"Seted T:055.29℃"(表示設定好的溫度值)
  9.                               "STING T:55.02℃" (表示正在設定的溫度值)
  10.                    如果輸入錯誤或超出量程LCD1602下面一排顯示"set  error"后顯示上一次設定的
  11.                    有效值
  12. 注意事項:溫度輸入范圍(0~~655℃)初始報警溫度60度                                                                                          
  13. **********************************************************************/

  14. /*
  15. **********************************************************************
  16. *                         本地宏定義
  17. **********************************************************************
  18. */
  19. #include "ds18b20.h"                //溫度采集程序
  20. #include "lcd1602.h"                 //液晶屏程序
  21. #define moto        P1                // 矩陣按鍵接在P1端口
  22. sbit qxkey=P3^0        ;// 獨立按鍵 取消鍵
  23. sbit move=P1^0        ;// 電動機
  24. sbit k1=P1^1;         //        按鍵值
  25. sbit k2=P1^2;           //**
  26. sbit k3=P1^3;           //**
  27. sbit k4=P1^4;           //**
  28. sbit k5=P1^5;           //**
  29. sbit k6=P1^6;           //**
  30. sbit k7=P1^7;           //**

  31. /*
  32. **********************************************************************
  33. *                         本地全局變量
  34. **********************************************************************
  35. */
  36. unsigned int zcsj=0;                //暫存輸入設定值整數(shù)部分
  37. unsigned int zcxs=0;                //暫存輸入設定值小數(shù)部分
  38. unsigned char zc;                        //一位輸入設定值暫存
  39. unsigned char xsd=0;           //判斷是否有小數(shù)點xsd
  40. unsigned char i=8;                        //輸入顯示x位置坐標值
  41. unsigned char j=0;                        //輸入整數(shù)數(shù)字位數(shù)值
  42. unsigned char xsdw=0;                //輸入小數(shù)數(shù)字位數(shù)
  43. unsigned int chssj=6000;        //初始溫度設定值100度
  44. unsigned int tdisp;                        //實際溫度值
  45. unsigned char  cs=0;                //整個程序循環(huán)次數(shù),目的當有鍵值輸入但沒有確認或取消
  46.                                                           // 在程序執(zhí)行20次以后自動恢復原來的設定值
  47. unsigned char key = 0;                 // 實時獲取的掃描鍵值
  48. unsigned char h = 0;                 //按鍵行值
  49. unsigned char l = 0;                 //按鍵列值
  50. /*
  51. **********************************************************************
  52. *                         函數(shù)原型聲明
  53. **********************************************************************
  54. */
  55. void TempDisplayTest(void);           //溫度傳感器顯示函數(shù)
  56. void delay1ms(void);                   //延時1ms
  57. void delay1s(void) ;                   //延時1s
  58. void keypanduan(void);                   //判斷按鍵值
  59. void baojin(void);                                //溫度超過設定值蜂鳴器工作
  60. void delay100us(void);
  61. /*********************************************************************
  62. * 函 數(shù) 名       : main
  63. * 函數(shù)功能                 : 主函數(shù)
  64. * 參數(shù)列表       : 無
  65. * 函數(shù)輸出             : 無
  66. *********************************************************************/
  67. void main(void)
  68. {
  69.    
  70.         Lcd1602Init();
  71.         move=1;
  72.         Lcd1602ShowStr(0, 0, "ACT T:");
  73.         Lcd1602ShowStr(0, 1, "Seted T:");
  74.         Lcd1602ShowTempU16(8, 1, chssj);
  75.         while (1)
  76.         {
  77.         uchar key = 0;                          // 實時獲取的掃描鍵值
  78.         uchar h = 0;                        // 行鍵值
  79.         uchar l = 0;                        //列鍵值
  80.         while (1)
  81.         {
  82.          TempDisplayTest();
  83.          keypanduan();
  84.          cs++;
  85.         if(chssj<tdisp){move=0;baojin();}//電動機控制程序
  86.     else if(tdisp<4000)move=1;
  87.         }
  88.         }
  89. }




  90. void TempDisplayTest(void)
  91. {
  92.         extern Ds18b20ReadByte();                 //聲明變量
  93.         u16 temp = 0;                                         // 用來暫存12位的AD值
  94.         u8 tmh = 0 ;
  95.         u8 tml = 0;                        // 用來暫存2個8位的AD值
  96.         u16 tDisp = 0;                                        // 用來存儲乘以100倍后的溫度值
  97.         double t = 0;                                        // 用來存儲轉(zhuǎn)換后以攝氏度為單位的溫度值

  98.         Ds18b20TempConvertCmd();                // 先寫入轉(zhuǎn)換命令
  99.         Ds18b20TempReadCmd();                        // 然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  100.         tml = Ds18b20ReadByte();                // 讀取溫度值共16位,先讀低字節(jié)
  101.         tmh = Ds18b20ReadByte();                // 再讀高字節(jié)

  102.         temp = tml | (tmh << 8);                // 默認是12位分辨率,前面4個S位是符號位
  103.         
  104.         // 正溫度時符號位為0,下面代碼計算沒有考慮負溫度情況,因為我們實驗是在
  105.         // 室溫下做的,如果要考慮到負溫度的情況,代碼中要先判斷S位,若S位為1則
  106.         // 必須點去掉S的1再計算,計算后的值加負號即可。
  107.         t = temp * 0.0625;
  108.         tDisp = (u16)(t * 100);                        // 為方便顯示將溫度值乘以100后強轉(zhuǎn)為u16

  109.         // 調(diào)用LCD1602的顯示函數(shù)來顯示乘以100倍后的溫度值
  110.         tdisp=tDisp;
  111.         Lcd1602ShowTempU16(6, 0, tDisp);

  112. }
  113. /*********************************************************************
  114. * 函 數(shù) 名       : keypanduan
  115. * 函數(shù)功能                 : 輸入報警設置溫度
  116. * 參數(shù)列表       : 無
  117. * 函數(shù)輸出             : 無
  118. *********************************************************************/
  119. void keypanduan(void)
  120. {
  121.                       key = 0;
  122.                         h=0;
  123.                         l=0;                        
  124.         if(qxkey==0){              //獨立按鍵取消程序
  125.                          Lcd1602ShowStr(0, 1, "Seted T:");
  126.             Lcd1602ShowTempU16(8, 1, chssj);
  127.                 j=0;i=8;xsdw=0;xsd=0;zcsj=0;zcxs=0;cs=0; }
  128.     if(cs==20){                                                                           //輸入等待程序
  129.                                  Lcd1602ShowStr(0, 1, "Seted T:");
  130.                      Lcd1602ShowTempU16(8, 1, chssj);
  131.                      j=0;i=8;xsdw=0;xsd=0;zcsj=0;zcxs=0;cs=0;}
  132.         //判斷按鍵值程序
  133.     k1=1;k2=1;k3=1;k4=0;k5=0;k6=0;k7=0;// P1.1-1.3輸出高電平,P1.4-P1.7輸出低電平
  134.         if (k1!=1||k2!=1||k3!=1)        // 讀取KEY_PORT看是否有按鍵按下
  135.         {
  136.                 delay100us();                // 延時消抖
  137.                 if (k1!=1||k2!=1||k3!=1)                // 確認確實有按鍵按下
  138.                 {        
  139.                         Lcd1602ShowStr(i, 1, "         ");
  140.                         // 先確定按鍵發(fā)生在第幾列
  141.                          l=k3*8+k2*4+k1*2;
  142.                         switch (l)
  143.                         {
  144.                                 case 0x0c :        key = 1;         break;
  145.                                 case 0x0a :        key = 2;        break;
  146.                                 case 0x06 : key = 3;        break;
  147.                                 default          :                         break;
  148.                         }

  149.                         // 再確定按鍵發(fā)生在第幾行
  150.                    k1=0;k2=0;k3=0;k4=1;k5=1;k6=1;k7=1;
  151.                         if(k4==1)h=k7*8+k6*4+k5*2+1;
  152.                         if(k4==0)h=k7*8+k6*4+k5*2;
  153.                           switch (h)
  154.                         {
  155.                                 case 7:        key = key + 0;        break;
  156.                                 case 11:        key = key + 3;        break;
  157.                                 case 13:         key = key + 6;        break;
  158.                                 case 14:  key = key + 9;        break;
  159.                         }
  160.                 if (key != 0&&key!=12)                // 有按鍵按下
  161.                 {
  162.                   zc=key; Lcd1602ShowStr(0, 1, "STING T:");
  163.                   if(key==10)zc=0;
  164.                   if(key==11){xsd++;zc=0;Lcd1602ShowStr(i, 1, ".");Lcd1602ShowshujuU16(i+1, 1,zc);}
  165.           else Lcd1602ShowshujuU16(i, 1,zc );i++;
  166.                   if(key!=11&&key!=12&&xsd==0){zcsj=zcsj*10+zc;j++;}
  167.                   if(key!=11&&key!=12&&xsd!=0){zcxs=zcxs*10+zc;j++;xsdw++;}
  168.                   }
  169.                   //判斷輸入值為多少,是否有效        
  170.                 if(((xsd==0&&j<4&&zcsj<656)||(xsd==1&&j<6&&xsdw<3)))//確認輸出設定值
  171.                 {                                 
  172.                   if(key==12&&(zcsj!=0||zcxs!=0)){
  173.                             if(xsdw==1) zcsj=zcsj*100+zcxs*10;
  174.                                 else        zcsj=zcsj*100+zcxs;
  175.                                                    Lcd1602ShowStr(0, 1, "Seted T:");
  176.                                    Lcd1602ShowTempU16(8, 1, zcsj);
  177.                                    chssj=zcsj;
  178.                                                    j=0;i=8;xsdw=0;xsd=0;zcsj=0;zcxs=0;cs=0;}
  179.                    else if(key==12&&zcsj==0&&zcxs==0){Lcd1602ShowTempU16(8, 1, chssj);}
  180.                                                     }
  181.                  else {Lcd1602ShowStr(0, 1, "  set  error  ");
  182.                            delay1s();
  183.                            Lcd1602ShowStr(0, 1, "             ");
  184.                            Lcd1602ShowStr(0, 1, "Seted T:");
  185.                             Lcd1602ShowTempU16(8, 1, chssj);
  186.                            j=0;i=8;xsdw=0;xsd=0;zcsj=0;cs=0;}
  187.             }
  188.         }         
  189.         
  190. }
  191. /*********************************************************************
  192. * 函 數(shù) 名       :
  193. * 函數(shù)功能                 : 以下函數(shù)為延時函數(shù)
  194. * 參數(shù)列表       : 無
  195. * 函數(shù)輸出             : 無
  196. *********************************************************************/
  197. void delay100us(void)   //誤差 0us
  198. {
  199.     unsigned char a,b;
  200.     for(b=71;b>0;b--)
  201.         for(a=2;a>0;a--);
  202. }

  203. void delay1ms(void)   //誤差 0us
  204. {
  205.     unsigned char a,b,c;
  206.     for(c=1;c>0;c--)
  207.         for(b=124;b>0;b--)
  208.             for(a=2;a>0;a--);}
  209. void delay1s(void)   //誤差 0us
  210. {
  211.     unsigned char a,b,c;
  212.     for(c=167;c>0;c--)
  213.         for(b=171;b>0;b--)
  214.             for(a=16;a>0;a--);
  215.     _nop_();  //if Keil,require use intrins.h
  216. }
  217. /*********************************************************************
  218. * 函 數(shù) 名       : baojin
  219. * 函數(shù)功能                 : 峰鳴器工作
  220. * 參數(shù)列表       : 無
  221. * 函數(shù)輸出             : 無
  222. *********************************************************************/
  223. void baojin(void)
  224. {
  225. uint a;
  226. for(a=0;a<150;a++){k5 = 1;delay100us();k5 = 0;delay100us();}
  227. }
復制代碼


全部資料51hei下載地址:
課設原理圖及說明書.zip (7.21 MB, 下載次數(shù): 89)
課設程序.zip (67.9 KB, 下載次數(shù): 95)
PCB_NEW-PCB_20180627001603.pdf (18.82 KB, 下載次數(shù): 34)
說明書.pdf (1.07 MB, 下載次數(shù): 46)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:494382 發(fā)表于 2019-3-20 14:54 | 只看該作者
就是直接可以控制電機啟停嗎?不用加繼電器嗎?
回復

使用道具 舉報

板凳
ID:710428 發(fā)表于 2020-3-18 20:16 | 只看該作者
cactus_lee 發(fā)表于 2019-3-20 14:54
就是直接可以控制電機啟停嗎?不用加繼電器嗎?

是的
回復

使用道具 舉報

地板
ID:633070 發(fā)表于 2020-5-17 13:07 | 只看該作者
有dns嗎
回復

使用道具 舉報

5#
ID:457709 發(fā)表于 2020-5-20 16:17 | 只看該作者
很有用的資料,給樓主一個贊
回復

使用道具 舉報

6#
ID:995584 發(fā)表于 2021-12-23 01:01 | 只看該作者
這個的程序的頭文件在第2個壓縮包里面
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 啪啪综合网| 久久国产三级 | 91久久久久久久久久久久久 | 九九久久久 | 在线观看免费高清av | 免费观看色 | 黄频视频 | 久久久成人免费视频 | www.久 | 欧美久久精品 | 欧美精品一区二区三区视频 | 成人精品一区二区 | 毛片在线免费 | 日韩在线免费视频 | 一级免费看片 | 精品国产乱码久久久久久蜜柚 | 中文字幕不卡在线观看 | 久久伊人影院 | 91在线成人| 中文字幕亚洲一区二区三区 | 国产精品一区二区福利视频 | 久久人人爽人人爽人人片av免费 | 一区二区三区视频在线观看 | 国内精品视频一区二区三区 | 免费大黄视频 | 操久久| 久久lu| 日韩视频1 | 少妇一级淫片免费播放 | 国产日韩一区二区 | 亚洲精品永久免费 | 国产精品日韩欧美一区二区 | 日韩视频免费看 | 日韩一区二区成人 | 一区二区三区欧美大片 | 中文一级片 | 欧美成人激情视频 | 一区二区播放 | 国产精品久久久久久久岛一牛影视 | 在线观看国产wwwa级羞羞视频 | 精品亚洲一区二区三区四区五区高 |