实在不知道毛病出在哪?大神进来看看
确实不知道问题出在哪了,帖子都快沉下去了,也没解决问题,重新再发帖!!!目的:两个按键控制两个直流电机调速,长按键(>=2s)时对应电机加速,相反减速。(补充:该程序在一个按键一个电机时达到要求,当程序中补充到两个电机两个按键时未达到要求,出现的问题是按键时间长短好像都是出现的减速,而且有时按好几下才减,在该程序下连接一个电机也是上述问题),望高手指点。
————自学51小菜鸟
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit U1=P1^1;
sbit U2=P1^2;
sbit KEY1=P3^4;
sbit KEY2=P3^3;
uchar num,num1,num2,keytime,keynum,numt,numspeed1,numspeed2;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
if(KEY1==0||KEY2==0)
{
delayms(10);
if(KEY1==0||KEY2==0)
{
if(KEY1==0) keynum=1;
if(KEY2==0) keynum=2;
while((!KEY1)||(!KEY2))
{
TR1=1;
}
TR1=0;
keytime=numt;
numt=0;
}
if(keytime>=40)
{
switch(keynum)
{
case 1:
{
{
numspeed1=numspeed1+2;
if(numspeed1>16)
numspeed1=8;
}
keynum=0;
break;
}
case 2:
{
{
numspeed2=numspeed2+2;
if(numspeed2>16)
numspeed2=8;
}
keynum=0;
break;
}
}
}
if(keytime<40)
{
switch(keynum)
{
case 1:
{
{
numspeed1=numspeed1-2;
if(numspeed1<8)
numspeed1=8;
}
keynum=0;
break;
}
case 2:
{
{
numspeed2=numspeed2-2;
if(numspeed2<8)
numspeed2=8;
}
keynum=0;
break;
}
}
}
keytime=0;
}
}
void init()
{
TMOD|=0x11;
TH0=(65536-20)/256; //20us
TL0=(65536-20)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TR0=1; //启动定时器0
}
void main()
{
init();
U1=1;
U2=1;
numspeed1=12;
numspeed2=12;
while(1)
{
keyscan();
}
}
void Time0_Init() interrupt 1 //定时器0作用是控制PWM
{
TH0=(65536-20)/256; //20us
TL0=(65536-20)%256;
num1++;
num2++;
if(num1<numspeed1)
U1=1;
else U1=0;
if(num1>20)
num1=0;
if(num2<numspeed2)
U2=1;
else U2=0;
if(num2>20)
num2=0;
}
void Time1_Init() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
numt++;
}
有高手说把键盘扫描分开写,我也照做了,毛病依然如故,确实检查不出来了,高手们使劲把你们的观点提出来吧,本人不胜感激。 本人在校学生,车辆专业,自学51不久,不太懂硬件,只看了些郭天祥视频,在此想找个单片机高手师傅学习指导,有意者可以加Q:455238065. 同情楼主
首先,排除电机干扰问题:把电机换作LED灯(串联限流电阻)。 lcw_swust 发表于 2012-11-15 20:40 static/image/common/back.gif
同情楼主
首先,排除电机干扰问题:把电机换作LED灯(串联限流电阻)。
谢谢你的建议,我试试。 把程序压缩后上传,明天帮你看看. 看半天只看出来:
几个 switch 语句没有 default 项。
case里的语句没必要用两个大括号括起来。 hell-prototypes 发表于 2012-11-16 09:47 static/image/common/back.gif
看半天只看出来:
几个 switch 语句没有 default 项。
case里的语句没必要用两个大括号括起来。 ...
好像没注意到这些细节,谢谢你的提示。我一会试下。 肯定不能实现长按,每10毫秒numt就被清零,keytime长不上去
建议看看马潮老师在他的版面有个帖子专门讨论按键
if(KEY1==0||KEY2==0)
{
delayms(10);
if(KEY1==0||KEY2==0)
{
......
keytime=numt;
numt=0;
}
} sf49ers 发表于 2012-11-16 09:51 static/image/common/back.gif
肯定不能实现长按,每10毫秒numt就被清零,keytime长不上去
建议看看马潮老师在他的版面有个帖子专门讨论按 ...
非常感谢,我会看那帖子。但是我一个电机和一个按键控制加减速时键盘扫描也是这么写的,但是加减速都正常实现,程序加到两个电机时按键和加减速才不行的。 daxiaolijun 发表于 2012-11-16 10:01 static/image/common/back.gif
非常感谢,我会看那帖子。但是我一个电机和一个按键控制加减速时键盘扫描也是这么写的,但是加减速都正常 ...
sorry,我刚才说错了,没注意到while((!KEY1)||(!KEY2))用的是while
hell-prototypes 发表于 2012-11-16 09:47 static/image/common/back.gif
看半天只看出来:
几个 switch 语句没有 default 项。
case里的语句没必要用两个大括号括起来。 ...
呵呵,针对你的建议我试了下,毛病还在。后来我翻了下书,书上说了switch语句中default部分并不是必须有的,没有这一部分,执行完所有的case语句就直接退出switch语句。还是谢谢你。 {:time:}{:time:}{:time:}{:time:}
页:
[1]