|
/*****************ZYJJB09-C智能循跡、避障機器人*****************
//=====================================================================
ZYJJB09-C 單獨紅外避障演示程序
本程序通過前方的紅外探頭來檢測前面的的信號,當前方有障礙物時
,紅外接收到信號,與黑色接受管檢測的紅外相應端口低電平,我們就可以根據這和
判斷條件來進行
聲明:由于紅外接收頭對光線要求較高,所以對于黑白兩種顏色選擇對比度
高為好,而且因為道路建立不同,需要根據實際的需要來改寫相應的延遲時間
以適應角度的最有較轉彎,道路應根據紅外接收頭的兩個寬度來制定,如果道
路較小,或較大者,請調整以適應小車的正確運行.
備注:這里的程序以走白線為主,當用戶需要選擇走黑線時,請根據例程作出
實際修改。并改寫相應的延遲時間函數,以進行轉彎角度在的最優化調整.
* 平臺:ZYJJB09-C智能循跡、避障機器人 + Keil U4 + STC89C52
* 程序名稱:ZYJJB09-C 單獨紅外避障演示程序
* 公司:湖南智宇科教設備有限公司
* 編寫:智宇公司研發一部
* 日期:2015-1-15
* 交流:智能車QQ:1018973181
* 晶振:11.0592MHZ
* 售后技術說明:免費開源,不支持客戶自己修改程序分析與改正,可以提供我公司程序說明
* 免費結緣:5星好評贈送18個資料包,追加評價后再加送20G資料,網上網盤下載
* 視頻教程:本小車配套學習C語言詳細視頻教程,資料統一網盤下載
******************************************************************/ //
// 程序備注: 此程序僅為表現本機功能而演示用,當用作實際工程時請慎用. //
//=====================================================================//
#include <REGX52.H> //包含51單片機相關的頭文件
sbit LeftIR=P1^1; //定義前方左側紅外探頭端口
sbit RightIR=P1^0; //定義前方右側紅外探頭端口
sbit bizhangLED=P2^0; //定義前方右側紅外探頭端口
sbit M1A=P0^0; //定義左側電機驅動A端
sbit M1B=P0^1; //定義左側電機驅動B端
sbit M2A=P0^2; //定義右側電機驅動A端
sbit M2B=P0^3; //定義右側電機驅動B端
void tingzhi()
{
M1A=0; //將M1電機A端初始化為0
M1B=0; //將M1電機B端初始化為0
M2A=0; //將M2電機A端初始化為0
M2B=0;
}
void qianjin()
{
M1A=1;
M1B=0;
M2A=1;
M2B=0;
}
void houtui()
{
M1A=0;
M1B=1;
M2A=0;
M2B=1;
}
void zuozhuan()
{
M1A=1;
M1B=0;
M2A=0;
M2B=1;
}
void youzhuan()
{
M1A=0;
M1B=1;
M2A=1;
M2B=0;
}
void delay_nus(unsigned int i) //延時:i>=12 ,i的最小延時單12 us
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n) //延時n ms
{
n=n+1;
while(--n)
delay_nus(900); //延時 1ms,同時進行補償
}
void ControlCar(unsigned char ConType) //定義電機控制子程序
{
tingzhi();
switch(ConType) //判斷用戶設定電機形式
{
case 1: //前進 //判斷用戶是否選擇形式1
{
qianjin();
break;
}
case 2: //后退 //判斷用戶是否選擇形式2
{
houtui(); //M2電機反轉
break;
}
case 3: //左轉 //判斷用戶是否選擇形式3
{
zuozhuan(); //M2電機正轉
break;
}
case 4: //右轉 //判斷用戶是否選擇形式4
{
youzhuan(); //M1電機正轉
//M2電機反轉
break;
}
case 8: //停止 //判斷用戶是否選擇形式8
{
tingzhi();
break; //退出當前選擇
}
}
}
void main() //主程序入口
{
bit RunFlag=0; //定義小車運行標志位
//RunShow=0; //初始化顯示狀態
ControlCar(8); //初始化小車運行狀態
while(1) //程序主循環
{
Start:
bizhangLED = 0;
if( LeftIR == 0 && RightIR == 1 ) //如果前面避障傳感器檢測到障礙物
{
ControlCar(8); //停止
delay_nms (300); //停止300MS 防止電機反相電壓沖擊 導致系統復位
ControlCar(4); //后退
delay_nms (260);
goto NextRun;
}
if( LeftIR == 1 && RightIR == 0 ) //如果前面避障傳感器檢測到障礙物
{
ControlCar(8); //停止
delay_nms (300); //停止300MS 防止電機反相電壓沖擊 導致系統復位
ControlCar(3); //后退
delay_nms (260);
goto NextRun;
}
if( LeftIR == 0 && RightIR == 0 ) //如果前面避障傳感器檢測到障礙物
{
ControlCar(8); //停止
delay_nms (300); //停止300MS 防止電機反相電壓沖擊 導致系統復位
ControlCar(2); //后退
delay_nms (1000); //后退1500MS
ControlCar(3); //
delay_nms (1800);
goto NextRun;
}
if( LeftIR == 1 && RightIR == 1 )
{
ControlCar(1); //右側沒有信號時,開始向左轉一定的角度
delay_nms (10);
goto NextRun;
}
goto Start;
NextRun:
ControlCar(1);
}
}
//備注:此例程僅為參考程序,請根據自己的道路進行最優化調整。
|
評分
-
查看全部評分
|