避障机器人程序c语言,基于51单片机小车寻迹、避障源程序(注释很详细)
/*
* 作者:趙新
* 功能:實現小車躲避障礙,通過檢測三個方向的距離,選擇最大距離轉彎
* 日期:2015/3/14
* 說明:STC89c52RC,12MHz
* 注意:1000ms和100ms待測,完成后刪除此行
*—————————————————管腳說明——————————————
* Trig = P1^0
* Echo = P3^2
* PWM_OUT = P0^4
*————————————————————————————————————————
*/
#include "stc89c5x.h"
#include "intrins.h"
#include "Motor.h"
#define X 20? ?//最短距離參考值 約為12厘米 受溫度影響,會存在10%左右的誤差
sbit Trig = P1^0;//發送端
sbit Echo = P3^2;//接收端 若用外部中斷0,則此引腳必須是P3.2
sbit PWM_OUT = P0^4;//PWM信號輸出端
u8 counts = 0;? ?? ?//設置初值
u8 PWM =6;? ? ? ? ? ? ? ? ? ? ? ? //設置初值,任意值也可不設
u8 Flag_Angle = 1;??//0 左45度 1 右45度 在函數Scan()中調用
u8 Distance_Middle;
u8 Distance_Temp[2];//0 左45度 1 右45度
void Delay20us();
void Delay100ms();
void Delay1000ms();??//@12.000MHz??用于等待
u8 Compute(u8 th,u8 tl);
void Scan_Around();??//掃描左右
void Scan_Middle();??//掃描正中前進方向距離
void main()
{
TMOD = 0x11;//設置T0,T1 T0用于電平檢測 T1用于產生舵機需要的PWM信號
TH0 = 0x00;? ? ? ?? ? //轉載初值
TL0 = 0x00;
ET0 = 1;? ? ? ?? ? //打開定時器中斷
TF0 = 0;? ? ? ?? ? //失能定時器中斷標志,也可忽略此語句
TR0 = 0;? ? ? ?? ? //開始時T0關閉
TH1 =? ? ? ? 0xff;??//產生時基100us定時,用于組成舵機各個角度的信號
TL1 = 0x9c;
ET1 = 1;
TF0 = 0;? ???//可忽略此語句,51復位此位為0
TR1 = 0;? ? ? ?? ? //暫時關閉T1
EX0 = 1;? ???//開外部中斷
IT0 = 1;? ???//下降沿觸發中斷
EA = 1;? ? ? ?? ? //全局中斷開
Trig = 0;? ? ? ?? ? //觸發端拉低
Echo = 0;
while(1)
{
//Scan_Around();
Scan_Middle();
if(Distance_Middle<=X)
{
Stop();
Scan_Around();
if((Distance_Temp[0]>Distance_Temp[1])&&Distance_Temp[0]>=X)
{
Turn_Left(0);
Delay100ms();
//Delay100ms();
}else
if((Distance_Temp[0]=X)
{
Turn_Right(0);
Delay100ms();
//Delay100ms();
}else
if((Distance_Temp[0]==Distance_Temp[1])&&Distance_Temp[0]>=X)
{
Turn_Right(0);
Delay100ms();
//Delay100ms();
}else
{
Back();
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
Turn_Right(0);
Delay100ms();
//Delay100ms();
}
}else
{
Go();
}
}
}
void Timer1(void) interrupt 3 //PWM產生
{
TH1 = 0xff;
TL1 = 0x9c;
if(counts
{
PWM_OUT = 1;
}
else
{
PWM_OUT = 0;
if(counts==200)
{
counts = 0;
}
}
++counts;
}
void Timer0(void) interrupt 1 //T0溢出中斷函數,一般來說T0溢出是不可能發生的,原因是傳感器最大探測距離為4m左右,所用時間不會超過65536us
{
}
void INT0_Test(void) interrupt 0??//下降沿到來之后,進入外部中斷函數,停止T0計數,計算并發送計算值到計算機
{
TR0 = 0;
switch(Flag_Angle)
{
case 0:Distance_Temp[0]=Compute(TH0,TL0);TH0 = TL0 = 0x00;break;??//左
case 1:Distance_Temp[1]=Compute(TH0,TL0);TH0 = TL0 = 0x00;break;??//右
default:break;
}
//為了下一次準確計數,必須清空
}
void Scan_Around()? ?//掃描左右
{
Flag_Angle = 0;
PWM = 17;//左轉45度
TR1 = 1;
Delay1000ms();
TR1 = 0;
Trig = 1;? ? ? ? ? ? ? ? //觸發一次檢測
Delay20us();
Trig = 0;
while(!Echo);? ? ? ? //如果沒有檢測到返回信號,等
TR0 = 1;? ? ? ? ? ? ? ? //檢測到高電平,開T0計數,一直計到下降沿到來
Delay100ms();
Flag_Angle = 1;
PWM = 8; //右轉45度
TR1 = 1;
Delay1000ms();
TR1 = 0;
Trig = 1;? ? ? ? ? ? ? ? //觸發一次檢測
Delay20us();
Trig = 0;
while(!Echo);? ? ? ? //如果沒有檢測到返回信號,等
TR0 = 1;? ? ? ? ? ? ? ? //檢測到高電平,開T0計數,一直計到下降沿到來
Delay100ms();
PWM = 12; //測完回到正中
TR1 = 1;
Delay1000ms();
TR1 = 0;
}
void Scan_Middle() //掃描正中前進方向距離
{
//Stop();
Flag_Angle = 3;
Trig = 1;? ? ? ? ? ? ? ? //觸發一次檢測
Delay20us();
Trig = 0;
while(!Echo);? ? ? ? //如果沒有檢測到返回信號,等
TR0 = 1;? ? ? ? ? ? ? ? //檢測到高電平,開T0計數,一直計到下降沿到來
Delay100ms();
Distance_Middle = Compute(TH0,TL0);
TH0 = TL0 = 0x00;
//Go();
}
u8 Compute(u8 th,u8 tl)
{
u16 times = 0x0000;
times = th;
times = times<<8;
times |= tl;
return (times/58);
}
void Delay20us()? ? ? ? ? ? ? ? //@12.000MHz??用于產生超聲波觸發信號
{
unsigned char i;
_nop_();
i = 7;
while (--i);
}
void Delay100ms()? ? ? ? ? ? ? ? //@12.000MHz
{
unsigned char i, j;
i = 195;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的避障机器人程序c语言,基于51单片机小车寻迹、避障源程序(注释很详细)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs调试c语言检查内存泄露,Visual
- 下一篇: c语言怎么编程极差,我是一个编程能力很差