找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1122|回复: 6
收起左侧

单片机按键模拟智能小车控制程序的加减速不受控,标红部分程序哪里有问题?

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:64888 发表于 2022-10-22 23:59 | 显示全部楼层 |阅读模式
各位朋友帮忙看下 单片机源程序如下:
#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;
sbit quciken=P1^4;
sbit moderate=P3^4;
void delayms();
void keyscan();
uchar light_a=0,pwm_n=0;
uint speed=0;
//延时函数
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=speed+2;
                        if(speed>=10)
            {
                    speed=10;
            }
                while(!quciken);
                }
        }
        //按键控制加速
        if(moderate==0)
        {
                delayms(10);
                if(moderate==0)
                {
      speed=speed-2;
                        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();
                if(pwm_n>=speed)
          {
                  P2=0x00;
          }
          if(pwm_n<speed)
          {
            P2=0xf0;
          }
        }
}
void tim0()interrupt 1
{
        TH0=(65536-917)/256;//5ms定时初值设置
        TL0=(65536-917)%256;        
        pwm_n++;
        if(pwm_n>=9)
        {
                pwm_n=0;
        }
}

回复

使用道具 举报

ID:86926 发表于 2022-10-23 17:00 | 显示全部楼层
你的按键是死循环检测放开按键;当有一个按键按下没有放手时;程序就在这个按键这里死循环不会执行其他的程序了;除了中断外
回复

使用道具 举报

ID:844772 发表于 2022-10-24 08:31 | 显示全部楼层
uint speed=0;    speed=speed-2;  那这时speed的值是多少啊?要按多少次才能减下来,你的系统状态又是什么了。
回复

使用道具 举报

ID:1048933 发表于 2022-10-24 09:12 | 显示全部楼层
有死循环跳不出去
回复

使用道具 举报

ID:64888 发表于 2022-10-24 10:44 来自手机 | 显示全部楼层
蓝魄 发表于 2022-10-23 17:00
你的按键是死循环检测放开按键;当有一个按键按下没有放手时;程序就在这个按键这里死循环不会执行其他的程 ...

那怎么改呢,感谢指导!
回复

使用道具 举报

ID:64888 发表于 2022-10-24 10:44 来自手机 | 显示全部楼层
YLHYLHYLHLLL 发表于 2022-10-24 09:12
有死循环跳不出去

怎么改才能让他跳出去,不会玩了,感谢!
回复

使用道具 举报

ID:86926 发表于 2022-10-26 19:07 | 显示全部楼层
爱德华 发表于 2022-10-24 10:44
那怎么改呢,感谢指导!

改了循环再把定时器的中断里的中断标志位清一下;好像STC的51芯片要软件清零中断标志位的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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