找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 162|回复: 5
打印 上一主题 下一主题
收起左侧

单片机风扇控制程序出错

[复制链接]
跳转到指定楼层
楼主
ID:1117783 发表于 2024-4-22 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大佬们这是我的风扇控制程序代码显示是没有报错的,但是输入进单片机里面却是无法运行的。麻烦各位大佬看看这是哪里的问题,用的是52单片机
#include <REGX52.H>
#include<stdio.h>
sbit DJA=P2^0;
sbit DJB=P2^1;
sbit S1=P3^2;
sbit S2=P3^3;
bit flag;
unsigned char number;
void delay(unsigned int i)
{
        unsigned int k;
        for(k=0;k<i;k++);
}
void pwm(bit a,bit b,unsigned int d1,unsigned int d2)
{
        DJB=a;
        DJA=b;
        delay(d1);
        DJA=0;
        DJB=0;
        delay(d2);
}
void main()
{
        flag=0;
        number=0x00;
        DJA=0;
        DJB=0;
        while(1)
        {
        if(S1==0)
        {
        delay(1200);
        if(S1==0)
        {
        while(!S1);
                flag=~flag;
        }
        if(S2==0)
        {delay(1200);
                if(S2==0)
                {
                        while(!S2);
                        if(number<=3)
                                number++;
                        else number=0x01;}
        }
        if(!flag)
        {
                switch(number)
                {
                        case 0x01:pwm(0,1,720,1680);break;
                        case 0x02:pwm(0,1,1250,1250);break;
                        case 0x03:pwm(0,1,1680,720);break;
                        default:;
                }
        }
        else
        {
        switch(number)
        {
                case 0x01:pwm(0,1,720,1680);break;
                case 0x02:pwm(0,1,1250,1250);break;
                case 0x03:pwm(0,1,1680,720);break;
                default:;}
        
        
        }
        }
        }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:8455 发表于 2024-4-22 18:12 | 只看该作者
后两个IF判断最好不在嵌套在S1按键内部。
回复

使用道具 举报

板凳
ID:277550 发表于 2024-4-22 18:36 | 只看该作者
程序代码的逻辑有问题吧,,,,,没有需求、说明也不详细,,,,大概理解,应该是这样

  1. #include <REGX52.H>
  2. #include<stdio.h>
  3. sbit DJA=P2^0;
  4. sbit DJB=P2^1;
  5. sbit S1 =P3^2;
  6. sbit S2 =P3^3;
  7. bit flag;
  8. unsigned char number;

  9. void delay(unsigned int i){
  10.         unsigned int k;
  11.         for(k=0;k<i;k++);
  12. }

  13. void pwm(bit a,bit b,unsigned int d1,unsigned int d2){
  14.         DJB=a;
  15.         DJA=b;
  16.         delay(d1);
  17.         DJA=0;
  18.         DJB=0;
  19.         delay(d2);
  20. }

  21. void main(){
  22.         flag=0;
  23.         number=0x00;
  24.         DJA=0;
  25.         DJB=0;
  26.         
  27.         while(1){
  28.                 if(S1==0){
  29.                         delay(1200);
  30.                         if(S1==0){
  31.                                 while(!S1);
  32.                                 flag=~flag;
  33.                         }
  34.                 }
  35.                
  36.                 if(S2==0){
  37.                         delay(1200);
  38.                         if(S2==0){
  39.                                 while(!S2);
  40.                                 if(number<=3) number++; else number=0x01;
  41.                         }
  42.                 }
  43.                
  44.                 if(!flag){
  45.                         switch(number){
  46.                         case 0x01:pwm(0,1, 720,1680);break;
  47.                         case 0x02:pwm(0,1,1250,1250);break;
  48.                         case 0x03:pwm(0,1,1680, 720);break;
  49.                         default:;
  50.                         }
  51.                 }else{
  52.                         switch(number){
  53.                         case 0x01:pwm(0,1, 720,1680);break;
  54.                         case 0x02:pwm(0,1,1250,1250);break;
  55.                         case 0x03:pwm(0,1,1680, 720);break;
  56.                         default:;
  57.                         }
  58.                 }
  59.         }
  60. }
复制代码




回复

使用道具 举报

地板
ID:1109793 发表于 2024-4-23 10:21 | 只看该作者
这pwm用delay完成,那pwm期间按键不是就扫不到了?
回复

使用道具 举报

5#
ID:11804 发表于 2024-4-24 17:37 | 只看该作者
#define pwm_max   100
uchar pwm,set_pwm;//set_pwm不大于pwm_max
void pwm_out
{   
    pwm++;
    if(pwm>pwm_max)pwm=0;
    iif(set_pwm>=pwm){DJA=1;DJB=1;}//
    else {DJA=0;DJB=0;}
   
}
回复

使用道具 举报

6#
ID:421260 发表于 2024-4-25 15:26 | 只看该作者
PWM和按键扫描建议不要用delay,换一种方式。
按键扫描中使用delay都是在教学视频中的程序,实战绝对不能用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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