#include<reg52.h>
unsigned char pow_left_var = 170; //左电机占空比为0~170 0最快
unsigned char pow_right_var = 170;//右电机占空比为0~170 0最快
unsigned char pow_t;//周期
#define uint unsigned int
#define uchar unsigned char
/*独立按键位定义*/
//sbit key_s3 = P3^1;
//sbit key_s4 = P3^2;
sbit IN1 = P1^2; //为1 左电机反转
sbit IN2 = P1^3; //为1 左电机正转
sbit IN3 = P1^6; //为1 右电机正转
sbit IN4 = P1^7; //为1 右电机反转
sbit EN1 = P1^4; //为1 左电机使能
sbit EN2 = P1^5; //为1 右电机使能
sbit left_led1 = P3^3; //左寻迹信号 为1时识别到黑线 为0没有识别到黑线
sbit right_led1 = P3^2;//右寻迹信号 为1时识别到黑线 为0没有识别到黑线
#define left_motor_en EN1 = 1 //左电机使能
#define left_motor_stops EN1 = 0 //停止左电机使能
#define right_motor_en EN1 = 1 //右电机使能
#define right_motor_stops EN1 = 0 //停止右电机使能
#define left_motor_go IN1 = 0 , IN2 = 1 //左电机正转
#define left_motor_back IN1 = 1 , IN2 = 0 //左电机反转
#define right_motor_go IN4 = 0 , IN3 = 1 //右电机正转
#define right_motor_back IN4 = 1 IN3 = 0 //右电机反转
void left() //左转
{
left_motor_stops;//停止左电机使能
right_motor_en; //右电机使能
right_motor_go; //右电机正转
}
void right() //右转
{
right_motor_stops;//停止右电机使能
left_motor_en; //左电机使能
left_motor_go; //左电机正转
}
void forward() //小车前进
{
right_motor_en; //右电机使能
left_motor_en; //左电机使能
right_motor_go; //右电机正转
left_motor_go; //左电机正转
}
void dsqzd()//定时器初始化
{
EA = 1; //开总中断
TR0 = 1;//允许启动定时器0中断
TMOD = 0X02;//8位重装模式
TH0 = 240; //11.0892M晶振下占空比为256 频率100HZ
TL0 = 240;
ET0 = 1;//启动定时器0
}
void timer0() interrupt 1 //定时器0中断
{
pow_t++;
if(pow_t == 255)
{
pow_t = EN1 = EN2 = 0; //左右使能为0
}
if(pow_left_var == pow_t)
{
EN1 = 1; //左电机使能
}
if(pow_right_var == pow_t)
{
EN2 = 1; //右电机使能
}
}
void main()
{
while(1)
{
if(left_led1 == 1 && right_led1 == 1) //左右都在黑线上
forward();//前进
if(left_led1 == 1 && right_led1 == 0) //右边在黑线上
left(); //左转
if(left_led1 == 0 && right_led1 == 1) //左边在黑线上
right(); //右转
}
}
|