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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3555|回復: 6
收起左側

單片機智能風扇程序出了點問題,歡迎大佬們來解答

[復制鏈接]
ID:362355 發表于 2018-7-8 19:53 | 顯示全部樓層 |閱讀模式
要求設計一個智能風扇的控制電路,可以控制風扇的轉速、工作時間等
用5V電源供電,設計四個按鈕K1為全速,K2為停止,K3為半速,K4為自然風(剛開始每4S的時間內有1S在轉動,并過8S后每4S的時間內有2S在轉動,再過8S后每4S的時間內有3S在轉動,再過8S后全速轉動,再過8S后4S中又只有1S在轉動,如此循環復始)。并分別用四個指導燈指示這四種狀態,要用LED指示風扇的轉速(每秒)。//現在出現的問題是,K1到K3的功能可以隨意切換,到了K4就必須等24秒才可以和其他功能按鍵切換。。。。。我想任意切換功能的。。。
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define led_wx P2
  5. #define led_dx P0
  6. /*-------------定義數碼管的字型碼與字位碼----------------------*/
  7. uchar code no[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //數字0~9
  8. uchar code wex[]={0x01,0x02,0x04,0x08};    //字位碼
  9. /*-------------定義變量------------------*/
  10. uchar ledplay[4];
  11. uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;
  12. /*-------------定義端口-----------------*/
  13. sbit K1=P1^0;                                                //占空比為100(全速)
  14. sbit K2=P1^1;                                                                   //占空比為0(停止)
  15. sbit K3=P1^2;                                                                                           //占空比為50(半速)
  16. sbit K4=P1^3;
  17. sbit D8=P1^4;//指示燈
  18. sbit D7=P1^5;
  19. sbit D6=P1^6;
  20. sbit D5=P1^7;                                                                                                         //自然風
  21. sbit out=P3^4;                                                                                       
  22. sbit out1=P3^7;
  23. /*----------------延時1ms函數-------------------*/
  24. void delay(uint z)
  25. {

  26. uint x,y;
  27. for(x=0;x<z;x++)
  28.      for(y=0;y<110;y++);
  29. }



  30. /*------------自然風模式----------------*/
  31. void naturemode()
  32. {         
  33.      m=100;
  34.          delay(1000);
  35.          m=0;
  36.          delay(3000);
  37.          m=100;
  38.          delay(1000);
  39.          m=0;
  40.          delay(3000); //前8秒
  41.          m=100;
  42.          delay(2000);
  43.          m=0;
  44.          delay(2000);
  45.          m=100;
  46.          delay(2000);
  47.          m=0;
  48.          delay(2000);        //又8秒
  49.          m=100;
  50.          delay(3000);
  51.          m=0;
  52.          delay(1000);
  53.          m=100;
  54.          delay(3000);  
  55.          m=0;
  56.          delay(1000);   //又8秒
  57.          m=100;
  58.          delay(8000);  
  59. }
  60. /*----------初始化函數-------------------*/
  61. void init()
  62. {
  63.   TMOD=0x01;               //定時器方式1           
  64.   TH0=0xd8;
  65.   TL0=0xf0;               //定時器0裝入初值(10ms)
  66.   EA=1;                     //開總中斷
  67.   ET0=1;                     //定時器0中斷允許
  68.   TR0=1;                                       //
  69.   EX1=1;                                       //外部中斷1允許
  70.   IT1=1;                     //外部中斷1下降沿觸發  
  71. TH1=0xff;
  72.   TL1=0x9c;                //定時100us
  73.   ET1=1;                   //定時器1開中斷
  74.   TR1=1;                                   //定時器1啟動
  75. }
  76. /*----------鍵盤掃描函數----------------*/
  77. void keyscan()  
  78. {  
  79.   if(K1==0)     
  80.   {
  81.     delay(5);      //消除抖動
  82.          if(K1==0)
  83.          {         D8=0;
  84.                  D7=1;
  85.                  D6=1;
  86.                  D5=1;
  87.                   m=100;
  88.                  
  89.      }
  90.   }
  91.   if(K2==0)
  92.   {
  93.     delay(5);
  94.          if(K2==0)
  95.          {         D8=1;
  96.                  D7=0;
  97.                  D6=1;
  98.                  D5=1;
  99.                  m=0;
  100.          }
  101.   }
  102.     if(K3==0)
  103.   {
  104.     delay(5);
  105.          if(K3==0)
  106.          {        D8=1;
  107.                 D7=1;
  108.                 D6=0;
  109.                 D5=1;
  110.             m=50;
  111.                
  112.          }
  113.   }
  114.   if(K4==0)
  115.   {
  116.     delay(5);
  117.          if(K4==0)
  118.          {        D8=1;
  119.                 D7=1;
  120.                 D6=1;
  121.                 D5=0;
  122.                 while(K1&&K2&&K3==1)
  123.          {        naturemode();} //自然風模式
  124.                
  125.         
  126.                     
  127.          }
  128.   }   
  129. }

  130. /*-----------數碼管顯示函數--------------*/

  131. void putin() //向led緩沖區填充數據
  132. {zhuansu=zhuansu*20;
  133. ledplay[0]=no[zhuansu/1000];         //千位
  134.   ledplay[1]=no[zhuansu/100%10];//百位
  135.   ledplay[2]=no[zhuansu/10%10];//十位
  136.   ledplay[3]=no[zhuansu%10];//個位
  137.   }
  138. void display()        //將緩沖區的數據顯示到數碼管上
  139. {
  140.   uchar i;
  141.   putin();
  142.   for(i=0;i<4;i++)
  143.   {
  144.   led_wx=wex[i];
  145.   led_dx=ledplay[i];
  146.   delay(2);
  147. }
  148. }

  149. void main()
  150. {
  151.     flag_1=0;
  152.          m=0;                                                         //占空比為100
  153.         zhuansu=0;                                           //轉速初值0
  154.         flag=0;
  155.         zheng=1;                                  //初始化電機正轉動
  156.         fan=0;

  157.     init();              //初始化

  158.         while(1)
  159.         {
  160.         keyscan();                                //鍵盤掃描程序
  161.         
  162.                   
  163.         }
  164. }
  165. void int1()interrupt 2                                //外部中斷1脈沖技術記錄電機的轉速 電機轉一圈zhuansu加一
  166. {
  167.   zhuansu++;
  168. }
  169. void int2()interrupt 1                                  //定時器0顯示轉速
  170. {

  171.   TH0=0xd8;
  172.   TL0=0xf0;//定時10ms
  173.   flag++;
  174.          
  175.   if(flag==5)                                   //計時到達0.05s
  176.     {
  177.         display();                                        //顯示轉速
  178.         zhuansu=0;                                          //轉速置0
  179.         flag=0;
  180.         }
  181. }
  182. void int3()interrupt 3                                         //定時器1產生PWM
  183. {
  184.   
  185.   TH1=0xff;
  186.   TL1=0x9c;//定時100us
  187.           flag_1++;

  188.     if(flag_1>99)
  189.         flag_1=1;
  190.         if(flag_1<m)                                          //小于占空比m輸出PWM=0輸出電壓為1
  191.        {out=0;
  192.          out1=1;
  193.           }
  194.          else                                                  //大于占空比輸出電壓為0
  195.            {
  196.            out=1;
  197.            out1=1;
  198.            }
  199.           }
復制代碼
回復

使用道具 舉報

ID:367314 發表于 2018-7-9 09:12 | 顯示全部樓層
你好,請問能發下仿真圖嗎
回復

使用道具 舉報

ID:335709 發表于 2018-7-9 09:21 | 顯示全部樓層
問題出在:你的自然風模式控制方式,是用 delay 實現“一根筋”式控制。
需要改成:
1. 拋棄 delay 函數,
2. 開一個毫秒級定時器,
3. 設置一個工作模式變量,和一組狀態變量,詳細當前的工作狀態、階段等,
4. 在主循環中,檢查模式、狀態變量,結合經過的時間值,在恰當的時候,切換輸出、并更新相應變量
這,才是“智能控制”該有的樣子
回復

使用道具 舉報

ID:367855 發表于 2018-7-9 12:32 | 顯示全部樓層
中斷中不能使用主函數或子函數中用過的延時,如果你用了,很有可能跳不出中斷,我建議再加一個一模一樣的延時子函數,然后再調用
回復

使用道具 舉報

ID:155507 發表于 2018-7-9 16:28 | 顯示全部樓層
用到delay 阻塞延時實現, 方法效率很低, 讓芯片在那兒空運行幾百毫秒,什么也不做,真是莫大的浪費,尤其在芯片頻率較高,任務又很多時,這樣做就像在平坦寬闊的高速公路上挖了一大坑,出現事故可想而知。

需調用非阻塞延時程序
回復

使用道具 舉報

ID:659573 發表于 2019-12-10 12:35 | 顯示全部樓層
請問您這個還有程序和原理圖嗎?
回復

使用道具 舉報

ID:1000345 發表于 2022-1-7 08:39 來自手機 | 顯示全部樓層
還有這就是他的仿真圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线视频 | 一区二区三区网站 | 久久亚洲精品久久国产一区二区 | 中文字幕一区二区三区四区 | 一区二区三区欧美在线观看 | 国产精品亚洲综合 | 色婷婷综合久久久中文字幕 | 精品久久久网站 | 日韩av看片| 日本在线网址 | 荷兰欧美一级毛片 | 精品永久| 91在线免费视频 | 午夜精品一区二区三区在线观看 | 久久久久国产精品一区二区 | 亚洲福利一区 | 天天弄天天操 | av大片在线观看 | 日韩一级免费看 | 午夜精品一区二区三区在线视频 | 日韩有码一区 | 欧美电影免费观看高清 | 国产精品国产三级国产aⅴ中文 | 免费成人国产 | 亚洲国产一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 日韩一区二区在线免费观看 | 成人国产精品视频 | www.一区二区 | 91大神在线看 | 亚洲精品免费在线 | 国产精品a久久久久 | 一区精品国产欧美在线 | 操操网站 | 精品国产青草久久久久96 | 国产网站久久 | 成人精品视频99在线观看免费 | 午夜视频免费在线观看 | 亚洲精品久久久久avwww潮水 | 欧美国产在线一区 | 91视频一区二区三区 |