本人想做一辆红外遥控小车,用的是一体化红外接收头VS1838B,红外发射用的是网上卖的红外发射遥控器。

直流电机通过占空比实现调速。想实现的功能的是:含四个键,一是开启键(开启时是全速),二是停止键,三是正向加速键(分5档),四是倒退加速键(也是分5档)。使用外部中断0。本... 直流电机通过占空比实现调速。想实现的功能的是:含四个键,一是开启键(开启时是全速),二是停止键,三是正向加速键(分5档),四是倒退加速键(也是分5档)。使用外部中断0。本人写的代码如下,其中开启键和停止键功能正常,三、四键时电机没有转,但蜂鸣器响。本人疑惑,既然蜂鸣器响了,说明已经进入中断,但电机为什么没有转动呢??求解,甚感谢!!
#include <reg52.h>
sbit jieshou=P3^2;
sbit fmq=P3^6;
unsigned char jia=0;
unsigned char jian=0;
unsigned char a[4];
unsigned int hightime,lowtime;
unsigned char daojia=0,daojian=0;
void delay(unsigned char i)
{
unsigned char j;
while(i--)
for(j=0;j<115;j++);
}
void beep(unsigned char i)
{
while(i--)
{
fmq=0;
delay(1);
fmq=1;
delay(1);
}
}
int shibie()
{
unsigned char i,x,temp;
for(i=0;i<4;i++)
{
for(x=0;x<8;x++)
{
temp=temp>>1;
TH0=0;
TL0=0;
TR0=1;
while(jieshou==0);
TR0=0;
lowtime=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
while(jieshou==1);
TR0=0;
hightime=TH0*256+TL0;
if(lowtime<370 || lowtime>640) return 0;
if(hightime>420 && hightime<620) temp=temp & 0x7f;
if(hightime>1300 && hightime<1800) temp=temp | 0x80;
}
a[i]=temp;
}
return 1;
}
void main()
{
loop: EA=1;
EX0=1; //开外中断0
ET0=1; //定时器T0中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭
if(daojia==1 && daojian==0)
{
if(jia==1) {P0=0xfd;delay(20);P0=0xfc;delay(80);}
if(jia==2) {P0=0xfd;delay(40);P0=0xfc;delay(60);}
if(jia==3) {P0=0xfd;delay(60);P0=0xfc;delay(40);}
if(jia==4) {P0=0xfd;delay(80);P0=0xfc;delay(20);}
}
if(daojia==0 && daojian==1)
{
if(jian==1) {P0=0xfe;delay(20);P0=0xfc;delay(80);}
if(jian==2) {P0=0xfe;delay(40);P0=0xfc;delay(60);}
if(jian==3) {P0=0xfe;delay(60);P0=0xfc;delay(40);}
if(jian==4) {P0=0xfe;delay(80);P0=0xfc;delay(20);}
}
if(jian==5) {P0=0xfe;}
if(jia==5) {P0=0xfd;}
goto loop;
}
void int0() interrupt 0
{
EX0=0;
TH0=0;
TL0=0;
TR0=1;
while(jieshou==0);
TR0=0;
lowtime=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
while(jieshou==1);
TR0=0;
hightime=TH0*256+TL0;
if(lowtime>7800 && lowtime<8800 && hightime>3600 && hightime<4700)
{
if(shibie()==1)
{
jieshou=1;
EX0=1;
if(a[2]==0x45) //开启直流电机,刚开始是正转全速的
{
beep(50);
delay(30);
P0=0xfd;
jia=jian=0;
}
if(a[2]==0x47) {beep(50);delay(30);jia=jian=0;P0=0xfc;}//关闭直流电机
if(a[2]==0x09) //加速
{
beep(50);
delay(30);
daojia=1;
daojian=0;
jia=jia+1;
if(jia==6) jia=1;
}
if(a[2]==0x15) //减速
{
beep(50);
delay(30);
daojia=0;
daojian=1;
jian=jian+1;
if(jian==6) jian=1;
}
}
}
}
展开
 我来答
何工8899
2011-09-28
知道答主
回答量:7
采纳率:0%
帮助的人:3.9万
展开全部
既然蜂鸣器响了,说明已经进入中断,但电机为什么没有转动呢??
那是因为选用的垃圾红外接收头所至,建议选择用玩具配套专用的红外接收头;要不到时就算你的电机转了,转几下又停了也是用不了的。
追问
也不是接收头的问题,因为在实验板是能够正确识别,就是到车体上不行而已
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
夜未央live
2011-09-23 · TA获得超过303个赞
知道答主
回答量:111
采纳率:0%
帮助的人:122万
展开全部
你也不说明一下自己的程序定义?!!
追问
jieshou定义为红外接收管脚,采用外部中断0,故是P3^2;fmq是蜂鸣器管脚,当接收到信号后蜂鸣器响,以提示有信号被接收到;a[4]数组存储红外的用户码和操作码,其中a[2]是操作码;delay(unsigned char i)是延时i毫秒函数;beep()是蜂鸣器鸣笛函数;shibie()是红外解码函数,当正确解码时,返回1;中断程序里的 if(lowtime>7800 && lowtime3600 && hightime<4700)是识别码判断的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式