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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機溫控風扇Proteus仿真+代碼

[復制鏈接]
跳轉到指定樓層
樓主
溫控風扇仿真圖


單片機源程序如下:
  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[]=                             //第一個數碼管數組沒有帶小數點
  9. {
  10.   0xc0,0xf9,0xa4,0xb0,0x99,
  11.   0x92,0x82,0xf8,0x80,0x90
  12. };                           
  13. uchar code ss1[]=                            //這個數碼管數組帶小數點
  14. {
  15.   0x40,0x79,0x24,0x30,0x19,
  16.   0x12,0x02,0x78,0x00,0x10,
  17.   0xc7,0x89,0xbf               //0xc7=L   0x89=H   0xbf=- 負號
  18. };                            //0-9為帶小數點的
  19. uchar ms;                      //定義一個計數變量
  20. sbit key1=P3^4;
  21. sbit key2=P3^5;
  22. sbit key3=P3^3;                             //按鍵控制 P3^4設置切換  3.5上下限加 3.6上下限減
  23. sbit led_0=P1^0;                            //上限溫度報警燈
  24. sbit led_2=P1^2;                            //下限溫度報警燈
  25. char H,L,T_ms;                              //用于設置上下限度  上下限度與要比較的數據類型最好相同                T_ms用于PWM調節
  26. uchar flag,PWM_ON;                          //PWM_ON是風扇開關標志位
  27. sbit Fan=P1^6;                              //風扇端口定義
  28. bit voled=0;                                //voled用來判斷風扇軟啟動
  29. int temp;                                   //存儲讀出來的溫度,與H,L上下限度數據類型相同

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

  34. void display()                                   //顯示函數
  35. {   
  36.      if(flag==0&&temp>=0)                  //溫度為正數時執行
  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)                   //溫度為負數時
  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 ,當上限值大于99時執行  
  50.                  if(H>=10&&H<=99)  Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]);                 //當上限值大于12小于99時執行  不顯示最高位
  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]);               //設置的為負數且介于0~-9之間時執行  不顯示十位
  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)                               //設置上限
  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);          //每修改一次上下限數據就寫進EEROM
  78.                   byte_write(0x2000,H);
  79.         }
  80.           else if(flag==2)
  81.                 {
  82.           if(L<H-1) L++;                //原則是下限不超過上限
  83.                   SectorErase(0x2200);
  84.                   byte_write(0x2200,L);
  85.         }       
  86.     }
  87. }

  88. if(!key2)                              //設置下限
  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);        //每修改一次上下限數據就寫進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)                             //設置上限下限切換按鍵
  109. {
  110.          delay(1000);
  111.          if(!key3)
  112.                 {
  113.                   while(!key3);
  114.           flag=(flag+1)%3;                       
  115.         }
  116. }
  117. }
  118. void alarm()                          //報警
  119. {
  120.        
  121. if(temp/10>=H)                         //上限,當測得的值,大于等于設定值得時候,
  122.   {
  123.         led_0=0;  PWM_ON=20;              //上限警示燈亮,風扇PWM調節最大
  124.   }
  125. else
  126.    {
  127.         led_0=1;
  128.    }

  129. if((L<=temp/10)&&(temp/10<=H))             //當溫度介于上下限之間時,風扇弱風轉動
  130. {
  131.            PWM_ON=4;
  132. }

  133. if(temp/10<=L)                                    //如果溫度在下限以下,那么風扇停止轉動  下限指示燈亮
  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()                           //主函數         
  144. {  
  145.         do
  146.          {
  147.                 temp=Temper();
  148.          }
  149.    while(temp==850);                   //因為DS18B20上電之后會讀出來850,但不是溫度值,所以等待讀出溫度值      
  150.         H=byte_read(0x2000);
  151.         L=byte_read(0x2200);                //讀EEROM里面的數據
  152.         if((H>99)||(L>99)||(L>=H))          //如果數據不對,賦予初始值
  153.          {
  154.                 H=35;
  155.                 L=16;                    
  156.          }  
  157.         TMOD=0x21;                          //使用兩個定時器,0工作在方式1,用來定時讀取與顯示溫度  1工作在方式2,用來模擬PWM
  158.         TH0=(65536-10000)/256;     
  159.         TL0=(65536-10000)%256;              //裝入初始值,一次定時10MS
  160.     TH1 = 0x06;
  161.     TL1 = 0x06;                         //一次定時0.25ms
  162.         EA=1;                               //  打開總中斷
  163.         ET0=1;                              //打開定時器0中斷      
  164.         TR0=1;                              //開始啟動定時器0
  165.         ET1=1;                              //打開定時器1中斷
  166.         TR1=1;                              //開始啟動定時器1
  167.                
  168. while(1)                              
  169.         {
  170.         display();                        //消影問題,仿真里對中斷里的顯示函數只執行一次,不能達到一直顯示
  171.                                               //所以,在仿真時解除屏蔽此語句,屏蔽中斷里的display();
  172.                 key();               
  173.                 alarm();

  174.         }
  175. }

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

  188. void T1_time() interrupt 3
  189. {
  190.   TH1 = 0x06;
  191.   TL1 = 0x06;                                             //一次定時0.25ms
  192.   T_ms++;
  193. if(voled==0&&temp/10>L)                     //軟啟動,因為電壓太低,風扇不易啟動/由溫度低于下限的不啟動到啟動,電壓太低也啟動不了
  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. }
復制代碼

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


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:888341 發表于 2021-4-1 16:09 | 只看該作者
怎么感覺沒用?測溫測不準 ?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级视频免费看 | 成人午夜看片 | 欧美在线观看网站 | 美女久久视频 | 国产精品视频免费观看 | 国产激情一区二区三区 | 91视频进入 | 日韩午夜激情 | 亚洲国产成人精品久久久国产成人一区 | 欧美一级久久 | 日本三级线观看 视频 | 国产高清精品一区 | 三级视频在线观看 | 一区二区三区四区在线 | 亚洲国产高清在线 | 国产91久久久久久久免费 | 国产在线网址 | 伊人色综合久久天天五月婷 | 国产精品一区二区日韩 | 精品福利一区 | 91精品国产92 | 亚洲视频区 | 久久色视频 | 在线91| 久久久久久久91 | 精品1区2区3区4区 | 男女啪啪网址 | 一道本不卡 | 日韩一区在线播放 | 国产1区2区3区 | 欧美6一10sex性hd | 91精品国产91久久久久久密臀 | 亚洲成人99 | 久久国产成人 | 在线国产中文字幕 | 一区二区三区视频在线 | 国产在线麻豆精品入口 | 91av免费版 | 一区二区在线 | 日韩av一区二区在线观看 | 亚洲精品大全 |