|
//個(gè)人剛?cè)雽W(xué)51單片機(jī),玩的東西,沒那么高級(jí)
//三輪紅外避障小車(一個(gè)萬向輪,二個(gè)輪子用電機(jī)驅(qū)動(dòng))
// 小車由于倆個(gè)電機(jī)不可能完全相等,摩檫力等等系列因素讓二個(gè)輪子的轉(zhuǎn)速不同,故無法走直線
//解決思路:
//可以通過左右兩邊的紅外其中一個(gè)紅外讓小車走一個(gè)一抖一抖的直線,實(shí)現(xiàn)其原理就是 例如是右邊打的紅外,檢測(cè)到右邊的墻壁,就讓它往左走,檢測(cè)不到右邊的墻壁,就讓它往右走。讓其在中斷里進(jìn)行不斷掃描其過程。
//由于速度過大就會(huì)抖的非常厲害,故通過PWM調(diào)節(jié)速度。
//代碼如下
#include <REGX52.H>
//L298N輸出
sbit out1=P1^3; sbit out3=P1^5;
sbit out2=P1^4; sbit out4=P1^6;
//使能
sbit ine1=P1^0;
sbit ine2=P1^1;
//紅外
sbit hw_y=P0^0;
//調(diào)節(jié)二個(gè)輪子的速度,不能讓其太快
unsigned int count=0;
unsigned int compare_l=50;
unsigned int compare_r=50;
void Timer0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0xA4;
TH0 = 0xFF;
TR0 = 1;
ET0=1;
EA=1;
}
void right() //右
{
compare_l=30;
compare_r=30;
out1=0;
out2=0;
out3=0;
out4=1;
}
void left() //左
{
compare_l=30;
compare_r=30;
out1=1;
out2=0;
out3=0;
out4=0;
}
void Turnaround() //靠墻走直的函數(shù)
{
if(hw_y==0)
left();
else if(hw_y==1)
right();
}
void main()
{
Timer0Init();
while(1)
{}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0xA4;
TH0 = 0xFF;
count++;
count%=100;
//左右搖擺放入其中糾正方向,通過那兩個(gè)函數(shù)來調(diào)節(jié)方向
Turnaround();
if(count<compare_r)
ine1=1;
else
ine1=0;
if(count<compare_l)
ine2=1;
else
ine2=0;
}
//還沒解決走出迷宮的思路,希望各位大佬給點(diǎn)建議。蟹蟹啦
|
|