标题:
按键模拟智能小车调速单片机程序,前辈指导说是陷入死循环,修改后还是不行,求指导
[打印本页]
作者:
爱德华
时间:
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;
}
}
作者:
爱德华
时间:
2022-10-24 23:02
请各位前辈指导,耽误大家几分钟,感谢!!!!!!
作者:
glinfei
时间:
2022-10-25 08:58
具体什么问题,是不是电机不转啊?你给的PWM太小了,最大时间是5*10ms,都来不及转,先把speed放大10倍,至于死循环那句,加上是没错的,想优化程序也不能简单删除。
作者:
yzwzfyz
时间:
2022-10-26 10:22
你先画出程序流程图。
作者:
Avanti
时间:
2022-10-26 20:42
keyscan 函数里面不要用while,按键有可能是有抖动的。可以考虑用 while 加上限时间退出的方案。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1