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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機風扇程序怎么改?

[復制鏈接]
跳轉到指定樓層
樓主
要求是用5V電源供電,設計四個按鈕K1為全速,K2為停止,K3為半速,K4為自然風(剛開始每4s的時間內有1s在轉動,并過8s后每4s的時間內有2s在轉動,再過8s后每4s的時間內有3s在轉動,再過8s后全速轉動,再過8s后4s中又只有1s在轉動,如此循環復始)。并分別用四個指導燈指示這四種狀態,但是自然風按下,沒效果,而且其他鍵也用不了了,若要修改需要怎么做,請教大神。

#include"reg52.h"                        

typedef unsigned char u8;
typedef unsigned int u16;

sbit dj=P1^0;
sbit k1=P3^1;        //半速鍵
sbit k2=P3^0;        //全速鍵
sbit k3=P3^2;        //自然風鍵
sbit k4=P3^3;        //停止鍵
sbit smgwei1=P2^2;
sbit smgwei2=P2^3;
sbit smgwei3=P2^4;

u16 T1_H,T1_L,T0_H,T0_L;                                                                                 
u8 a,fr;                                                         //a表示占空比:0-100,fr*100后為PWM頻率值:1-255。

u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};                  //0-F段碼
                                            
void delay(u16 i)
{      
        while(i--);         
}

void init()
{         
        TMOD=0X01;
        EA=1;
        ET0=1;
}

void display()                              
       P0=smgduan[a/10];smgwei1=1; smgwei2=0;smgwei3=1;delay(100);P0=0X00;      
        P0=smgduan[a%10];smgwei1=0; smgwei2=0;smgwei3=1;delay(100);P0=0X00;        }

void key()
{      


           
         if(k1==0) {delay(1000);while(!k1);TR0=1;a=50;}
         if(k2==0) {delay(1000);while(!k2);TR0=1;a=100;}
         if(k3==0) {delay(1000);while(!k3);TR0=1;
                 a=100;
         delay(1000);
         a=0;
         delay(3000);
         a=100;
         delay(1000);
         a=0;
         delay(3000); //前8秒
         a=100;
         delay(2000);
         a=0;
         delay(2000);
         a=100;
         delay(2000);
         a=0;
         delay(2000);        //又8秒
         a=100;
         delay(3000);
         a=0;
         delay(1000);
         a=100;
         delay(3000);  
         a=0;
         delay(1000);   //又8秒
         a=100;
         delay(8000);                                
                        }
         if(k4==0) {delay(1000);while(!k4);TR0=0;dj=0;a=0;}
}

void time0 ()interrupt 1
{
dj=~dj;
if(dj==1) { TH0=T1_H;TL0=T1_L; }
if(dj==0) { TH0=T0_H;TL0=T0_L; }
}

void chuzhi()

{      
        T0_H=(65535-10000/fr+a*100/fr)/256;
        T0_L=(65535-10000/fr+a*100/fr)%256;
        //斷電時間初值;         
      
        T1_H=(65535-a*100/fr)/256;
        T1_L=(65535-a*100/fr)%256;         
        //供電時間初值;      
}

main()
{
        dj=0;fr=5;
        init();
        while(1)
        {
                chuzhi();
                key();
                display();
        }               
}

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

使用道具 舉報

沙發
ID:213173 發表于 2023-5-31 10:28 | 只看該作者
一般延時時間超過1ms就不宜使用阻滯延時,要用定時器計數的方法延時。給你改了,你試試。
  1. #include"reg52.h"                        

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit fan=P1^0;                        //輸出端
  5. sbit k1=P3^1;        //半速鍵
  6. sbit k2=P3^0;        //全速鍵
  7. sbit k3=P3^2;        //自然風鍵
  8. sbit k4=P3^3;        //停止鍵
  9. //sbit smgwei1=P2^2;
  10. //sbit smgwei2=P2^3;
  11. //sbit smgwei3=P2^4;

  12. u16 a;                 //a表示占空比:0-100
  13. u8 Key_value;
  14. bit flag_ms;//1ms中斷標志
  15. u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16.                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-F段碼
  17. u8 buf[4];
  18. /*                                            
  19. void delay(u16 i)
  20. {      
  21.         while(i--);         
  22. }*/

  23. void init()
  24. {         
  25.         TMOD=0x01;
  26.         TH0=(65536-1000)/256;
  27.         TL0=(65536-1000)%256;
  28.         TF0 = 0;                //清除TF0標志
  29.         TR0 = 1;                //定時器0開始計時
  30.         EA=1;
  31.         ET0=1;
  32. }

  33. void display()
  34. {
  35.         static u8 i;
  36.         buf[1]=smgduan[a/100%10];
  37.         buf[2]=smgduan[a/10%10];
  38.         buf[3]=smgduan[a%10];

  39.         P0=0x00;//清段碼(消隱)
  40.         P2&=0xe3;//清位碼
  41.         P2|=i<<2;//送位碼
  42.         P0=buf[i];//送段碼
  43.         i=++i%4; //循環計數
  44. }


  45. void key()
  46. {      
  47.         static u8 count=0;//消抖計數變量
  48.         static bit sign=0;//狀態標志
  49.         if(!k1||!k2||!k3||!k4)
  50.         {
  51.                 if(++count>=20 && sign==0)
  52.                 {
  53.                         sign=1;
  54.                         if(!k1)Key_value=1;//半速
  55.                         if(!k2)Key_value=2;//全速
  56.                         if(!k3)Key_value=3;//自然風
  57.                         if(!k4)Key_value=0;//停止
  58.                 }
  59.         }
  60.         else
  61.         {
  62.                 count=0;//清0計數變量
  63.                 sign=0; //清0狀態標志       
  64.         }
  65. }

  66. void chuzhi()
  67. {      
  68.         static u16 count=0;
  69.         switch(Key_value)
  70.         {
  71.                 case 0: buf[0]=smgduan[10]; a=0; break;  //'A'停止
  72.                 case 1: buf[0]=smgduan[11]; a=50; break; //'b'半速
  73.                 case 2: buf[0]=smgduan[12]; a=100; break;//'C'全速
  74.                 case 3: buf[0]=smgduan[13];              //'d'自然風
  75.                         count++;
  76.                         if(count<4000)a=25;
  77.                         if(count>=8000 && count<12000)a=50;
  78.                         if(count>=12000 && count<16000)a=75;
  79.                         if(count>=16000 && count<20000)a=100;
  80.                         if(count>=20000)count=0;
  81.                         break;
  82.         }
  83. }

  84. void main()
  85. {
  86.         fan=0;
  87.         init();
  88.         while(1)
  89.         {
  90.                 if(flag_ms)//周期1ms
  91.                 {
  92.                         flag_ms=0;
  93.                         display();
  94.                         chuzhi();
  95.                         key();
  96.                 }
  97.         }               
  98. }

  99. void time0 ()interrupt 1
  100. {
  101.         static u16 num=0;
  102.         TH0=(65536-1000)/256;//1ms
  103.         TL0=(65536-1000)%256;
  104.         flag_ms=1;
  105.         if(++num>=1000)//PWM周期1秒       
  106.                 num=0;
  107.         if((a*10)>num)fan=1;//風扇開
  108.         else fan=0;//風扇關
  109. }
復制代碼
回復

使用道具 舉報

板凳
ID:13282 發表于 2023-5-31 13:13 | 只看該作者
沙發邏輯清晰,結構簡潔,代碼簡練,堪稱模板。
回復

使用道具 舉報

地板
ID:291668 發表于 2023-5-31 14:10 | 只看該作者
頂起模板,頂禮膜拜!
回復

使用道具 舉報

5#
ID:1080991 發表于 2023-5-31 15:00 | 只看該作者
wulin 發表于 2023-5-31 10:28
一般延時時間超過1ms就不宜使用阻滯延時,要用定時器計數的方法延時。給你改了,你試試。

改了之后半速的電機斷斷續續的轉動,數碼管是050b,全速的可以不斷續轉動,但全速的數碼管顯示001C,自然風定時器好像快了,但都需要按住按鈕才可以保持
回復

使用道具 舉報

6#
ID:213173 發表于 2023-5-31 16:16 | 只看該作者
1506574080 發表于 2023-5-31 15:00
改了之后半速的電機斷斷續續的轉動,數碼管是050b,全速的可以不斷續轉動,但全速的數碼管顯示001C,自然 ...

這段代碼只是隨意修改的,未經實物調試。只要思路清晰了,要獲得滿意效果只要仔細調試就就行。
回復

使用道具 舉報

7#
ID:1080991 發表于 2023-5-31 16:28 | 只看該作者
wulin 發表于 2023-5-31 16:16
這段代碼只是隨意修改的,未經實物調試。只要思路清晰了,要獲得滿意效果只要仔細調試就就行。

好的謝謝大神了
回復

使用道具 舉報

8#
ID:213173 發表于 2023-5-31 16:34 | 只看該作者
1506574080 發表于 2023-5-31 15:00
改了之后半速的電機斷斷續續的轉動,數碼管是050b,全速的可以不斷續轉動,但全速的數碼管顯示001C,自然 ...

直流電機轉速與PWM占空比不是等比關系,占空比25%可能電機根本就轉不起來。要精確控制轉速需要通過閉環控制。

回復

使用道具 舉報

9#
ID:1080991 發表于 2023-5-31 17:08 | 只看該作者
wulin 發表于 2023-5-31 16:34
直流電機轉速與PWM占空比不是等比關系,占空比25%可能電機根本就轉不起來。要精確控制轉速需要通過閉環控 ...

這程序好像把占空比和轉動時間綁一起了,只有100占空比才一直轉,其它的都是斷續轉動,轉一會停一會
回復

使用道具 舉報

10#
ID:161164 發表于 2023-5-31 21:14 | 只看該作者
1506574080 發表于 2023-5-31 17:08
這程序好像把占空比和轉動時間綁一起了,只有100占空比才一直轉,其它的都是斷續轉動,轉一會停一會

大佬的PWM周期是1秒當然有點卡
以下20ms的PWM代碼
  1. void time0 ()interrupt 1
  2. {
  3.         static u16 num=0;
  4.                 static u8 SysDiv = 0;
  5.         TH0=(65536-200)/256;//0.2ms
  6.         TL0=(65536-200)%256;
  7.                 if(++SysDiv>=5)
  8.                 {
  9.                         SysDiv=0;
  10.                         flag_ms=1;
  11.                 }
  12.         if(++num>=100)//PWM周期1秒      
  13.                 num=0;
  14.         if(a>num)fan=1;//風扇開
  15.         else fan=0;//風扇關
  16. }
復制代碼



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰成人av| av黄在线观看 | 九九久久精品视频 | 亚洲一区二区日韩 | 99久久精品国产麻豆演员表 | 91精品一区二区三区久久久久 | 国产精品成人一区二区三区 | 国产精品人人做人人爽 | 欧美电影免费网站 | 一区在线观看 | 日韩在线免费 | 97成人精品 | 国产精品久久久亚洲 | 亚洲一区二区精品视频 | 欧美午夜一区二区三区免费大片 | 久久久www | 亚洲丝袜天堂 | 99久久久无码国产精品 | 国产精品久久久亚洲 | 久久久久久av | 亚洲国产一区二区三区 | 日韩一区二区三区在线视频 | 国产高清区 | 国产免费福利在线 | 午夜视频网 | 色又黄又爽网站www久久 | 精品在线一区二区三区 | 亚洲精品免费在线 | 精品国产乱码一区二区三区a | 国产成人免费视频网站高清观看视频 | 黑人巨大精品欧美黑白配亚洲 | 国产在线一区二区 | 美女天天干 | 国产 91 视频| 欧美 日韩 中文 | av香港经典三级级 在线 | 一级特黄网站 | 国产午夜精品一区二区三区 | 免费国产视频 | 欧美日韩第一页 | 久久久久久国产精品 |