找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1217|回复: 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 单片机教程网

快速回复 返回顶部 返回列表