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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2639|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: a在线观看 | 国产成人精品一区二区三区 | 国产成人综合av | 操亚洲 | 色综合欧美 | 性国产xxxx乳高跟 | 国产精品免费在线 | 成人伊人 | 国产精品有限公司 | 国产精品乱码一二三区的特点 | 99成人免费视频 | 亚洲成人免费在线观看 | 精精国产xxxx视频在线野外 | 国产综合视频 | 亚洲视频一区在线播放 | 欧美一区二区三区 | 欧美在线观看一区 | 亚洲高清在线 | 欧美在线a| 色综合天天天天做夜夜夜夜做 | 亚洲一区在线免费观看 | av天天澡天天爽天天av | 国产精品揄拍一区二区 | 久久国产婷婷国产香蕉 | 日韩精品一区二区三区视频播放 | 精品国产伦一区二区三区观看说明 | 日韩精品一区二区三区中文字幕 | 一区二区三区视频播放 | 婷婷一级片| 欧美乱大交xxxxx另类电影 | 国产99视频精品免费视频7 | 日本免费一区二区三区 | 盗摄精品av一区二区三区 | 美女啪啪国产 | 精品欧美一区二区精品久久 | 麻豆国产一区二区三区四区 | 国产激情在线观看视频 | 日韩成人在线播放 | 亚洲在线中文字幕 | 亚洲综合在线播放 | 亚洲第一福利视频 |