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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2565|回復: 1
打印 上一主題 下一主題
收起左側

單片機溫控風扇源程序和電路圖

[復制鏈接]
跳轉到指定樓層
樓主
ID:573884 發表于 2019-8-5 16:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本系統可由用戶根據需要自由設置大小風檔的切換溫度值TH,TL,硬件上設計了3個按鍵,按下一次設置鍵K1,進入溫度上限設置,此時按下“加”鍵K2,加一,按下“減”鍵K3,減一。再按一次設置鍵K1進入溫度下限設置狀態,此時按下“加”鍵K2,加一,按下“減”鍵K3,減一。再按一次設置鍵K1退出下限溫度設置狀態,恢復到當前溫度顯示狀態。
注:溫度上下限以及當前溫度顯示格式為H-XX L-XXD-XX.
XX為溫度值;D為檔位值。

單片機源程序如下:
  1. /**************************************************************************************
  2. *                              DS18B20溫度傳感器實驗                                                                                                  *
  3. 實現現象:下載程序后,在溫度傳感器接口處,按照絲印方向插好溫度傳感器,數碼管就會顯示
  4.                         檢測的溫度值,
  5. 注意事項:                                                                                                                                                                  
  6. ***************************************************************************************/

  7. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  8. #include"temp.h"        
  9. #include<intrins.h>  
  10. typedef unsigned int u16;          //對數據類型進行聲明定義
  11. typedef unsigned char u8;
  12. char i;

  13. sbit dj=P1^0;//電機
  14. sbit LSA=P2^2;
  15. sbit LSB=P2^3;
  16. sbit LSC=P2^4;
  17. sbit key1=P3^1;//設置溫度
  18. sbit key2=P3^0;//溫度加
  19. sbit key3=P3^2;//溫度減

  20. u8 wen_du;//溫度變量  
  21. u8 shang,xia; //對比溫度暫存變量
  22. u16 dang;//檔位顯示
  23. u16 flag;
  24. u16 d1,d2,d3;//顯示溫度暫存變量
  25. u8 DisplayData[8];
  26. u8 code smgduan[22]={0x3F,0x06,0x5B,0x4F,0x66,
  27. 0x6D,0x7D,0x07,0x7F,0x6F,
  28. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  29. 0x40,0x38,0x76,0x00,0xff,0x37};

  30. void delay(u16 i)
  31. {
  32.         while(i--);        
  33. }
  34. /*******************************************************************************
  35. * 函數名         :DigDisplay()
  36. * 函數功能                 :數碼管顯示函數
  37. * 輸入           : 無
  38. * 輸出                  : 無
  39. *******************************************************************************/
  40. void DigDisplay()
  41. {
  42.         u8 i;
  43.         for(i=0;i<4;i++)
  44.         {
  45.                 switch(i)         //位選,選擇點亮的數碼管,
  46.                 {
  47.                         case(3):
  48.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  49.                         case(2):
  50.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  51.                         case(1):
  52.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  53.                         case(0):
  54.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  55.                 }
  56.                 Ds18b20ReadTemp();
  57.                 P0=smgduan[DisplayData[i]];//發送數據
  58.                 delay(100); //間隔一段時間掃描        
  59.                 P0=0x00;//消隱
  60.         }               
  61. }
  62. /*******************************************************************************
  63. * 函 數 名         : Delay1ms
  64. * 函數功能                   : 延時函數
  65. * 輸    入         : 無
  66. * 輸    出         : 無
  67. *******************************************************************************/

  68. void Delay1ms(uint y)
  69. {
  70.         uint x;
  71.         for( ; y>0; y--)
  72.         {
  73.                 for(x=110; x>0; x--);
  74.         }
  75. }
  76. /*******************************************************************************
  77. * 函 數 名         : Ds18b20Init
  78. * 函數功能                   : 初始化
  79. * 輸    入         : 無
  80. * 輸    出         : 初始化成功返回1,失敗返回0
  81. *******************************************************************************/

  82. uchar Ds18b20Init()
  83. {
  84.         uchar i;
  85.         DSPORT = 0;                         //將總線拉低480us~960us
  86.         i = 70;        
  87.         while(i--);//延時642us
  88.         DSPORT = 1;                        //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
  89.         i = 0;
  90.         while(DSPORT)        //等待DS18B20拉低總線
  91.         {
  92.                 Delay1ms(1);
  93.                 i++;
  94.                 if(i>5)//等待>5MS
  95.                 {
  96.                         return 0;//初始化失敗
  97.                 }
  98.         
  99.         }
  100.         return 1;//初始化成功
  101. }

  102. /*******************************************************************************
  103. * 函 數 名         : Ds18b20WriteByte
  104. * 函數功能                   : 向18B20寫入一個字節
  105. * 輸    入         : 無
  106. * 輸    出         : 無
  107. *******************************************************************************/

  108. void Ds18b20WriteByte(uchar dat)
  109. {
  110.         uint i, j;

  111.         for(j=0; j<8; j++)
  112.         {
  113.                 DSPORT = 0;                       //每寫入一位數據之前先把總線拉低1us
  114.                 i++;
  115.                 DSPORT = dat & 0x01;  //然后寫入一個數據,從最低位開始
  116.                 i=6;
  117.                 while(i--); //延時68us,持續時間最少60us
  118.                 DSPORT = 1;        //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
  119.                 dat >>= 1;
  120.         }
  121. }
  122. /*******************************************************************************
  123. * 函 數 名         : Ds18b20ReadByte
  124. * 函數功能                   : 讀取一個字節
  125. * 輸    入         : 無
  126. * 輸    出         : 無
  127. *******************************************************************************/


  128. uchar Ds18b20ReadByte()
  129. {
  130.         uchar byte, bi;
  131.         uint i, j;        
  132.         for(j=8; j>0; j--)
  133.         {
  134.                 DSPORT = 0;//先將總線拉低1us
  135.                 i++;
  136.                 DSPORT = 1;//然后釋放總線
  137.                 i++;
  138.                 i++;//延時6us等待數據穩定
  139.                 bi = DSPORT;         //讀取數據,從最低位開始讀取
  140.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
  141.                 byte = (byte >> 1) | (bi << 7);                                                  
  142.                 i = 4;                //讀取完之后等待48us再接著讀取下一個數
  143.                 while(i--);
  144.         }                                
  145.         return byte;
  146. }
  147. /*******************************************************************************
  148. * 函 數 名         : Ds18b20ChangTemp
  149. * 函數功能                   : 讓18b20開始轉換溫度
  150. * 輸    入         : 無
  151. * 輸    出         : 無
  152. *******************************************************************************/

  153. void  Ds18b20ChangTemp()
  154. {
  155.         Ds18b20Init();
  156.         Delay1ms(1);
  157.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  158.         Ds18b20WriteByte(0x44);            //溫度轉換命令
  159.         //Delay1ms(100);        //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
  160.    
  161. }
  162. /*******************************************************************************
  163. * 函 數 名         : Ds18b20ReadTempCom
  164. * 函數功能                   : 發送讀取溫度命令
  165. * 輸    入         : 無
  166. * 輸    出         : 無
  167. *******************************************************************************/

  168. void  Ds18b20ReadTempCom()
  169. {        

  170.         Ds18b20Init();
  171.         Delay1ms(1);
  172.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  173.         Ds18b20WriteByte(0xbe);         //發送讀取溫度命令
  174. }
  175. /*******************************************************************************
  176. * 函 數 名         : Ds18b20ReadTemp
  177. * 函數功能                   : 讀取溫度
  178. * 輸    入         : 無
  179. * 輸    出         : 無
  180. *******************************************************************************/

  181. int Ds18b20ReadTemp()
  182. {
  183.         int temp = 0;
  184.         uchar tmh, tml;
  185.         Ds18b20ChangTemp();                                 //先寫入轉換命令
  186.         Ds18b20ReadTempCom();                        //然后等待轉換完后發送讀取溫度命令
  187.         tml = Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節
  188.         tmh = Ds18b20ReadByte();//再讀高字節
  189.   wen_du=((tmh*256+tml)>>4);        
  190.         temp = tmh;
  191.         temp <<= 8;
  192.         temp |= tml;
  193.         return temp;
  194. }
  195. void zi_keyscan()                  //自動模式按鍵掃描函數
  196. {
  197.         if(key1==0)                                                          //設置鍵按下
  198.         {
  199.                 delay(30);                                                  //延時去抖
  200.                 if(key1==0)flag=1;                                  //再次判斷按鍵,按下的話進入設置狀態
  201.                 while(key1==0);//????                  //按鍵釋放
  202.         }
  203.                                 //顯示上限溫度H
  204.         while(flag==1)                                                  //進入設置按鍵上限狀態
  205.         {
  206.                 d1=18;d2=shang/10;d3=shang%10;          //顯示字母H 和上線溫度值
  207.                 DisplayData[0]=d1;                                        //調用顯示函數
  208.                                                                 DisplayData[1]=16;
  209.                                                                 DisplayData[2]=d2;
  210.                                                                 DisplayData[3]=d3;
  211.                                                                 DigDisplay();
  212.                 if(key1==0)                                                  //判斷設置鍵是否按下
  213.                 {
  214.                         delay(30);                                          //延時去抖
  215.                         if(key1==0)flag=2;                          //按鍵按下,進入設置下限模式
  216.                         while(key1==0);//松手檢測
  217.                 }
  218.                 if(key2==0)                                                  //加鍵按下
  219.                 {
  220.                         delay(30);                                          //延時去抖
  221.                         if(key2==0)                                          //加鍵按下
  222.                         {
  223.                                 shang+=1;                                  //上限加5
  224.                                 if(shang>=40)shang=40;  //上線最大加到100
  225.                         }while(key2==0);//松手檢測
  226.                 }
  227.                 if(key3==0)                                                  //減鍵按下
  228.                 {
  229.                         delay(30);                                          //延時去抖
  230.                         if(key3==0)                                          //減鍵按下
  231.                         {
  232.                                 shang-=1;                                  //上限減1
  233.                                 if(shang<=15)shang=15;          //上限最小減到10
  234.                         }while(key3==0);//松手檢測
  235.                 }               
  236.         }
  237.                                                                 //顯示下限溫度L
  238.         while(flag==2)                                                  //設置下限
  239.         {
  240.                 d1=17;d2=xia/10;d3=xia%10;                  //顯示字母L 顯示下限溫度值
  241.                 DisplayData[0]=d1;                                        //調用顯示函數
  242.                                                                 DisplayData[1]=16;
  243.                                                                 DisplayData[2]=d2;
  244.                                                                 DisplayData[3]=d3;
  245.                                                                 DigDisplay();                                                  
  246.                 if(key1==0)
  247.                 {
  248.                         delay(30);
  249.                         if(key1==0)flag=0;
  250.                         while(key1==0);
  251.                 }
  252.                 if(key2==0)
  253.                 {
  254.                         delay(30);
  255.                         if(key2==0)
  256.                         {
  257.                                 xia+=1;
  258.                                 if(xia>=40)xia=40;        
  259.                         }while(key2==0);//????
  260.                 }
  261.                if(key3==0)
  262.                 {
  263.                         delay(30);
  264.                        if(key3==0)
  265.                         {
  266.                                 xia-=1;
  267.                                 if(xia<=15)xia=15;        
  268.                         }while(key3==0);//????
  269.                 }               
  270.         }
  271. }
  272. void zi_dong()  //傳感器采集溫度以及擋位顯示
  273. {
  274.         u16 i;
  275.         d1=dang;d2=wen_du/10;d3=wen_du%10;                //顯示檔位,顯示當前溫度值
  276.         zi_keyscan();               //按鍵掃描函數
  277.                                 DisplayData[0]=d1;                                        //調用顯示函數
  278.                                 DisplayData[1]=16;
  279.                                 DisplayData[2]=d2;
  280.                                 DisplayData[3]=d3;
  281.                                 DigDisplay();               //調用顯示函數
  282.        if(wen_du<xia){dj=0;dang=0;}      //低于下限  顯示為0 電機停止
  283.        if((wen_du>=xia)&&(wen_du<=shang))//溫度大于下限,小于上限  1檔
  284.         {
  285.                 dang=1;
  286.                 for(i=0;i<2;i++){dj=0;DigDisplay();zi_keyscan();}        //PWM通過延時降低風扇轉速
  287.                 for(i=0;i<4;i++){dj=1;DigDisplay();zi_keyscan();}               
  288.         }
  289.         if(wen_du>shang){dj=1;dang=2;}//高溫全速
  290. }
  291. void main()                  //主函數
  292. {
  293.         u16 j;
  294.         dj=0;                    //電機開
  295.         shang=30;
  296.         xia=20;                  //初始上下限值
  297.         for(j=0;j<80;j++)          //現讀取溫度值,防止開機顯示85
  298.         Ds18b20ReadTemp();
  299.         while(1)                          //進入while循環
  300.           {        
  301.                 Ds18b20ReadTemp();        //讀取溫度值
  302.                 for(j=0;j<100;j++)zi_dong();//自動溫控模式
  303.         }
  304. }
復制代碼

所有資料51hei提供下載:

fengshan (3).zip

22.81 KB, 下載次數: 10, 下載積分: 黑幣 -5

溫控風扇

溫控風扇.7z

79.63 KB, 下載次數: 12, 下載積分: 黑幣 -5

電路仿真圖,51程序

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2019-8-5 22:31 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩免费电影 | 五月天激情电影 | 噜啊噜在线 | 国产高清视频 | 一区二区在线不卡 | 欧美日韩视频网站 | 国产在线一区二区三区 | 美日韩免费 | 国产精品一区二区在线免费观看 | 国产一区二区观看 | 免费看黄色片 | 国产一区| 97人人澡人人爽91综合色 | 91黄色免费看 | 精品国产乱码久久久久久蜜退臀 | 日韩欧美在线播放 | 国产激情精品一区二区三区 | 91亚洲精品国偷拍自产在线观看 | 国产1区2区在线观看 | 日韩一区二区黄色片 | 久久88| 天天综合操| 国产小视频在线观看 | 国产精品九九 | www亚洲精品 | 国产在线视频一区二区董小宛性色 | 国产成人精品在线播放 | 97avcc| 日日操天天射 | www.国产精| 久久精品a | 国产a视频 | 免费h视频 | 亚洲一区二区三区视频在线 | 日日干夜夜操 | 国产一区免费 | 久操伊人 | 日韩一区二区精品 | 国产精品国产三级国产aⅴ无密码 | 狠狠操你 | 国产一级视频 |