新手,一个简单的PWM和超声波程序,可是小车没反应,不加超声波程序小车能走,下面这个小车就没反应,求大神指点
#include<AT89X51.H>
#include<math.h>
#include <intrins.h>
#include <STDIO.H>
#define uint unsigned int
#define uchar unsigned char
sbit RX=P3^6;
sbit TX=P3^7;
sbit en1=P1^0;//电机驱动接口
sbit s1=P1^2;
sbit s2=P1^1;
sbit nc=P1^3;
sbit s3=P1^4;
sbit s4=P1^5;
sbit en2=P1^6;
uchar t=0;//中断计数值
uchar m1=0;//电机1的速度值
uchar m2=0;//电机2的速度值
uchar tmp1,tmp2;//电机当前速度值
unsigned int time=0;
unsigned int timer=0;
float S=0;
bit flag =0;
/************************************************************************/
void delay(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/************************************************************************/
/************************************************************************/
void StartModule() //启动测距信号
{
TX=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/***************************************************/
void Count(void) //计算距离
{
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
time=TH0*256+TL0; //读取脉宽长度
TH0=0;
TL0=0;
S=(time*1.88)/100; //算出来是CM
}
/************************************************************************/
/*电机控制函数index-电机号(1,2);speed-电机速度(-100到100)*/
void moto(uchar index,char speed)
{
if(speed>=-100&&speed<=100)
{
if(index==1)//电机1的处理
{
m1=abs(speed);//取速度的绝对值
if(speed<0)//速度为负值反转
{
s1=0;
s2=1;
}
else//不为负数则正转
{
s1=1;
s2=0;
}
}
if(index==2)//电机2的处理
{
m2=abs(speed);//电机2的速度控制
if(speed<0)
{
s3=0;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
}
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
void time1()interrupt 3
{
if(t==0)//1个PWM周期完成后才会接受新数值
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1)//产生电机1的PWM信号
en1=1;
else
en1=0;
if(t<tmp2)//产生电机2的PWM信号
en2=1;
else
en2=0;
t++;
timer++;
if(t>=100)//1个PWM信号由100次中断产生
t=0;
}
/***************************************************/
void main(void)
{
unsigned int valA;
TMOD=0X21;
SCON=0x50;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
TH0=0;
TL0=0;
TR1= 1;
TR0= 1;
ET1= 1;
ET0= 1;
TI=1;
EA = 1;
while(1) /*无限循环*/
{
delay(60);
StartModule();
for(valA=7510;valA>0;valA--)
{
if(RX==1)
{
Count();
}
}
if(S>20)
{
moto(1,28);
moto(2,25);
}
else
{
moto(1,0);
moto(2,0);
}
}
}
|