#include<reg52.h>//包含51单片机头文件,内部有各种寄存器定义
//定义小车驱动模块输入IO口
sbit L293D_IN1=P1^2;
sbit L293D_IN2=P1^3;
sbit L293D_IN3=P1^4;
sbit L293D_IN4=P1^5;
sbit L293D_EN1=P1^6;
sbit L293D_EN2=P1^7;
sbit Left_moto_pwm=P1^6; //PWM信号端
sbit Right_moto_pwm=P1^7; //PWM信号端
sbit Left_1_led =P3^7; //左传感器
sbit zhong_1_led =P3^5;
sbit Right_1_led = P3^6; //右传感器
/***蜂鸣器接线定义*****/
sbit BUZZ=P2^3;
/*
#define Left_moto_go {P1_2=1,P1_3=0;} //左电机向前走
#define Left_moto_back {P1_2=0,P1_3=1;} //左边电机向后转
#define Left_moto_Stop {P1_2=0,P1_3=0;} //左边电机停转
#define Right_moto_go {P1_4=1,P1_5=0;} //右边电机向前走
#define Right_moto_back {P1_4=0,P1_5=1;} //右边电机向后走
#define Right_moto_Stop {P1_4=0,P1_5=0;} //右边电机停转
*/
unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =15;// 左电机占空比N/20
unsigned char pwm_val_right =0;
unsigned char push_val_right=15;// 右电机占空比N/20
// bit Right_moto_stop=1;
// bit Left_moto_stop =1;
//unsigned int time=0;
/* unsigned int tt = 0x00;
unsigned int ii = 0x00;
unsigned int xx = 0x00;
unsigned int i = 0x00;
unsigned char yy,vv,bb;*/
/************************************************************************/
//延时函数
/* void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
} */
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void left_moto(void)
{
if(pwm_val_left<=push_val_left) //17
{
Left_moto_pwm=1;
}
else
{
Left_moto_pwm=0;
}
}
/******************************************************************/
/* 右电机调速 */
void right_moto(void)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
}
else
{
Right_moto_pwm=0;
}
}
/************************************************************************/
//前速前进
void run(void)
{
push_val_left=17; //速度调节变量 0-20。。。0最小,20最大
push_val_right=17;
L293D_IN1=1,L293D_IN2=0,L293D_IN3=1,L293D_IN4=0;
}
//后退函数
// void backrun(void)
//{
// push_val_left=12; //速度调节变量 0-20。。。0最小,20最大
// push_val_right=12;
// Left_moto_back; //左电机往后走
// Right_moto_back; //右电机往后走
//}
//左转
void leftrun(void)
{ //vv++;
push_val_left=5;
push_val_right=10;
L293D_IN1=1; L293D_IN2=0, L293D_IN3=0; L293D_IN4=1;
}
//右转
void rightrun(void)
{
//bb++;
push_val_left=10;
push_val_right=5;
L293D_IN1=1; L293D_IN2=0,L293D_IN3=0; L293D_IN4=1;
}
/*********************************************************************/
//#endif
//主函数
//unsigned int leijia=1;
void main(void)
{
P1=0X00; //关电机
TMOD=0X01;
TH0= 0XFc; //1ms定时
TL0= 0X18;
TR0= 1;
ET0= 1;
EA = 1; //开总中断
while(1) //无限循环
{
//有信号为0 没有信号为1
if(Left_1_led==0&&Right_1_led==0&&zhong_1_led==0)
{
// run(); //调用前进函数
}
else if(Left_1_led==1&&Right_1_led==0&&zhong_1_led==1) //左边检测到黑线
{
rightrun();
}
else if(Right_1_led==1&&Left_1_led==0&&zhong_1_led==1) //右边检测到黑线
{
leftrun();
}
else if(Right_1_led==1&&Left_1_led==1&&zhong_1_led==0) //右边检测到黑线
{
run();
}
else
{ L293D_IN1=0;
L293D_IN2=0;
L293D_IN3=0;
L293D_IN4=0; }
}
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XFc; //1Ms定时
TL0=0X18;
//time++;
pwm_val_right++;
pwm_val_left++;
right_moto() ;
left_moto() ;
if(pwm_val_left>=20)
{ pwm_val_left=0;}
if(pwm_val_right>=20)
{pwm_val_right=0; }
}
|