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

QQ登錄

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

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

單片機(jī)溫控風(fēng)扇Proteus仿真+代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
溫控風(fēng)扇仿真圖


單片機(jī)源程序如下:
  1. #include<reg52.h>                                 //頭文件
  2. #include<intrins.h>
  3. #include "DS18b20.H"
  4. #include "eeprom52.h"
  5. #include "Nixie tube.h"

  6. #define uchar unsigned char                 //宏定義
  7. #define uint unsigned int

  8. uchar code ss[]=                             //第一個(gè)數(shù)碼管數(shù)組沒(méi)有帶小數(shù)點(diǎn)
  9. {
  10.   0xc0,0xf9,0xa4,0xb0,0x99,
  11.   0x92,0x82,0xf8,0x80,0x90
  12. };                           
  13. uchar code ss1[]=                            //這個(gè)數(shù)碼管數(shù)組帶小數(shù)點(diǎn)
  14. {
  15.   0x40,0x79,0x24,0x30,0x19,
  16.   0x12,0x02,0x78,0x00,0x10,
  17.   0xc7,0x89,0xbf               //0xc7=L   0x89=H   0xbf=- 負(fù)號(hào)
  18. };                            //0-9為帶小數(shù)點(diǎn)的
  19. uchar ms;                      //定義一個(gè)計(jì)數(shù)變量
  20. sbit key1=P3^4;
  21. sbit key2=P3^5;
  22. sbit key3=P3^3;                             //按鍵控制 P3^4設(shè)置切換  3.5上下限加 3.6上下限減
  23. sbit led_0=P1^0;                            //上限溫度報(bào)警燈
  24. sbit led_2=P1^2;                            //下限溫度報(bào)警燈
  25. char H,L,T_ms;                              //用于設(shè)置上下限度  上下限度與要比較的數(shù)據(jù)類型最好相同                T_ms用于PWM調(diào)節(jié)
  26. uchar flag,PWM_ON;                          //PWM_ON是風(fēng)扇開(kāi)關(guān)標(biāo)志位
  27. sbit Fan=P1^6;                              //風(fēng)扇端口定義
  28. bit voled=0;                                //voled用來(lái)判斷風(fēng)扇軟啟動(dòng)
  29. int temp;                                   //存儲(chǔ)讀出來(lái)的溫度,與H,L上下限度數(shù)據(jù)類型相同

  30. void delay(uint T)                                    //短延時(shí)
  31. {                                          
  32.         while(T--);
  33. }

  34. void display()                                   //顯示函數(shù)
  35. {   
  36.      if(flag==0&&temp>=0)                  //溫度為正數(shù)時(shí)執(zhí)行
  37.                 {
  38.          if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
  39.                  if(temp>99)  Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
  40.                  if(temp<99&&temp/100%10<=0)  Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);

  41.             }
  42.          if(flag==0&&temp<0)                   //溫度為負(fù)數(shù)時(shí)
  43.                 {
  44.          if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
  45.                  if(temp*-1/100%10>0)  Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
  46.             }
  47.      if(flag==1)                          //flag==0顯示溫度  =1 顯示上限   =2 顯示下限
  48.                 {
  49.          if(H>99)          Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]);        //溫度范圍是125~-55 ,當(dāng)上限值大于99時(shí)執(zhí)行  
  50.                  if(H>=10&&H<=99)  Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]);                 //當(dāng)上限值大于12小于99時(shí)執(zhí)行  不顯示最高位
  51.                  if(H<10&&H>=0)    Nixietube(ss1[11],0xff,0xff,ss[H%10]);                     //不顯示百位 十位
  52.                  if(H<0&&H>=-9)    Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]);               //設(shè)置的為負(fù)數(shù)且介于0~-9之間時(shí)執(zhí)行  不顯示十位
  53.          if(H<0&&H<-9)     Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]);          //最低可以到55                           
  54.         }
  55.                        
  56.          if(flag==2)   //同上                                                
  57.            {
  58.          if(L>99)          Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
  59.              if(L>=10&&L<=99)  Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
  60.              if(L<10&&L>=0)    Nixietube(ss1[10],0xff,0xff,ss[L%10]);
  61.          if(L<0&&L>=-9)  Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
  62.          if(L<0&&L<-9)  Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);         
  63.                          
  64.        }       
  65.   }
  66. void key()                              //按鍵處理
  67. {       
  68. if(!key1)                               //設(shè)置上限
  69. {
  70.     delay(500);
  71.         if(!key1)
  72.         {
  73.       while(!key1);//display();
  74.       if(flag==1)
  75.                   {
  76.                   if(H<125)H++;
  77.                   SectorErase(0x2000);          //每修改一次上下限數(shù)據(jù)就寫(xiě)進(jìn)EEROM
  78.                   byte_write(0x2000,H);
  79.         }
  80.           else if(flag==2)
  81.                 {
  82.           if(L<H-1) L++;                //原則是下限不超過(guò)上限
  83.                   SectorErase(0x2200);
  84.                   byte_write(0x2200,L);
  85.         }       
  86.     }
  87. }

  88. if(!key2)                              //設(shè)置下限
  89. {
  90.     delay(500);
  91.         if(!key2)
  92.          {
  93.         while(!key2);//display();
  94.                 if(flag==1)
  95.                     {
  96.                     if(H>L+1)  H--;             //原則上限不低于下限
  97.                 SectorErase(0x2000);        //每修改一次上下限數(shù)據(jù)就寫(xiě)進(jìn)EEROM
  98.                     byte_write(0x2000,H);
  99.           }
  100.                 else if        (flag==2)
  101.                    {
  102.                         if(L>-55)L--;
  103.                         SectorErase(0x2200);
  104.                         byte_write(0x2200,L);
  105.            }       
  106.      }
  107. }

  108. if(!key3)                             //設(shè)置上限下限切換按鍵
  109. {
  110.          delay(1000);
  111.          if(!key3)
  112.                 {
  113.                   while(!key3);
  114.           flag=(flag+1)%3;                       
  115.         }
  116. }
  117. }
  118. void alarm()                          //報(bào)警
  119. {
  120.        
  121. if(temp/10>=H)                         //上限,當(dāng)測(cè)得的值,大于等于設(shè)定值得時(shí)候,
  122.   {
  123.         led_0=0;  PWM_ON=20;              //上限警示燈亮,風(fēng)扇PWM調(diào)節(jié)最大
  124.   }
  125. else
  126.    {
  127.         led_0=1;
  128.    }

  129. if((L<=temp/10)&&(temp/10<=H))             //當(dāng)溫度介于上下限之間時(shí),風(fēng)扇弱風(fēng)轉(zhuǎn)動(dòng)
  130. {
  131.            PWM_ON=4;
  132. }

  133. if(temp/10<=L)                                    //如果溫度在下限以下,那么風(fēng)扇停止轉(zhuǎn)動(dòng)  下限指示燈亮
  134. {
  135.     led_2=0;  PWM_ON=0; voled=0;
  136.         Fan=1;
  137. }
  138. else
  139.   {
  140.       led_2=1;
  141.   }

  142. }
  143. void main()                           //主函數(shù)         
  144. {  
  145.         do
  146.          {
  147.                 temp=Temper();
  148.          }
  149.    while(temp==850);                   //因?yàn)镈S18B20上電之后會(huì)讀出來(lái)850,但不是溫度值,所以等待讀出溫度值      
  150.         H=byte_read(0x2000);
  151.         L=byte_read(0x2200);                //讀EEROM里面的數(shù)據(jù)
  152.         if((H>99)||(L>99)||(L>=H))          //如果數(shù)據(jù)不對(duì),賦予初始值
  153.          {
  154.                 H=35;
  155.                 L=16;                    
  156.          }  
  157.         TMOD=0x21;                          //使用兩個(gè)定時(shí)器,0工作在方式1,用來(lái)定時(shí)讀取與顯示溫度  1工作在方式2,用來(lái)模擬PWM
  158.         TH0=(65536-10000)/256;     
  159.         TL0=(65536-10000)%256;              //裝入初始值,一次定時(shí)10MS
  160.     TH1 = 0x06;
  161.     TL1 = 0x06;                         //一次定時(shí)0.25ms
  162.         EA=1;                               //  打開(kāi)總中斷
  163.         ET0=1;                              //打開(kāi)定時(shí)器0中斷      
  164.         TR0=1;                              //開(kāi)始啟動(dòng)定時(shí)器0
  165.         ET1=1;                              //打開(kāi)定時(shí)器1中斷
  166.         TR1=1;                              //開(kāi)始啟動(dòng)定時(shí)器1
  167.                
  168. while(1)                              
  169.         {
  170.         display();                        //消影問(wèn)題,仿真里對(duì)中斷里的顯示函數(shù)只執(zhí)行一次,不能達(dá)到一直顯示
  171.                                               //所以,在仿真時(shí)解除屏蔽此語(yǔ)句,屏蔽中斷里的display();
  172.                 key();               
  173.                 alarm();

  174.         }
  175. }

  176. void UART_1() interrupt 1
  177. {
  178.         TH0=(65536-10000)/256;
  179.         TL0=(65536-10000)%256;;           //一次定時(shí)10MS   
  180.         ms++;
  181.         //display();                      //顯示函數(shù)    因?yàn)閿?shù)碼管存在消影問(wèn)題,如果在電路上,不屏蔽此句子,如果需要仿真,屏蔽此句子,使用主函數(shù)里的顯示函數(shù)
  182.         if(ms>100)                        //每1秒刷新一次溫度數(shù)據(jù)
  183.         {
  184.          ms=0;
  185.          temp=Temper();                   //讀溫度
  186.         }
  187. }

  188. void T1_time() interrupt 3
  189. {
  190.   TH1 = 0x06;
  191.   TL1 = 0x06;                                             //一次定時(shí)0.25ms
  192.   T_ms++;
  193. if(voled==0&&temp/10>L)                     //軟啟動(dòng),因?yàn)殡妷禾停L(fēng)扇不易啟動(dòng)/由溫度低于下限的不啟動(dòng)到啟動(dòng),電壓太低也啟動(dòng)不了
  194.   {
  195.      voled=1;
  196.          Fan=0;
  197.          delay(3200);
  198.          Fan=1;
  199.   }       
  200. if(T_ms<PWM_ON)                 
  201.   {
  202.          Fan=0;
  203.   }
  204. else                                         
  205.   {
  206.          Fan=1;
  207.   }
  208. if(T_ms>20)
  209. {
  210.     T_ms=0;
  211. }
  212. }
復(fù)制代碼

所有資料51hei提供下載:
Desktop1.zip (334.04 KB, 下載次數(shù): 86)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:888341 發(fā)表于 2021-4-1 16:09 | 只看該作者
怎么感覺(jué)沒(méi)用?測(cè)溫測(cè)不準(zhǔn) ?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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