我有别人的程序,我使用过,没问题,你可以试试,也可以根据这个程序,学习、修改自己的程序。
头文件bst_car.h
#ifndef __BSTCAR_H__
#define __BSTCAR_H__
//定义小车驱动模块输入IO口
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_moto_go {IN1=0,IN2=1;} //左电机向前走
//#define Left_moto_back {IN1=1,IN2=0;} //左边电机向后转
#define Left_moto_Stop {EN1=0;IN1=0,IN2=0;} //左边电机停转
#define Right_moto_go {IN3=1,IN4=0;} //右边电机向前走
//#define Right_moto_back {IN3=0,IN4=1;} //右边电机向后走
#define Right_moto_Stop {EN2=0;IN3=0,IN4=0;} //右边电机停转
#endif
主程序main.c
//按下K4按键,1秒左右启电小车
//按下复位健可以停止小车
//注意程序只做参考之用,要达到最理想的寻迹效果,还需要同学们细心调试。
#include <reg52.h>
#include "bst_car.h"
unsigned char pwm_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_left =5;
unsigned char push_val_right=5;
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--) //i=xms即延时约xms毫秒
for(j=112;j>0;j--);
}
//前进
void run(void)
{
push_val_left=6; //速度调节变量 0-20。。。0最小,20最大
push_val_right=6;
Left_moto_go ;
Right_moto_go ;
}
//左转
void leftrun(void)
{
push_val_left=5;
push_val_right=5;
Right_moto_go ;
Left_moto_Stop ;
}
//右转
void rightrun(void)
{
push_val_left=5;
push_val_right=5;
Left_moto_go ;
Right_moto_Stop ;
}
//停止
void stop(void)
{
Left_moto_Stop ;
Right_moto_Stop ;
}
void pwm_out_left_moto(void)
{
if(Left_PWM_ON)
{
if(pwm_val_left<=push_val_left)
{
EN1=1;
}
else
{
EN1=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
EN1=0; //若未开启PWM则EN1=0 左电机 停止
}
}
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right)
{
EN2=1;
}
else
{
EN2=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
EN2=0;
}
}
//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1Ms定时
TL0=0X66;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void keyscan(void) //按键扫描函数
{
A: if(K4==0)
{
delay(10);
if(K4==0)
{
FM=0;
while(K4==0);
FM=1;
}
else
{
goto A;
}
}
else
{
goto A;
}
}
void main(void)
{
P1=0X00;
keyscan();
delay(1000);
TMOD=0X01;
TH0= 0XFC;
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1;
while(1)
{
if(Left_1_led==0&&Right_1_led==0)
run();
else if(Left_1_led==1&&Right_1_led==0)
{
leftrun();
}
else if(Right_1_led==1&&Left_1_led==0)
{
rightrun();
}
else
stop();
}
}
|