标题:
51单片机寻迹小车代码资料
[打印本页]
作者:
18223313969
时间:
2019-6-19 16:35
标题:
51单片机寻迹小车代码资料
基于51单片机循迹小车的代码,传感器为7个光电对管,前轮采用舵机转向,后轮为驱动轮,同时采用差速辅助前轮转向
单片机源程序如下:
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
/*************电机速度设定***********/
#define speed_Left3 0
#define speed_Left2 20
#define speed_Left1 20
#define speed_Middle 20
#define speed_Right1 20
#define speed_Right2 20
#define speed_Right3 0
/*************舵机转弯角度设定***********/
#define Turn_Left3 13
#define Turn_Left2 14
#define Turn_Left1 17
#define Middle 18
#define Turn_Right1 19
#define Turn_Right2 22
#define Turn_Right3 23
/***********电机引脚定义***************/
sbit left_pwm=P1^2; //左电机pwm
sbit left_motor0=P1^3; //左电机负极
sbit left_motor1=P1^4; //左电机正极
sbit right_pwm=P1^5; //右电机pwm
sbit right_motor1=P1^6; //右电机负极
sbit right_motor0=P1^7; //右电机正极
/***********舵机引脚定义***************/
sbit servo=P0^7;
/***********光电对管引脚定义***************/
sbit right_led3=P2^0; //最右侧光电对管
sbit right_led2=P2^1; //次右侧光电对管
sbit right_led1=P2^2; //内右侧光电对管
sbit middle_led=P2^3; //中间光电对管
sbit left_led1 =P2^4; //内左侧光电对管
sbit left_led2 =P2^5; //次左侧光电对管
sbit left_led3 =P2^6; //最左侧光电对管
sbit restart=P1^0;
void motor_pwm(u8 left_compare,u8 right_compare);
void servo_pwm(u8 sevor_compare);
void T0_init();
void led_scan();
u16 flag_num=0;
u8 servo_num=0;
u8 motor_num=0; //定时器计数
u8 direction;
u8 left_speed;
u8 right_speed;
/********************主函数***************************/
void main()
{
u8 n;
T0_init();
left_motor0=right_motor0=0;
left_motor1=right_motor1=1; //电机正转
restart=0;
while(1)
{
led_scan();
for(servo_num=0,motor_num=0,n=0;n<1;)
{
servo_pwm(direction);
motor_pwm(left_speed,right_speed);
if(servo_num>=200) n++;
}
}
}
/*********************定时器0和1初始化函数*********************************/
void T0_init()
{
TMOD=0X11; //定时器0和1方式1:16位定时器/计数器
TH0=(65536-100)/256; //设置计数器0的高8位
TL0=(65536-100)%256; //设置计数器0的低8位
TH1=(65536-10000)/256; //设置计数器1的高8位
TL1=(65536-10000)%256; //设置计数器1的低8位
EA=1; //全局中断使能
ET0=1; //定时器0中断使能
ET1=1; //定时器1中断使能
TR0=1; //定时器0使能
TR1=0; //定时器1失能
}
/*********************定时器0中断服务函数*******************************/
void T0_time() interrupt 1 //每0.1ms加1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
servo_num++;
motor_num++;
}
/*********************定时器1中断服务函数*******************************/
void T1_time() interrupt 3 //每10ms加1
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
flag_num++;
}
/*****************舵机PWM函数*************************/
void servo_pwm(u8 compare1)
{
if(servo_num<compare1) servo=1; //高电平持续时间t=compare1*0.1 ms
else if(servo_num<200) servo=0;
}
/*****************电机PWM函数*************************/
void motor_pwm(u8 left_compare,u8 right_compare)
{
if(motor_num<left_compare) left_pwm=1;
else if(motor_num<100) left_pwm=0; //左电机占空比
if(motor_num<right_compare) right_pwm=1;
else if(motor_num<100) right_pwm=0; //右电机占空比
if(motor_num>=100) motor_num=0;
}
/*************光电对管扫描函数***************************/
void led_scan()
{
u8 n=0;
static u8 white_num=0;
static u8 stop=0;
if(restart==1) stop=0;
if(stop==0)
{
/********************中间光电对管检测到黑线则直行**********************/
if(middle_led==1)
{ direction=Middle; left_speed=speed_Middle; right_speed=speed_Middle; n++;
left_motor0=right_motor0=0;
left_motor1=right_motor1=1;
}
/**************最右(左)边光电对管检测到黑线则大左转*********************/
else if(right_led3==1)
{ direction=Turn_Right3; left_speed=speed_Middle; right_speed=speed_Right3; n++;
left_motor0=right_motor1=0;
left_motor1=right_motor0=1;
}
else if(left_led3==1)
{ direction=Turn_Left3; left_speed=speed_Left3; right_speed=speed_Middle; n++;
left_motor1=right_motor0=0;
left_motor0=right_motor1=1;
}
/**************次右(左)边光电对管检测到黑线则次左转*********************/
else if(right_led2==1)
{ direction=Turn_Right2; left_speed=speed_Middle; right_speed=speed_Right2; n++;
left_motor0=right_motor0=0;
left_motor1=right_motor1=1;
}
else if(left_led2==1)
{ direction=Turn_Left2; left_speed=speed_Left2; right_speed=speed_Middle; n++;
left_motor0=right_motor0=0;
left_motor1=right_motor1=1;
}
/**************内右(左)边光电对管检测到黑线则小左转*********************/
else if(right_led1==1)
{ direction=Turn_Right1; left_speed=speed_Middle; right_speed=speed_Right1; n++;
left_motor0=right_motor0=0;
left_motor1=right_motor1=1;
}
else if(left_led1==1)
{ direction=Turn_Left1; left_speed=speed_Left1; right_speed=speed_Middle; n++;
left_motor0=right_motor0=0;
left_motor1=right_motor1=1;
}
}
///**************************检测是否应该停车********************************/
// if(n>=4) //如果3个以上的光电对管检测到黑线
// {
// TR1=1; //定时器1使能
//
// }
// if(flag_num>2&&flag_num<12)
// {
// if(n!=0) white_num=0;
// if(n==0)
// {
// white_num++;
// if(white_num>=3) { left_speed=left_speed=0; stop=1; }
// }
// }
// else if(flag_num>=12)
// {
// TR1=0; //定时器1失能
// flag_num=0;
// white_num=0;
// }
// /*************************************************/
}
复制代码
所有资料51hei提供下载:
寻迹小车代码.zip
(101.46 KB, 下载次数: 48)
2019-6-19 16:33 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-6-20 04:16
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
tieq1952
时间:
2019-6-20 07:05
谢谢分享!!!
作者:
等温好撒旦
时间:
2022-6-9 19:54
666正是我需要的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1