|
本帖最后由 一寸灰 于 2019-1-30 12:38 編輯
●這里的循跡是指小車在白色地面上 沿著黑線走;
●傳感器利用不同顏色的物體表面有不同反射性的特點:白色地面發生漫反射,黑色則被吸收。
小車的組成結構
• 硬件部分
紅外傳感器
驅動*2
杜邦線*若干
51最小系統*1
螺絲卡簧固定片亞克力板底盤
• 軟件部分:
keil軟件所寫的c語言程序,控制51單片機
0.png (381.59 KB, 下載次數: 71)
下載附件
2019-1-25 03:21 上傳
傳感器:
在小車行駛過程中傳感器不斷地向地面發射紅外光,紅外光遇到白色地板發生漫反射,反射光被傳感器的接收管接受;遇到黑色紅外光會被吸收 單片機以此確定黑線的位置來控制小車的行走路線。循跡51最小系統原理圖:
51.PNG (72.95 KB, 下載次數: 79)
下載附件
2019-1-30 12:35 上傳
因為所用的L298N驅動模塊上有5V穩壓端,所以最小系統上面可以不需要穩壓電路,直接用驅動供電即可。
下面是可以簡單循跡的源代碼:
#include <reg52.h>
#include "include.h"
unsigned char pwm_val =0;//變量定義
unsigned char val_left =15;// 左電機占空比N/20 //速度調節變量 0-20。。。0最小,20最大
bit PWM_ON=1;//電機PWM開關
/***************PWM電機轉速***************/
void pwm_moto(void)
{
if(PWM_ON)
{
if(pwm_val <= val_left)
{
if(LIN1==1&&LIN2==1&&RIN1==1&&RIN2==1)
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 1 ;ROUT2 = 0 ;}
else if(LIN1==0&&LIN2==1&&RIN1==1&&RIN2==1)
{ LOUT1 = 1 ;LOUT2 = 0 ;ROUT1 = 1 ;ROUT2 = 0 ;}//快左拐
else if(LIN1==0&&LIN2==0&&RIN1==1&&RIN2==1)
{ LOUT1 = 1 ;LOUT2 = 0 ;ROUT1 = 1 ;ROUT2 = 0 ;}//快左拐
else if(LIN1==1&&LIN2==0&&RIN1==1&&RIN2==1)
{ LOUT1 = 0 ;LOUT2 = 0 ;ROUT1 = 1 ;ROUT2 = 0 ;}//慢左拐
else if(LIN1==1&&LIN2==1&&RIN1==0&&RIN2==1)
CarTurnRight_Low();//慢右拐
else if(LIN1==1&&LIN2==1&&RIN1==1&&RIN2==0)
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 0 ;ROUT2 = 1 ;}//快右拐
else if(LIN1==0&&LIN2==0&&RIN1==1&&RIN2==1)
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 0 ;ROUT2 = 1 ;}//快右拐
else if((LIN1==0&&LIN2==0&&RIN1==1&&RIN2==0)||(LIN1==0&&LIN2==1&&RIN1==0&&RIN2==1)||(LIN1==1&&LIN2==0&&RIN1==0&&RIN2==1))
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 1 ;ROUT2 = 0 ;}
}
else
{
LOUT1 = 0 ;LOUT2 = 0 ;ROUT1 = 0 ;ROUT2 = 0 ;
}
if(pwm_val>=20)
pwm_val=0;
}
else
{
LOUT1 = 0 ;LOUT2 = 0 ;ROUT1 = 0 ;ROUT2 = 0 ;
}
}
void main()
{
P2=0X00; //關電機
// delay(1000);
TMOD=0X01;
TH0= 0XFC;//0xFF;//0.25ms 定時//0XFC; //1ms定時
TL0= 0X66;//0x1A;//0X66;
TR0= 1;
ET0= 1;
EA = 1; //開總中斷
while(1) //無限循環 無黑線為零全亮0 有黑線燈滅為一
{ //作用當為直道時 無調速即全速前進 彎道時有調速
if(LIN1==0&&LIN2==0&&RIN1==0&&RIN2==0)
{PWM_ON = 0; CarGoAhead();}
else
{PWM_ON = 1;}
}
}
//TIMER0中斷服務子函數產生PWM信號
void timer0()interrupt 1
{
TH0=0XFC; //1Ms定時
TL0=0X66;
pwm_val++;
pwm_moto();
}
//定義小車光電模塊輸入IO口
sbit LIN1 = P1^0; //左循跡紅外傳感器
sbit LIN2 = P1^1;
sbit RIN1 = P1^2; //右循跡紅外傳感器
sbit RIN2 = P1^3;
//定義小車電機驅動模塊輸出IO口
sbit LOUT1 = P2^0;//LIN1 LIN3 IN1 IN2 電機1的轉速和方向
sbit LOUT2 = P2^1;//LIN2 LIN4 IN3 IN4 電機2的轉速和方向
sbit ROUT1 = P2^2;//RIN1 RIN3
sbit ROUT2 = P2^3;//RIN2 RIN4
//#define Left_moto_go {LOUT1 = 0,LOUT2 = 1;} //左邊電機正轉
//#define Left_moto_back {LOUT1 = 1,LOUT2 = 0;} //左邊電機反轉
//#define Left_moto_Stop {LOUT1 = 0,LOUT2 = 0;} //左邊電機停轉
//#define Right_moto_go {ROUT1 = 1,ROUT2 = 0;} //右邊電機正轉
//#define Right_moto_back {ROUT1 = 0,ROUT2 = 1;} //右邊電機反轉
//#define Right_moto_Stop {ROUT1 = 0,ROUT2 = 0;} //右邊電機停轉
//void delay(unsigned int xms)
//{
// unsigned int i,j;
// for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
// for(j=112;j>0;j--);
//}
void CarGoAhead(void)//快進(P1=0000 1010 P1=0x0A)
{
// Left_moto_go;
// Right_moto_go;
LOUT1 = 0 ;
LOUT2 = 1 ;
ROUT1 = 1 ;
ROUT2 = 0 ;
}
//void CarBack(void)//快退(P1=0000 0101 P1=0x05)
//{
// Left_moto_back;
// Right_moto_back;
//}
void CarTurnLeft_Low(void)//慢左拐(P1=0000 1000 P1=0x08)
{
// Left_moto_Stop;
// Right_moto_go;
LOUT1 = 0 ;
LOUT2 = 0 ;
ROUT1 = 1 ;
ROUT2 = 0 ;
}
void CarTurnLeft_High(void)//快左拐(P1=0000 1001 P1=0x09)
{
// Left_moto_back;
// Right_moto_go;
LOUT1 = 1 ;
LOUT2 = 0 ;
ROUT1 = 1 ;
ROUT2 = 0 ;
}
void CarTurnRight_Low(void)//慢右拐(P1=0000 0010 P1=0x02)
{
// Left_moto_go;
// Right_moto_Stop;
LOUT1 = 0 ;
LOUT2 = 1 ;
ROUT1 = 0 ;
ROUT2 = 0 ;
}
void CarTurnRight_High(void)//快右拐(P1=0000 0110 P1=0x06)
{
// Left_moto_go;
// Right_moto_back;
LOUT1 = 0 ;
LOUT2 = 1 ;
ROUT1 = 0 ;
ROUT2 = 1 ;
}
|
-
0.png
(87.85 KB, 下載次數: 158)
下載附件
2019-1-25 03:22 上傳
-
0.png
(57.93 KB, 下載次數: 136)
下載附件
2019-1-25 03:22 上傳
-
-
51循跡.pdf
2019-1-21 15:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.72 MB, 下載次數: 46, 下載積分: 黑幣 -5
評分
-
查看全部評分
|