找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3712|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)溫控風(fēng)扇Proteus仿真程序 溫度報(bào)警手動(dòng)和自動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
首先紅外傳感器作為開(kāi)啟裝置的開(kāi)關(guān)(可外設(shè)間接作用于單片機(jī)或直接作用于單片機(jī)),單片機(jī)開(kāi)始讀取DS18B20采集的溫度參數(shù),用讀取的溫度與裝置開(kāi)始時(shí)內(nèi)設(shè)的溫度范圍作比較,實(shí)現(xiàn)低、中、高檔的調(diào)節(jié)。溫度范圍可以通過(guò)設(shè)置按鍵進(jìn)行合適的設(shè)置。讀取的溫度用數(shù)碼管進(jìn)行顯示以便進(jìn)行觀察。
設(shè)有按鍵4個(gè)基本按鍵,分別為復(fù)位按鍵、設(shè)置按鍵、兩個(gè)調(diào)節(jié)按鍵。按下復(fù)位鍵,所有設(shè)置都回到最初狀態(tài),按下設(shè)置鍵和調(diào)節(jié)鍵可設(shè)置最高溫度以及最低溫度的值,溫度最高設(shè)置不得超過(guò)設(shè)置的上限溫度。2個(gè)模式轉(zhuǎn)換按鍵方便切換普通模式和溫控模式。
當(dāng)外界溫度超過(guò)上限溫度將觸發(fā)連接蜂鳴器引腳電位發(fā)生變化,從而使蜂鳴器工作報(bào)警。
利用PWM調(diào)速,當(dāng)溫度低于最低溫度時(shí),風(fēng)扇為1檔轉(zhuǎn)動(dòng)(25%的轉(zhuǎn)速),當(dāng)溫度處于最高、最低之間時(shí)2檔轉(zhuǎn)動(dòng)(50%的轉(zhuǎn)速),當(dāng)溫度超過(guò)最高時(shí),全速轉(zhuǎn)動(dòng)。風(fēng)扇最好不要直接用單片機(jī)供電,需要外加電源,單片機(jī)對(duì)風(fēng)扇的控制可以用PNP和NPN三極管進(jìn)行。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>                         //包含頭文件
  3. #define uchar unsigned char
  4. #define uint unsigned int                 //宏定義
  5. ////////////////////
  6. sbit dj=P2^3;//電機(jī)控制端接口
  7. sbit DQ=P2^1;//溫度傳感器接口
  8. //////////按鍵接口/////////////////////////////////
  9. sbit key1=P3^5;//設(shè)置溫度
  10. sbit key2=P3^6;//溫度加
  11. sbit key3=P3^7;//溫度減
  12. sbit key4=P2^5;//自動(dòng)模式
  13. sbit key5=P2^7;//手動(dòng)模式

  14. sbit dp=P1^5; //蜂鳴器
  15. //////////////////////////////////////////////////////
  16. sbit w1=P2^6;
  17. sbit w2=P2^4;
  18. sbit w3=P2^2;
  19. sbit w4=P2^0;                          //數(shù)碼管的四個(gè)位
  20. /////共陰數(shù)碼管段選//////////////////////////////////////////////
  21. uchar table[22]=
  22. {0x3F,0x06,0x5B,0x4F,0x66,
  23. 0x6D,0x7D,0x07,0x7F,0x6F,
  24. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  25. 0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n         16-21
  26. uint wen_du;                                                //溫度變量  
  27. uint shang,xia; //對(duì)比溫度暫存變量
  28. uchar dang;//檔位顯示
  29. uchar flag,flag1,flag2;
  30. uchar d1,d2,d3;//顯示數(shù)據(jù)暫存變量
  31. void delay(uint ms)                //延時(shí)函數(shù),大約延時(shí)25us
  32. {
  33.         uchar x;
  34.         for(ms;ms>0;ms--)
  35.                 for(x=10;x>0;x--);
  36. }
  37. /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/
  38. void delay_18B20(uint i)
  39. {
  40.         while(i--);
  41. }
  42. /**********ds18b20初始化函數(shù)**********************/
  43. void Init_DS18B20()
  44. {
  45.          uchar x=0;
  46.          DQ=1;          //DQ復(fù)位
  47.          delay_18B20(8);  //稍做延時(shí)
  48.          DQ=0;          //單片機(jī)將DQ拉低
  49.          delay_18B20(80); //精確延時(shí) 大于 480us
  50.          DQ=1;          //拉高總線
  51.          delay_18B20(14);
  52.          x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  53.          delay_18B20(20);
  54. }
  55. /***********ds18b20讀一個(gè)字節(jié)**************/  
  56. uchar ReadOneChar()
  57. {
  58.         uchar i=0;
  59.         uchar dat=0;
  60.         for (i=8;i>0;i--)
  61.          {
  62.                   DQ=0; // 給脈沖信號(hào)
  63.                   dat>>=1;
  64.                   DQ=1; // 給脈沖信號(hào)
  65.                   if(DQ)
  66.                   dat|=0x80;
  67.                   delay_18B20(4);
  68.          }
  69.          return(dat);
  70. }
  71. /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/  
  72. void WriteOneChar(uchar dat)
  73. {
  74.          uchar i=0;
  75.          for (i=8;i>0;i--)
  76.          {
  77.                   DQ=0;
  78.                  DQ=dat&0x01;
  79.             delay_18B20(5);
  80.                  DQ=1;
  81.             dat>>=1;
  82.         }
  83. }
  84. /**************讀取ds18b20當(dāng)前溫度************/
  85. void ReadTemperature()
  86. {
  87.         uchar a=0;
  88.         uchar b=0;
  89.         uchar t=0;
  90.         Init_DS18B20();
  91.         WriteOneChar(0xCC);            // 跳過(guò)讀序號(hào)列號(hào)的操作
  92.         WriteOneChar(0x44);         // 啟動(dòng)溫度轉(zhuǎn)換
  93.         delay_18B20(100);       // this message is wery important
  94.         Init_DS18B20();
  95.         WriteOneChar(0xCC);         //跳過(guò)讀序號(hào)列號(hào)的操作
  96.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  97.         delay_18B20(100);
  98.         a=ReadOneChar();            //讀取溫度值低位
  99.         b=ReadOneChar();                   //讀取溫度值高位
  100.         wen_du=((b*256+a)>>4);    //當(dāng)前采集溫度值除16得實(shí)際溫度值
  101. }

  102. void display()//顯示溫度
  103. {
  104.         w1=0;P0=~table[d1];delay(10); //第1位
  105.         P0=~0x00;w1=1;delay(1);
  106.          
  107.         w2=0;P0=~table[16];delay(10);//第2位
  108.         P0=~0x00;w2=1;delay(1);

  109.         w3=0;P0=~table[d2]; delay(10);//第3位
  110.         P0=~0x00;w3=1;delay(1);

  111.         w4=0;P0=~table[d3];delay(10);//第4位
  112.         P0=~0x00;w4=1;delay(1);
  113. }
  114. void display_1()//顯示檔位
  115. {
  116.         w1=0;P0=~table[d1];delay(10); //檔位
  117.         P0=~0x00;w1=1;delay(1);
  118. }
  119. void shou_keyscan()
  120. {
  121.         if(key2==0)                                                  //加鍵按下
  122.                 {
  123.                         delay(10);                        //延時(shí)去抖
  124.                         if(key2==0)                                          //加鍵按下
  125.                         {
  126.                                 dang+=1;                                  //上限加3
  127.                                 if(dang>=3)dang=3;                                //檔位上限為3
  128.                         }while(key2==0);//松手檢測(cè)
  129.                 }
  130.                
  131.         if(key3==0)                                                  //減鍵按下
  132.                 {
  133.                         delay(10);                        //延時(shí)去抖
  134.                         if(key3==0)                                          //減鍵按下
  135.                         {
  136.                                 dang-=1;                                  //上限減1
  137.                                 if(dang<=1)dang=1;          //檔位下限為1  
  138.                         }while(key3==0);//松手檢測(cè)
  139.                 }                        
  140. }

  141. void zi_keyscan()//自動(dòng)模式按鍵掃描函數(shù)
  142. {
  143.         if(key1==0)                                                          //設(shè)置鍵按下
  144.         {
  145.                 delay(10);                                                  //延時(shí)去抖
  146.                 if(key1==0)flag=1;                                  //再次判斷按鍵,按下的話進(jìn)入設(shè)置狀態(tài)
  147.                 while(key1==0);//松手檢測(cè)                  //按鍵釋放
  148.         }
  149.         while(flag==1)                                                  //進(jìn)入設(shè)置上限狀態(tài)
  150.         {
  151.                 d1=18;d2=shang/10;d3=shang%10;          //顯示字母H 和上限溫度值
  152.                 display();                                                  //調(diào)用顯示函數(shù)
  153.                 if(key1==0)                                                  //判斷設(shè)置鍵是否按下
  154.                 {
  155.                         delay(10);                                          //延時(shí)去抖
  156.                         if(key1==0)flag=2;                          //按鍵按下,進(jìn)入設(shè)置下限模式
  157.                         while(key1==0);//松手檢測(cè)
  158.                 }
  159.                 if(key2==0)                                                  //加鍵按下
  160.                 {
  161.                         delay(10);                                          //延時(shí)去抖
  162.                         if(key2==0)                                          //加鍵按下
  163.                         {
  164.                                 shang+=1;                                  //上限加5
  165.                                 if(shang>=100)shang=100;  //上限最大加到100
  166.                         }while(key2==0);//松手檢測(cè)
  167.                 }
  168.                 if(key3==0)                                                  //減鍵按下
  169.                 {
  170.                         delay(10);                                          //延時(shí)去抖
  171.                         if(key3==0)                                          //減鍵按下
  172.                         {
  173.                                 shang-=1;                                  //上限減1
  174.                                 if(shang<=10)shang=10;          //上限最小減到10
  175.                         }while(key3==0);//松手檢測(cè)
  176.                 }               
  177.         }
  178.         while(flag==2)                                                  //設(shè)置下限
  179.         {
  180.                 d1=17;d2=xia/10;d3=xia%10;                  //顯示字母L 顯示下限溫度值
  181.                 display();                                                  //注釋同上
  182.                 if(key1==0)
  183.                 {
  184.                         delay(10);
  185.                         if(key1==0)flag=0;
  186.                         while(key1==0);//松手檢測(cè)
  187.                 }
  188.                 if(key2==0)
  189.                 {
  190.                         delay(10);
  191.                         if(key2==0)
  192.                         {
  193.                                 xia+=1;
  194.                                 if(xia>=99)xia=99;
  195.                         }while(key2==0);//松手檢測(cè)
  196.                 }
  197.                 if(key3==0)
  198.                 {
  199.                         delay(10);
  200.                         if(key3==0)
  201.                         {
  202.                                 xia-=1;
  203.                                 if(xia<=0)xia=0;        
  204.                         }while(key3==0);//松手檢測(cè)
  205.                 }               
  206.         }
  207. }
  208. void zi_dong()//自動(dòng)溫控模式
  209. {
  210.         uchar i;
  211.         d1=dang;d2=wen_du/10;d3=wen_du%10;                //顯示檔位,顯示當(dāng)前溫度值
  212.         zi_keyscan();//按鍵掃描函數(shù)
  213.         display();         //調(diào)用顯示函數(shù)
  214.         
  215.         if(wen_du<xia)
  216.         {
  217.                 dang=1;                                                                                        //檔位置1
  218.                 for(i=0;i<3;i++){dj=0;display();zi_keyscan();}        //PWM通過(guò)延時(shí)得到
  219.                 for(i=0;i<1;i++){dj=1;display();zi_keyscan();}
  220.         }
  221.         if((wen_du>=xia)&&(wen_du<=shang))//溫度大于下限,小于上限  1擋
  222.         {
  223.                 dang=2;                                                                                        //檔位置2
  224.                 for(i=0;i<3;i++){dj=0;display();zi_keyscan();}        //PWM通過(guò)延時(shí)得到
  225.                 for(i=0;i<2;i++){dj=1;display();zi_keyscan();}               
  226.         }
  227.         if(wen_du>shang)
  228.   {
  229.     dj=1;
  230.                 dang=3;
  231.   }//高溫全速
  232.         
  233. }

  234. void shou_dong() //手動(dòng)模式
  235. {
  236.         uchar i;
  237.         d1=dang;
  238.         shou_keyscan();
  239.         display_1();
  240.         if(dang==1)
  241.         {
  242.                 dang=1;                                                                                        //檔位置1
  243.                 for(i=0;i<3;i++){dj=0;display_1();zi_keyscan();}        //PWM通過(guò)延時(shí)得到
  244.                 for(i=0;i<1;i++){dj=1;display_1();zi_keyscan();}
  245.         }
  246.         if(dang==2)//溫度大于下限,小于上限  1擋
  247.         {
  248.                 dang=2;                                                                                        //檔位置2
  249.                 for(i=0;i<3;i++){dj=0;display_1();zi_keyscan();}        //PWM通過(guò)延時(shí)得到
  250.                 for(i=0;i<2;i++){dj=1;display_1();zi_keyscan();}               
  251.         }
  252.         if(dang==3)
  253.   {
  254.     dj=1;
  255.                 dang=3;
  256.   }//高溫全速
  257. }

  258. void main()                  //主函數(shù)
  259. {
  260.         uchar j;
  261.         dp=1;     //蜂鳴器關(guān)
  262.         dj=0;                  //電機(jī)開(kāi)
  263.         for(j=0;j<80;j++)          //先讀取溫度值,防止開(kāi)機(jī)顯示85
  264.         ReadTemperature();
  265.         while(1)                          //進(jìn)入while循環(huán)
  266.         {        
  267.                
  268.                 if(key4==0)                                                          //自動(dòng)模式鍵按下
  269.                 {
  270.                         delay(10);                                                  //延時(shí)去抖
  271.                         if(key4==0)flag2=1;                                  //再次判斷按鍵,按下的話進(jìn)入自動(dòng)狀態(tài)
  272.                         while(key4==0);//松手檢測(cè)                  //按鍵釋放
  273.                 }
  274.                
  275.                 if(flag2==1)                                                  //進(jìn)入自動(dòng)模式
  276.                 {
  277.                         shang=30;
  278.                         xia=20;                  //初始上下限值
  279.                         ReadTemperature();        //讀取溫度值
  280.                         for(j=0;j<100;j++) zi_dong();//自動(dòng)溫控模式
  281.                         if(wen_du>30) {dp=0;}    //設(shè)置報(bào)警溫度
  282.                         else
  283.                         {dp=1;}
  284.                         if(key4==0)                                                  //判斷自動(dòng)模式鍵按下
  285.                         {
  286.                                 delay(10);                                          //延時(shí)去抖
  287.                                 if(key4==0)flag2=1;                          //判斷自動(dòng)鍵是否按下
  288.                                 while(key4==0);//松手檢測(cè)
  289.                         }
  290.                         if(key5==0)                                                  //判斷手動(dòng)模式鍵按下
  291.                         {
  292.                                 delay(10);                                          //延時(shí)去抖
  293.                                 if(key5==0)flag2=2;                          //判斷手動(dòng)鍵是否按下
  294.                          while(key5==0);//松手檢測(cè)
  295.                         }
  296.                 }
  297.                 if(key5==0)                                                          //手動(dòng)模式
  298.                 {
  299.                         delay(10);                                                  //延時(shí)去抖
  300.                         if(key5==0)flag2=2;                                  //再次判斷按鍵
  301.                         while(key5==0);//松手檢測(cè)                  //按鍵釋放
  302.                 }
  303.           if(flag2==2)                                                  //進(jìn)入手動(dòng)模式
  304.                 {
  305.                         for(j=0;j<100;j++) shou_dong();
  306.                         if(key5==0)                                                  //判斷設(shè)置鍵是否按下
  307.                         {
  308.                                 delay(10);                                          //延時(shí)去抖
  309.                                 if(key5==0)flag2=2;                          //判斷手動(dòng)鍵是否按下
  310.                                 while(key5==0);//松手檢測(cè)
  311.                         }
  312.                                 if(key4==0)                                                  //判斷設(shè)置鍵是否按下
  313.                         {
  314.                                 delay(10);                                          //延時(shí)去抖
  315.                                 if(key4==0)flag2=1;                          //判斷自動(dòng)鍵是否按下
  316.                                 while(key4==0);//松手檢測(cè)
  317.                         }
  318.                 }

  319.         }
  320. }
復(fù)制代碼

所有資料51hei提供下載:
智能溫控風(fēng)扇.7z (59.32 KB, 下載次數(shù): 65)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表