|
是用1MS的定时中断程序来控制小车的前进。
当FLAG=0时,小车停止前进,
当FLAG=1时,小车前进。
假设如楼主所说遇到故障反而转的更快了,我认为应该是TMDAT2电平与楼主所认为相反的原因,由于没有具体的电路图所以没法更加详细的分析。现在仅仅把楼主程序的思路分析一下,楼主可以自己修改。
#include <reg52.h>
#define uint unsigned int
unsigned int i;
unsigned int j;
unsigned int k;
unsigned char flag;
sbit PWM1=P1^1; //后轮驱动前进
sbit PWM2=P1^2; //后轮驱动后退
sbit PWM3=P1^3; //前轮右转
sbit PWM4=P1^4; //前轮左转
sbit TMDAT1=P0^1; //前左红外接口
sbit TMDAT2=P0^2; //前中红外接口
sbit TMDAT3=P0^3; //前右红外接口
sbit TMDAT4=P0^4; //后轮记数红外接口
void delay(unsigned int cnt)
{
while(--cnt);
} //无限循环
void timer0() interrupt 1 ///* 定时中断*/
{
PWM1=flag; //此中断的作用在于产生一个脉冲波,即周期1MS,为正时间为1500时钟周期的脉冲。此脉冲用于驱动小车前进,即当FLAG为1时,小车能产生为正的脉冲,小车前进,当FLAG为0时,产生脉冲恒为0,小车停止。楼主所想的改变周期可以改变定时时间,改变脉宽可以改变DELAY(1500)
delay(1500);
PWM1=0;
}
void IR_decode1() //红外解码程序==进入外部中断后的TMDAT电平应为0
{
// PWM1=0;
PWM3=1; //左转
// delay1(5);
PWM3=0;
}
void IR_decode3() //红外解码程序==进入外部中断后的TMDAT电平应为0
{
}
void IR_decode4() //后轮记数红外接口
{
if(j==1) //从程序来看此段程序的作用是当后轮每计数I到5此时,小车运行方向改变,先往左,在5次后往右,然后再5次后往坐,如此往复。
{
j=0;
i++;//后轮转动圈速
if(i==5)
{
if(k==1)//以右为先转,k==1时左转
{
PWM4=1;
k=0;
}
else //k==0时右转
{
PWM3=1;
k=1;
}
PWM1=0;//停车
flag=0;
// TR0=0;
delay(10000);
// TR0=1;
PWM4=0;
PWM3=0;
PWM1=1;//重起 开车
flag=1;
i=0;
}
}
}
main()
{
TMOD=0x01;//定时器设置 1ms in 12M crystal
TCON=0x10;
TH0=(65536-1000)/128;
TL0=(65536-1000)%128;//定时1mS
PWM1=0;
PWM2=0;
PWM3=0;
PWM4=0;
flag=1;
delay(1200);
IE=0x82; //打开中断
while(1){
// while(!TMDAT1)IR_decode1();
// while(!TMDAT3)IR_decode3();
while(TMDAT4)j=1; //此处为等待TMDAT4变为低电平。
while(!TMDAT4)IR_decode4(); //当变为低电平时运行IR_DECODE4();
while(!TMDAT2)flag=0;//此处等待TMDAT2变为高电平。等待期间小车停止。
while(flag==0)
{
while(TMDAT2)flag=1; //此处当TMDAT2为高电平时,小车运行。
}
}
}
|
|