標(biāo)題:
單片機(jī)超聲波避障程序
[打印本頁]
作者:
weipeng123
時間:
2020-2-26 22:39
標(biāo)題:
單片機(jī)超聲波避障程序
本小車是從網(wǎng)上買的,7.2v電車供電,L298N電機(jī)驅(qū)動模塊。
系統(tǒng)的硬件包括以下幾個部分:
(1)MCU:STC89C52;
(2)電源:7.2V、1600mah的可充電鎳鎘電池;
(3)紅外光電傳感器;
(4)超聲波傳感器:HC-SR04
(5)兩個直流電機(jī);
(6)電機(jī)驅(qū)動芯片:L298N
#include <reg52.h>
#include <intrins.h>
#define somenop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();
#define DIS_DATA P0
unsigned char code DIS_TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};
sbit cs0 = P2^0;
sbit cs1 = P2^1;
sbit cs2 = P2^2;
sbit cs3 = P2^3;
sbit MOTO1_IN1 = P1^0;//左輪電機(jī)
sbit MOTO1_IN2 = P1^1;
sbit MOTO2_IN1 = P1^2;//右輪電機(jī)
sbit MOTO2_IN2 = P1^3;
sbit MOTO1_PWM = P1^4;
sbit MOTO2_PWM = P1^5;
sbit Tx = P3^3;
sbit Rx = P3^2;
sbit Key_1 = P3^5;
sbit Key_2 = P3^4;
sbit Led = P1^7;
void RED_SCAN(void);
void Turn_Forward(void);
void Turn_Right(void);
void Turn_Left(void);
void Turn_Stop(void);
void Turn_SRight(void);
void Turn_SLeft(void);
void Test(void);
void Key_Scan(void);
void send_wave(void);
void Delay10us(void);
unsigned char i = 0,j = 0;
unsigned char a = 0,b = 0;
unsigned char flag = 0;
unsigned char flag1 = 0;
unsigned char timeH = 0,timeL = 0,time = 0;
unsigned char mode;
unsigned char flag_csb_juli=0;
unsigned char iCnt;
unsigned int displayvalue;
unsigned int scan_status;
float distance;
int main()
{
Tx = 0;
EA = 1;
TMOD = 0x11;
TR0=0;
TR1=0;
MOTO1_PWM = 0;
MOTO2_PWM = 0;
TH0 = 65517/256;
TL0 = 65517%256;
while(1)
{
Key_Scan();
if(mode == 1)
{
ET0 = 1;
TR0 = 1;
}
if(mode == 2)
{
ET0 = 0;
TR0 = 0;
MOTO1_PWM = 1;
MOTO2_PWM = 1;
send_wave();
}
}
}
void RED_SCAN(void)
{
switch(P2&0xf0)
{
case 0x60: Turn_Forward();flag = 0;scan_status=110;
break;
case 0xC0: Turn_Right();flag = 0;scan_status=1100;
break;
case 0x30: Turn_Left();flag = 0;scan_status=11;
break;
case 0x80: Turn_SRight();flag = 2;scan_status=1000;
break;
case 0x10: Turn_SLeft(); flag = 1;scan_status=1;
break;
case 0xE0: Turn_Right();flag = 0;scan_status=1110;
break;
case 0x70: Turn_Left();flag = 0;scan_status=111;
break;
case 0x20: Turn_Right();flag = 0;scan_status=10;
break;
case 0x40: Turn_Left();flag = 0;scan_status=100;
break;
default: Test(); scan_status=0;
break;
}
}
void Turn_Forward(void)
{
MOTO1_IN1=0;
MOTO1_IN2=1;
MOTO2_IN1=0;
MOTO2_IN2=1;
a=80;
b=70;
}
void Turn_Right(void)
{
MOTO1_IN1=0;
MOTO1_IN2=1;
MOTO2_IN1=0;
MOTO2_IN2=1;
a=70;
b=85;
}
void Turn_Left(void)
{
MOTO1_IN1=0;
MOTO1_IN2=1;
MOTO2_IN1=0;
MOTO2_IN2=1;
a=85;
b=70;
}
void Turn_SRight(void)
{
MOTO1_IN1=0;
MOTO1_IN2=1;
MOTO2_IN1=0;
MOTO2_IN2=0;
// TR0=1;
a=80;
b=70;
}
void Turn_SLeft(void)
{
MOTO1_IN1=0;
MOTO1_IN2=0;
MOTO2_IN1=0;
MOTO2_IN2=1;
a=80;
b=70;
}
void Turn_Stop(void)
{
MOTO1_IN1=0;
MOTO1_IN2=0;
MOTO2_IN1=0;
MOTO2_IN2=0;
}
void Test(void)
{
if(flag==0)
Turn_Stop();
if(flag==1)
Turn_SLeft();
if(flag==2)
Turn_SRight();
}
void timer0() interrupt 1
{
TR0 = 0;
i++;
TH0=65517/256;
TL0=65517%256;
iCnt++;
if(mode == 1)
{
displayvalue=scan_status;
//displayvalue=1234;
}
else
{
displayvalue=(int)distance;
}
if(iCnt == 10)
{
DIS_DATA = 0xff; //消影
cs0 = 1;
cs1 = 1;
cs2 = 1;
cs3 = 0;
DIS_DATA = DIS_TABLE[displayvalue % 10];
}
if(iCnt == 20)
{
DIS_DATA = 0xff; //消影
cs0 = 1;
cs1 = 1;
cs2 = 0;
cs3 = 1;
DIS_DATA = DIS_TABLE[displayvalue /10 % 10];
}
if(iCnt == 30)
{
DIS_DATA = 0xff; //消影
cs0 = 1;
cs1 = 0;
cs2 = 1;
cs3 = 1;
DIS_DATA = DIS_TABLE[displayvalue /100 % 10];
}
if(iCnt == 40)
{
// iCnt == 0;
DIS_DATA = 0xff; //消影
cs0 = 0;
cs1 = 1;
cs2 = 1;
cs3 = 1;
DIS_DATA = DIS_TABLE[displayvalue /1000 % 10];
}
if(iCnt == 50)
{
iCnt == 0;
DIS_DATA = 0xff; //消影
}
if(i==a)
{
MOTO1_PWM = 1;
}
if(i==b)
{
MOTO2_PWM = 1;
}
if(i==100)
{
i=0;
MOTO1_PWM = 0;
MOTO2_PWM = 0;
RED_SCAN();
}
TR0 = 1;
}
void Key_Scan(void)
{
if(Key_1 == 0)
{
mode = 1;
while(!Key_1);
}
if(Key_2 == 0)
{
mode = 2;
while(!Key_2);
}
}
void send_wave()
{
Tx = 1; //10us的高電平觸發(fā)
Delay10us();
Tx = 0;
flag_csb_juli = 0;
TH1 = 0; //給定時器0清零
TL1 = 0;
TR1 = 0; //關(guān)定時器0定時
while(Rx==0); //當(dāng)Echo為零時等待
TR1=1;
while(Rx==1) //當(dāng)Echo為1計數(shù)并等待
{
flag_csb_juli = 1;
}
if(flag_csb_juli == 1)
{
TR1=0; //關(guān)定時器0定時
distance =TH1 * 256 + TL1; //讀出定時器1的定時時間
distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017cM 算出來是c米
// distance單位是厘米
if((distance < 20)) //距離 = 速度 * 時間
{
Turn_SLeft(); //如果大于3.8m就超出超聲波的量程
}
if((distance > 20)) //距離 = 速度 * 時間
{
Turn_Forward(); //如果大于3.8m就超出超聲波的量程
}
}
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 25;
while (--i);
}
復(fù)制代碼
stm32-超聲波避障.rar
2020-2-26 22:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
306.3 KB, 下載次數(shù): 11, 下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1