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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2807|回復: 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;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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還是沒有變化,我實在是不知道錯哪里了,麻煩大佬能幫我修改一下
回復

使用道具 舉報

5#
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;
}
回復

使用道具 舉報

6#
ID:911698 發表于 2021-4-25 10:31 | 只看該作者
count 沒賦值,都是隨機的
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
ID:569384 發表于 2021-4-28 11:12 | 只看該作者
count++;
if(count<=19)
{
count=19;
}
請問這段是干什么用的?是不是寫錯了,if(count >= 19)吧?
回復

使用道具 舉報

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

使用道具 舉報

11#
ID:96072 發表于 2021-4-28 14:23 | 只看該作者
這種程序問題碰到過,花了好長時間才完善解決的,其實很簡單
回復

使用道具 舉報

12#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线二区 | 国产精品99久久久久久动医院 | 色又黄又爽网站www久久 | 国产精品久久久久久婷婷天堂 | 一区精品视频在线观看 | 玖玖在线精品 | 91在线观看视频 | 国产成人精品网站 | 91欧美 | 国产一区欧美 | 亚洲高清av | 国产成人综合在线 | 国产精品视频不卡 | 午夜精品久久久久久 | 欧美区在线观看 | 成年人免费网站 | 欧美综合在线视频 | 国产乱码精品一区二区三区中文 | 罗宾被扒开腿做同人网站 | 精品一二 | 黄a网| 福利视频一区二区 | 国产亚洲精品精品国产亚洲综合 | 国产一区在线视频 | 天天天天操 | 日韩精品在线免费观看 | 成人午夜电影在线观看 | 日韩毛片免费看 | 午夜羞羞| 精品国产乱码久久久久久果冻传媒 | 人人人人人爽 | 99国产精品久久久 | av一区二区三区四区 | 中文字幕成人在线 | 欧美亚洲视频 | www.国产精品 | 亚洲欧美精品国产一级在线 | 国产综合在线视频 | 成人一区二区电影 | av在线播放国产 | 美女一级毛片 |