找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2677|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

使用單片機(jī)C語(yǔ)言SWITCH語(yǔ)句PWM程序無(wú)法運(yùn)行?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:781656 發(fā)表于 2021-4-23 15:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)程序不知為什么無(wú)法運(yùn)行,各位大佬幫忙看一下,試了半天也沒(méi)搞懂問(wèn)題所在

單片機(jī)源程序如下:
#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;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332214 發(fā)表于 2021-4-23 17:05 | 只看該作者
按你上面發(fā)的代碼 看 啟動(dòng)后 在定時(shí)器 PWM_T計(jì)數(shù)沒(méi)大1000的情況下 不管你按沒(méi)按ADD ,count 沒(méi)賦值,都是隨機(jī)的值,但肯定不會(huì)是0-19的值。所以switch沒(méi)用。
提個(gè)意見(jiàn):聲明變量 也要初始化。要有好的習(xí)慣。
回復(fù)

使用道具 舉報(bào)

板凳
ID:781656 發(fā)表于 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;                   //電機(jī)加減速鍵
//sbit SUB=P0^1;
sbit STOP=P0^2;                   //電機(jī)剎車(chē)鍵
sbit DIR=P0^3;                   //電機(jī)換向鍵
sbit PWM=P2^1;                   //脈沖輸出端口
sbit KA1=P0^4;                   //電機(jī)剎車(chē)?yán)^電器
sbit KA2=P0^5;         //電機(jī)換向繼電器
          
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;     //定時(shí)器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;
}
回復(fù)

使用道具 舉報(bào)

地板
ID:781656 發(fā)表于 2021-4-25 10:08 | 只看該作者
這個(gè)程序我改了一下,單按鍵每次加一,count還是沒(méi)有變化,我實(shí)在是不知道錯(cuò)哪里了,麻煩大佬能幫我修改一下
回復(fù)

使用道具 舉報(bào)

5#
ID:781656 發(fā)表于 2021-4-25 10:19 | 只看該作者
這是修改后的手動(dòng)程序,但程序還是沒(méi)有反應(yīng)
#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;                   //電機(jī)加減速鍵
//sbit SUB=P0^1;
sbit STOP=P0^2;                   //電機(jī)剎車(chē)鍵
sbit DIR=P0^3;                   //電機(jī)換向鍵
sbit PWM=P2^1;                   //脈沖輸出端口
sbit KA1=P0^4;                   //電機(jī)剎車(chē)?yán)^電器
sbit KA2=P0^5;         //電機(jī)換向繼電器
          
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;     //定時(shí)器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;
}
回復(fù)

使用道具 舉報(bào)

6#
ID:911698 發(fā)表于 2021-4-25 10:31 | 只看該作者
count 沒(méi)賦值,都是隨機(jī)的
回復(fù)

使用道具 舉報(bào)

7#
ID:196216 發(fā)表于 2021-4-25 10:44 | 只看該作者
                         if(count<=19)
                                {
                                count=19;
                                }
這里 會(huì)讓你加速鍵按下后賦值始終大于19,switch里面無(wú)選擇 可以再switch里加一句
default:break;
回復(fù)

使用道具 舉報(bào)

8#
ID:275826 發(fā)表于 2021-4-25 14:25 | 只看該作者
你這個(gè)程序只有中斷了,其他基本都做不了
回復(fù)

使用道具 舉報(bào)

9#
ID:569384 發(fā)表于 2021-4-28 11:12 | 只看該作者
count++;
if(count<=19)
{
count=19;
}
請(qǐng)問(wèn)這段是干什么用的?是不是寫(xiě)錯(cuò)了,if(count >= 19)吧?
回復(fù)

使用道具 舉報(bào)

10#
ID:844772 發(fā)表于 2021-4-28 11:32 | 只看該作者
TH0=0xFF;
TL0=0xFF;
這么裝,是準(zhǔn)備不停的中斷嗎?
回復(fù)

使用道具 舉報(bào)

11#
ID:96072 發(fā)表于 2021-4-28 14:23 | 只看該作者
這種程序問(wèn)題碰到過(guò),花了好長(zhǎng)時(shí)間才完善解決的,其實(shí)很簡(jiǎn)單
回復(fù)

使用道具 舉報(bào)

12#
ID:824490 發(fā)表于 2021-4-28 16:48 | 只看該作者
一長(zhǎng)串的case。這么有規(guī)律,為什么不優(yōu)化一下?

uint tc;

tc=1000-count*50
PWM=PWM_OUT(1000, tc);
代碼好看、又精簡(jiǎn)、又好用

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
haokey + 5 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表