#include<reg52.h>
#include"touwenjian.h"
sbit IN1=P1^2;
sbit IN2=P1^3;
sbit IN3=P1^6;
sbit IN4=P1^7;
sbit EN1=P1^4;
sbit EN2=P1^5;
//定義按鍵
sbit K4=P3^7;
//sbit K3=P3^6;
//蜂鳴器驅動口定義
sbit FM=P2^3;
//循跡LED指示燈定義
sbit Left_1_led=P3^3; //左循跡紅外傳感器
sbit Right_1_led=P3^2; //右循跡紅外傳感器
//避障LED指示燈定義
sbit Left_2_led=P3^4; //左避障紅外傳感器
sbit Right_2_led=P3^5; //右避障紅外傳感器
#define left_go {IN1=0,IN2=1;} //左電機向前走
#define left_back {IN1=1,IN2=0;} //左邊電機向后轉
#define left_stop {EN1=0;IN1=0,IN2=0;} //左邊電機停轉
#define right_go {IN3=1,IN4=0;} //右邊電機向前走
#define right_back {IN3=0,IN4=1;} //右邊電機向后走
#define right_stop {EN2=0;IN3=0,IN4=0;} //右邊電機停轉
unsigned char pwm_kong_left =0;
unsigned char pwm_kong_right =0;
unsigned char push_kong_left =6;
unsigned char push_kong_right =6;
bit right_pwm_on =1;
bit left_pwm_on =1;
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void qianjin(void)
{
right_go;
left_go;
}
void houtui(void)
{
right_back;
left_back;
}
void zuozhuan(void)
{
right_go;
left_stop;
}
void youzhuan(void)
{
right_stop;
left_go;
}
void tingzhi(void)
{
right_stop;
left_stop;
}
void pwm_tiaosu_right(void)
{
if(right_pwm_on)
{
if(pwm_kong_right<=push_kong_right)
{
EN1=1;
}
else
{
EN1=0;
}
if(pwm_kong_right==20)
{
pwm_kong_right=0;
}
}
else
{
EN1=0;
}
}
void pwm_tiaosu_left(void)
{
if(right_pwm_on)
{
if(pwm_kong_left<=push_kong_right)
{
EN2=1;
}
else
{
EN2=0;
}
if(pwm_kong_left==20)
{
pwm_kong_left=0;
}
}
else
{
EN2=0;
}
}
void timer0()interrupt 1 using 2
{
TH0=0XFC;
TL0=0X66;
pwm_kong_right++;
pwm_kong_left++;
pwm_tiaosu_right();
pwm_tiaosu_left();
}
//判斷案件是否按下,按下就前進
void keyscan(void) //按鍵掃描函數
{
A: if(K4==0) //判斷是否有按下信號
{
delay(10); //延時10ms
if(K4==0) //再次判斷是否按下
{
FM=0; //蜂鳴器響
while(K4==0); //判斷是否松開按鍵
FM=1; //蜂鳴器停止
}
else
{
goto A; //跳轉到A重新檢測
}
}
else
{
goto A; //跳轉到A重新檢測
}
}
void main(void)
{
P1=0x00;
// keyscan();
delay(1000);
TMOD=0X01;
TH0= 0XFC; //1ms定時
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1;
while(1) //無限循環
{
//有信號為0 沒有信號為1
if(Left_1_led==0&&Right_1_led==0)
qianjin(); //調用前進函數
else if(Left_1_led==1&&Right_1_led==0) //左邊檢測到黑線
{
zuozhuan(); //調用小車左轉函數
}
else if(Right_1_led==1&&Left_1_led==0) //右邊檢測到黑線
{
youzhuan(); //調用小車右轉函數
}
else
tingzhi();
}
}
|