找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 915|回复: 4
收起左侧

按键模拟智能小车调速单片机程序,前辈指导说是陷入死循环,修改后还是不行,求指导

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 10 黑币奖励! 每人限 2 次
ID:64888 发表于 2022-10-24 23:01 | 显示全部楼层 |阅读模式
#include<stc12c5a60s2.h>
#define uchar unsigned char
#define uint unsigned int
sbit go=P1^7;//前进
sbit back=P3^7;//后退
sbit turn_left=P1^6;//左转
sbit turn_right=P3^6;//右转
sbit turn_whistle=P1^5;//鸣笛
sbit turn_light=P3^5;//亮灯
sbit whistle=P3^3;//喇叭接口
sbit light=P3^2;//LED接口
sbit quciken=P1^4;//加速
sbit moderate=P3^4;//减速
void delayms();
void keyscan();
uint light_a=0,pwm_n=0,speed=5;
//延时函数
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
//按键函数
void keyscan()
{
        //按键控制前进
        if(go==0)
        {
                delayms(10);
                if(go==0)
                {
                    P0=0x96;
                    //while(!go);之前在论坛上前辈指导是按键陷入死循环,我想这个按键是长按的,把松开按键的这段屏蔽掉,问题还是没有解决。
                }
        }
        else
        {
                P0=0x00;
        }
        //按键控制后退
        if(back==0)
        {
                delayms(10);
                if(back==0)
                {
                        P0=0x69;
                        //while(!back);该按键同样是一直按的,也把这段屏蔽掉试了。
                }
        }
        else
        {
                P0=0x00;
        }

        //按键控制左转
        if(turn_left==0)
        {
                delayms(10);
                if(turn_left==0)
                {
                        P0=0xa5;
                        //while(!turn_left);此处也屏蔽做了修改。
                }
        }
        else
        {
                P0=0x00;
        }
        //按键控制右转
        if(turn_right==0)
        {
                delayms(10);
                if(turn_right==0)
                {
                        P0=0x5a;
                        //while(!turn_right);此处也屏蔽做了修改。
                }
        }
        else
        {
                P0=0x00;        
        }
        //按键控制鸣笛
        if(turn_whistle==0)
        {
                delayms(10);
                if(turn_whistle==0)
                {
      whistle=0;
                        //while(!turn_whistle);此处也屏蔽做了修改。
                }
        }
        else
        {
          whistle=1;        
        }
        //按键控制亮灯
        if(turn_light==0)
        {
                delayms(10);
                if(turn_light==0)
                {
      light_a++;
                        if(light_a==1)
            {
                    light=0;
            }
            if(light_a>=2)
            {
                    light_a=0;
                    light=1;
            }
                        while(!turn_light);
                }
        }
        //按键控制减速
        if(quciken==0)
        {
                delayms(10);
                if(quciken==0)
                {
      speed++;
                        if(speed>=10)
            {
                    speed=10;
            }
                while(!quciken);//这个减速按键是点动的,所以这句留下来了。
                }
        }
        //按键控制加速
        if(moderate==0)
        {
                delayms(10);
                if(moderate==0)
                {
      speed--;
                        if(speed<=1)
            {
                    speed=0;
            }
                        while(!moderate);//这个加速按键是点动的,所以这句留下来了。
                }
        }
}
//主函数
void main()
{
       TMOD=0x01;//定时器0为工作方式1
       TH0=(65536-917)/256;//5ms定时初值设置
       TL0=(65536-917)%256;
        EA=1;//开总中断
        ET0=1;//开定时器0中断
        TR0=1;//启动定时器0中断
        while(1)//就这一块搞迷糊了,这样写对吗?按键扫描函数清除掉按键的松手检测,还是没能跳出死循环吗?请各位前辈指导该怎么改?
        {
                keyscan();
        }
}
void tim0()interrupt 1
{
        TR0=0;
        TH0=(65536-917)/256;//5ms定时初值设置
        TL0=(65536-917)%256;
        TR0=1;        
        pwm_n++;
        if(pwm_n>=10)
        {
              pwm_n=0;
        }
         if(pwm_n>=speed)
        {
              P2=0x00;
        }
        if(pwm_n<speed)
        {
              P2=0xf0;
        }
}

回复

使用道具 举报

ID:64888 发表于 2022-10-24 23:02 | 显示全部楼层
请各位前辈指导,耽误大家几分钟,感谢!!!!!!
回复

使用道具 举报

ID:844772 发表于 2022-10-25 08:58 | 显示全部楼层
具体什么问题,是不是电机不转啊?你给的PWM太小了,最大时间是5*10ms,都来不及转,先把speed放大10倍,至于死循环那句,加上是没错的,想优化程序也不能简单删除。
回复

使用道具 举报

ID:123289 发表于 2022-10-26 10:22 | 显示全部楼层
你先画出程序流程图。
回复

使用道具 举报

ID:1049071 发表于 2022-10-26 20:42 | 显示全部楼层
keyscan 函数里面不要用while,按键有可能是有抖动的。可以考虑用 while 加上限时间退出的方案。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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