找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1999|回复: 11
收起左侧

使用单片机C语言SWITCH语句PWM程序无法运行?

[复制链接]
ID:781656 发表于 2021-4-23 15:31 | 显示全部楼层 |阅读模式
这个程序不知为什么无法运行,各位大佬帮忙看一下,试了半天也没搞懂问题所在

单片机源程序如下:
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint a,b,c,d,e,PWM_T,time,count,value;

sbit ADD=P0^0;                   //一键加速
//sbit SUB=P0^1;
sbit STOP=P0^2;      
sbit DIR=P0^3;      
sbit PWM=P2^1;
sbit KA1=P0^4;  
sbit KA2=P0^5;  
           
bit PWM_OUTDAT=0;

void delay(uint z);
void add();
//void sub();
void stop();
void dir();
void timeconfig();
PWM_OUT(uint Cycle,uint PWM_ON);



void main()
{
        timeconfig();
        PWM=0;
        while(1)
        {
                add();
        //        sub();
                stop();
                dir();
                if(a==1)
                {               
                        if(PWM_T>=1000)
                        {
                                PWM_T=0;
                                count++;
                                if(count<=19)
                                {
                                count=19;
                                }
                        }
                }
                if(b==1)
                {
                        if(PWM_T>=100)
                        {
                                PWM_T=0;
                                count--;
                                if(count==0)
                                {
                                        count=0;
                                }
                        }
                }
                switch(count)
                {
                        case 0:
                                PWM=PWM_OUT(1000,950);
                                break;
                        case 1:
                                PWM=PWM_OUT(1000,900);
                                break;
                        case 2:
                                PWM=PWM_OUT(1000,850);
                                break;
                        case 3:
                                PWM=PWM_OUT(1000,800);
                                break;
                        case 4:
                                PWM=PWM_OUT(1000,750);
                                break;
                        case 5:
                                PWM=PWM_OUT(1000,700);
                                break;
                        case 6:
                                PWM=PWM_OUT(1000,650);
                                break;
                        case 7:
                                PWM=PWM_OUT(1000,600);
                                break;
                        case 8:
                                PWM=PWM_OUT(1000,550);
                                break;
                        case 9:
                                PWM=PWM_OUT(1000,500);
                                break;
                        case 10:
                                PWM=PWM_OUT(1000,450);
                                break;
                        case 11:
                                PWM=PWM_OUT(1000,400);
                                break;
                        case 12:
                                PWM=PWM_OUT(1000,350);
                                break;
                        case 13:
                                PWM=PWM_OUT(1000,300);
                                break;
                        case 14:
                                PWM=PWM_OUT(1000,250);
                                break;
                        case 15:
                                PWM=PWM_OUT(1000,200);
                                break;
                        case 16:
                                PWM=PWM_OUT(1000,150);
                                break;
                        case 17:
                                PWM=PWM_OUT(1000,100);
                                break;
                        case 18:
                                PWM=PWM_OUT(1000,50);
                                break;
                        case 19:
                                PWM=PWM_OUT(1000,0);
                                break;
                }
        }
}

void delay(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
                for(y=0;y<180;y++);
}

void add()
{
        if(ADD==0)
        {
                delay(5);
                if(ADD==0)
                {
                        a=1;
                        b=0;
                }               
        }
/*        else
                {
                        b=1;
                        a=0;
                }          */
}

void timeconfig()
{
        TMOD=0x01;     //¶¨ê±Æ÷01¤×÷óú·½ê½1
        TH0=0xFF;
        TL0=0xFF;
        TR0=1;
        ET0=1;
        EA=1;
}

void time0() interrupt 1
{
        TH0=0xFF;
        TL0=0xFF;
        value++;
        PWM_T++;
        
}

PWM_OUT(uint Cycle,uint PWM_ON)
{
        if(value>=PWM_ON)
        PWM_OUTDAT=0;
        else
        if(value>=Cycle)
        {
                value=0;
                if(PWM_ON!=0)
                {
                        PWM_OUTDAT=1;
                }
        }
        return PWM_OUTDAT;
}
回复

使用道具 举报

ID:332214 发表于 2021-4-23 17:05 | 显示全部楼层
按你上面发的代码 看 启动后 在定时器 PWM_T计数没大1000的情况下 不管你按没按ADD ,count 没赋值,都是随机的值,但肯定不会是0-19的值。所以switch没用。
提个意见:声明变量 也要初始化。要有好的习惯。
回复

使用道具 举报

ID:781656 发表于 2021-4-25 10:07 | 显示全部楼层
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint a,b,c,d,e,PWM_T,time,count=1,value;

sbit ADD=P0^0;                   //电机加减速键
//sbit SUB=P0^1;
sbit STOP=P0^2;                   //电机刹车键
sbit DIR=P0^3;                   //电机换向键
sbit PWM=P2^1;                   //脉冲输出端口
sbit KA1=P0^4;                   //电机刹车继电器
sbit KA2=P0^5;         //电机换向继电器
          
bit PWM_OUTDAT;

void delay(uint z);
void add();
//void sub();
void stop();
void dir();
void timeconfig();
PWM_OUT(uint Cycle,uint PWM_ON);



void main()
{
        timeconfig();
        add();
        PWM=0;
        while(1)
        {
                add();
        //        sub();
                stop();
                dir();
               
                switch(count)
                {
                        case 1:
                                PWM=PWM_OUT(1000,950);
                                break;
                        case 2:
                                PWM=PWM_OUT(1000,900);
                                break;
                        case 3:
                                PWM=PWM_OUT(1000,850);
                                break;
                        case 4:
                                PWM=PWM_OUT(1000,800);
                                break;
                        case 5:
                                PWM=PWM_OUT(1000,750);
                                break;
                        case 6:
                                PWM=PWM_OUT(1000,700);
                                break;
                        case 7:
                                PWM=PWM_OUT(1000,650);
                                break;
                        case 8:
                                PWM=PWM_OUT(1000,600);
                                break;
                        case 9:
                                PWM=PWM_OUT(1000,550);
                                break;
                        case 10:
                                PWM=PWM_OUT(1000,500);
                                break;
                        case 11:
                                PWM=PWM_OUT(1000,450);
                                break;
                        case 12:
                                PWM=PWM_OUT(1000,400);
                                break;
                        case 13:
                                PWM=PWM_OUT(1000,350);
                                break;
                        case 14:
                                PWM=PWM_OUT(1000,300);
                                break;
                        case 15:
                                PWM=PWM_OUT(1000,250);
                                break;
                        case 16:
                                PWM=PWM_OUT(1000,200);
                                break;
                        case 17:
                                PWM=PWM_OUT(1000,150);
                                break;
                        case 18:
                                PWM=PWM_OUT(1000,100);
                                break;
                        case 19:
                                PWM=PWM_OUT(1000,50);
                                break;
                        case 20:
                                PWM=PWM_OUT(1000,0);
                                break;
                }
        }
}

void delay(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
                for(y=0;y<180;y++);
}

void add()
{
        if(ADD==0)
        {
                delay(5);
                if(ADD==0)
                {
                        count++;
                        if(count>=20)
                        {
                                count=20;
                        }
                }
                while(!ADD);               
        }
}

void timeconfig()
{
        TMOD=0x01;     //定时器0工作于方式1
        TH0=0xFF;
        TL0=0xFF;
        TR0=1;
        ET0=1;
        EA=1;
}

void time0() interrupt 1
{
        TH0=0xFF;
        TL0=0xFF;
        value++;
        PWM_T++;
/*        if(a==1)
                {               
                        if(PWM_T>=60000)
                        {
                                PWM_T=0;
                                count++;
                                if(count<=19)
                                {
                                count=19;
                               
                                }
                        }
                }
                if(b==1)
                {
                        if(PWM_T>=100)
                        {
                                PWM_T=0;
                                count--;
                                if(count==0)
                                {
                                        count=0;
                                }
                        }
                }         */
}

PWM_OUT(uint Cycle,uint PWM_ON)
{
        if(value>=PWM_ON)
        PWM_OUTDAT=0;
        else
        if(value>=Cycle)
        {
                value=0;
                if(PWM_ON!=0)
                {
                        PWM_OUTDAT=1;
                }
        }
        return PWM_OUTDAT;
}
回复

使用道具 举报

ID:781656 发表于 2021-4-25 10:08 | 显示全部楼层
这个程序我改了一下,单按键每次加一,count还是没有变化,我实在是不知道错哪里了,麻烦大佬能帮我修改一下
回复

使用道具 举报

ID:781656 发表于 2021-4-25 10:19 | 显示全部楼层
这是修改后的手动程序,但程序还是没有反应
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint a,b,c,d,e,PWM_T,time,count=1,value;

sbit ADD=P0^0;                   //电机加减速键
//sbit SUB=P0^1;
sbit STOP=P0^2;                   //电机刹车键
sbit DIR=P0^3;                   //电机换向键
sbit PWM=P2^1;                   //脉冲输出端口
sbit KA1=P0^4;                   //电机刹车继电器
sbit KA2=P0^5;         //电机换向继电器
          
bit PWM_OUTDAT;

void delay(uint z);
void add();
//void sub();
void stop();
void dir();
void timeconfig();
PWM_OUT(uint Cycle,uint PWM_ON);



void main()
{
        timeconfig();
        add();
        PWM=0;
        while(1)
        {
                add();
        //        sub();
                stop();
                dir();
               
                switch(count)
                {
                        case 1:
                                PWM=PWM_OUT(1000,950);
                                break;
                        case 2:
                                PWM=PWM_OUT(1000,900);
                                break;
                        case 3:
                                PWM=PWM_OUT(1000,850);
                                break;
                        case 4:
                                PWM=PWM_OUT(1000,800);
                                break;
                        case 5:
                                PWM=PWM_OUT(1000,750);
                                break;
                        case 6:
                                PWM=PWM_OUT(1000,700);
                                break;
                        case 7:
                                PWM=PWM_OUT(1000,650);
                                break;
                        case 8:
                                PWM=PWM_OUT(1000,600);
                                break;
                        case 9:
                                PWM=PWM_OUT(1000,550);
                                break;
                        case 10:
                                PWM=PWM_OUT(1000,500);
                                break;
                        case 11:
                                PWM=PWM_OUT(1000,450);
                                break;
                        case 12:
                                PWM=PWM_OUT(1000,400);
                                break;
                        case 13:
                                PWM=PWM_OUT(1000,350);
                                break;
                        case 14:
                                PWM=PWM_OUT(1000,300);
                                break;
                        case 15:
                                PWM=PWM_OUT(1000,250);
                                break;
                        case 16:
                                PWM=PWM_OUT(1000,200);
                                break;
                        case 17:
                                PWM=PWM_OUT(1000,150);
                                break;
                        case 18:
                                PWM=PWM_OUT(1000,100);
                                break;
                        case 19:
                                PWM=PWM_OUT(1000,50);
                                break;
                        case 20:
                                PWM=PWM_OUT(1000,0);
                                break;
                }
        }
}

void delay(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
                for(y=0;y<180;y++);
}

void add()
{
        if(ADD==0)
        {
                delay(5);
                if(ADD==0)
                {
                        count++;
                        if(count>=20)
                        {
                                count=20;
                        }
                }
                while(!ADD);               
        }
}

void timeconfig()
{
        TMOD=0x01;     //定时器0工作于方式1
        TH0=0xFF;
        TL0=0xFF;
        TR0=1;
        ET0=1;
        EA=1;
}

void time0() interrupt 1
{
        TH0=0xFF;
        TL0=0xFF;
        value++;
        PWM_T++;
/*        if(a==1)
                {               
                        if(PWM_T>=60000)
                        {
                                PWM_T=0;
                                count++;
                                if(count<=19)
                                {
                                count=19;
                               
                                }
                        }
                }
                if(b==1)
                {
                        if(PWM_T>=100)
                        {
                                PWM_T=0;
                                count--;
                                if(count==0)
                                {
                                        count=0;
                                }
                        }
                }         */
}

PWM_OUT(uint Cycle,uint PWM_ON)
{
        if(value>=PWM_ON)
        PWM_OUTDAT=0;
        else
        if(value>=Cycle)
        {
                value=0;
                if(PWM_ON!=0)
                {
                        PWM_OUTDAT=1;
                }
        }
        return PWM_OUTDAT;
}
回复

使用道具 举报

ID:911698 发表于 2021-4-25 10:31 | 显示全部楼层
count 没赋值,都是随机的
回复

使用道具 举报

ID:196216 发表于 2021-4-25 10:44 | 显示全部楼层
                         if(count<=19)
                                {
                                count=19;
                                }
这里 会让你加速键按下后赋值始终大于19,switch里面无选择 可以再switch里加一句
default:break;
回复

使用道具 举报

ID:275826 发表于 2021-4-25 14:25 | 显示全部楼层
你这个程序只有中断了,其他基本都做不了
回复

使用道具 举报

ID:569384 发表于 2021-4-28 11:12 | 显示全部楼层
count++;
if(count<=19)
{
count=19;
}
请问这段是干什么用的?是不是写错了,if(count >= 19)吧?
回复

使用道具 举报

ID:844772 发表于 2021-4-28 11:32 | 显示全部楼层
TH0=0xFF;
TL0=0xFF;
这么装,是准备不停的中断吗?
回复

使用道具 举报

ID:96072 发表于 2021-4-28 14:23 | 显示全部楼层
这种程序问题碰到过,花了好长时间才完善解决的,其实很简单
回复

使用道具 举报

ID:824490 发表于 2021-4-28 16:48 | 显示全部楼层
一长串的case。这么有规律,为什么不优化一下?

uint tc;

tc=1000-count*50
PWM=PWM_OUT(1000, tc);
代码好看、又精简、又好用

评分

参与人数 1黑币 +5 收起 理由
haokey + 5 赞一个!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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