標(biāo)題:
求大神幫忙看看3路超聲波控制小車程序,始終不動
[打印本頁]
作者:
51dasttwbd
時(shí)間:
2018-5-24 21:34
標(biāo)題:
求大神幫忙看看3路超聲波控制小車程序,始終不動
我 編寫了一套 3路超聲波控制小車進(jìn)行測距的程序 , 程序一直顯示沒有問題,但是小車始終不動 我不知道是哪的狀況 ,求各位大神幫忙看看 小弟感激不盡!!
源程序如下:
# include "reg52.h"
# include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit L298N_INA = P1^0;
sbit L298N_INB = P1^1;
sbit L298N_INC = P1^2;
sbit L298N_IND = P1^3;
sbit ENA_pwm = P2^6;
sbit ENB_pwm = P2^7;
sbit Trlg1 = P2^0;
sbit Echo1 = P2^1;
sbit Trlg2 = P3^1;
sbit Echo2 = P3^2;
sbit Trlg3 = P3^3;
sbit Echo3 = P3^4;
bit flag = 0;
unsigned char pwm_val_left =0; //pwm變量定義
unsigned char push_val_left =0; // 左電機(jī)占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0; // 右電機(jī)占空比N/10
unsigned int time=0;
unsigned long S1 = 0; //距離
unsigned long S2 = 0;
unsigned long S3 = 0;
/************************************************************************/
/* 運(yùn)動模塊*/
void Go_forward()
{
push_val_left=4;
push_val_right=4;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 0;
}
void Go_back()
{
push_val_left=4;
push_val_right=4;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 1;
}
void Go_left()
{
push_val_left=3;
push_val_right=3;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 1;
}
void Go_right()
{
push_val_left=3;
push_val_right=3;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 0;
}
void Stop()
{
L298N_INA = 0;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 0;
}
/************************************************************************/
/* 延時(shí)模塊*/
void delay(uint c) //1ms延時(shí)函數(shù)
{
uint a, b;
for(a=c;a>0;a--)
{
for(b=110;b>0;b--);
}
}
void Delay10us_CSB1(unsigned char i) //10us延時(shí)函數(shù) 啟動超聲波模塊時(shí)使用
{
unsigned char j;
do{
j = 10;
do{
_nop_();
_nop_();
}while(--j);
}while(--i);
}
void Delay10us_CSB2(unsigned char i)
{
unsigned char j;
do{
j = 10;
do{
_nop_();
_nop_();
}while(--j);
}while(--i);
}
void Delay10us_CSB3(unsigned char i)
{
unsigned char j;
do{
j = 10;
do{
_nop_();
_nop_();
}while(--j);
}while(--i);
}
/************************************************************************/
/* PWM調(diào)制電機(jī)轉(zhuǎn)速 */
void pwm_out_left_moto(void)
{
if(pwm_val_left<=push_val_left)
ENA_pwm=1;
else
ENA_pwm=0;
if(pwm_val_left==10) // 0~10 , 0最小,10最大
pwm_val_left=0;
}
void pwm_out_right_moto(void)
{
if(pwm_val_right<=push_val_right)
ENB_pwm=1;
else
ENB_pwm=0;
if(pwm_val_right==10) // 0~10 , 0最小,10最大
pwm_val_right=0;
}
/*中斷函數(shù)產(chǎn)生PWM信號*/
void timer1()interrupt 3
{
TH1=(65536-10)/256; //10US定時(shí)
TL1=(65536-10)%256;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto(); //定時(shí)器100US為準(zhǔn)。在這個(gè)基礎(chǔ)上延時(shí)
}
/* 計(jì)時(shí)器溢出模塊*/
void timer0() interrupt 1
{
flag=1;
}
/************************************************************************/
/*計(jì)算超聲波所測距離并顯示 */
void Conut1(void) //計(jì)算距離
{
while(!Echo1); //當(dāng)(ECHO信號回響)為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(Echo1);
TR0=0; //關(guān)閉計(jì)數(shù)
time=TH0*256+TL0; //讀取脈寬長度
TH0=0;
TL0=0;
S1=(float)(time*1.085)*0.17;
if((S1>=7000)||(flag == 1))
{
flag = 0;
}
}
void Conut2(void) //計(jì)算距離
{
while(!Echo2); //當(dāng)(ECHO信號回響)為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(Echo2);
TR0=0; //關(guān)閉計(jì)數(shù)
time=TH0*256+TL0;
TH0=0;
TL0=0;
S2=(float)(time*1.085)*0.17;
if((S2>=7000)||(flag == 1))
{
flag = 0;
}
}
void Conut3(void) //計(jì)算距離
{
while(!Echo3); //當(dāng)(ECHO信號回響)為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(Echo3);
TR0=0; //關(guān)閉計(jì)數(shù)
time=TH0*256+TL0;
TH0=0;
TL0=0;
S3=(float)(time*1.085)*0.17;
if((S3>=7000)||(flag == 1))
{
flag = 0;
}
}
void bizhang (void)
{
Trlg1=1;
Delay10us_CSB1(5);
Trlg1=0; //啟動超聲波測距
Conut1(); //計(jì)算距離
Trlg2=1;
Delay10us_CSB2(5);
Trlg2=0;
Conut2();
Trlg3=1;
Delay10us_CSB3(5);
Trlg3=0;
Conut3();
if(S1<50 && S2<50 && S3<50)
{
Go_back();
delay(50);
Stop();
if(S2<50 && S3>50)
{
Go_right();
}
if(S2>50 && S3<50)
{
Go_left();
}
}
else if(S1>50 && S2<50 && S3<50)
{
Stop();
delay(50);
if(S2<50 && S3>50)
{
Go_right();
}
if(S2>50 && S3<50)
{
Go_left();
}
}
else if(S1>50&& S2>50 && S3>50)
{
Go_forward();
}
}
void main(void)
{
TMOD |= 0x20;//定時(shí)器1工作模式2,8位自動重裝。用于產(chǎn)生PWM
TMOD |= 0x01;//定時(shí)器0工作模塊1,16位定時(shí)模式。T0用測Echo脈沖長度
TH1=220;
TL1=220;
TH0 = 0;
TL0 = 0;
ET1 = 1; //允許T1中斷
ET0 = 1; //允許T0中斷
TR1 = 1; //啟動定時(shí)器1
EA = 1; //啟動總中斷
while(1)
{
bizhang();
delay(65);
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1