|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-11-21 19:04:55
|
显示全部楼层
Anqi90 发表于 2012-11-21 18:45 ![](static/image/common/back.gif)
只有一个说明:
尊敬的用户:
呵呵,对不起,我用的压缩文件就是快压的,没想到这软件这么霸道。我把程序发在下面吧,认为哪有问题希望大神不吝赐教。
//目的:两个按键控制两个直流电机的加速和减速,长按(>=2S)加速,短按减速,上电时两电机均有个初速。
//问题:在该程序下连接两个电机时按键操作没反应,去掉一个电机按键全都是减速,加速没反应。
//有人给的建议键盘扫描不要一起扫,我分开扫,毛病同上;有人说开关语句里没有default,我觉得不重要,但还是加了,毛病依然。
//(补充:我按这个程序写一个按键控制一个电机时达到目的,到两个按键就没反应了) 帖子发了几篇,还没解决问题,我也没辙了。
#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,numt,num1_speed,num2_speed;
void delayms(uchar xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
uchar keynum=0;
if((KEY1==0)||(KEY2==0))
{
delayms(10);
if((KEY1==0)||(KEY2==0))
{
while((!KEY1)||(!KEY2))
{
TR1=1;
if(KEY1==0) keynum=1;
if(KEY2==0) keynum=2;
}
TR1=0;
keytime=numt;
numt=0;
}
if(keytime>=40)
{
switch(keynum)
{
case 1:
{
num1_speed=num1_speed+1;
if(num1_speed>17)
num1_speed=8;
}
keynum=0;
break;
case 2:
{
num2_speed=num2_speed+1;
if(num2_speed>17)
num2_speed=8;
}
keynum=0;
break;
default: break; //keynum=0的情况直接跳出
}
}
if(keytime<40)
{
switch(keynum)
{
case 1:
{
num1_speed=num1_speed-1;
if(num1_speed<8)
num1_speed=8;
}
keynum=0;
break;
case 2:
{
num2_speed=num2_speed-1;
if(num2_speed<8)
num2_speed=8;
}
keynum=0;
break;
default: 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();
num1_speed=12;
num2_speed=12;
while(1)
{
keyscan();
}
}
void Time0_Init() interrupt 1 //定时器0作用是控制PWM
{
TH0=(65536-20)/256; //20us
TL0=(65536-20)%256;
num1++;
num2++;
if(num1<num1_speed)
U1=1;
else U1=0;
if(num1>17)
num1=0;
if(num2<num2_speed)
U2=1;
else U2=0;
if(num2>17)
num2=0;
}
void Time1_Init() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
numt++;
}
|
|