标题:
小车直线行驶单片机编程
[打印本页]
作者:
heruojun760
时间:
2019-7-13 16:19
标题:
小车直线行驶单片机编程
小车直线行驶编程部分
单片机源程序如下:
#include "REG52.H"
#include <intrins.h> //包含nop等系统函数
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
//按键引脚定义
sbit key = P2^0;
//定义电机引脚
sbit Left_motor_go=P2^4; //左电机前进AIN2
sbit Left_motor_back=P2^3; //左电机后退AIN1
sbit Right_motor_go=P2^1; //右电机前进BIN2
sbit Right_motor_back=P2^2; //右电机后退BIN1
sbit TrackSensorLeftPin2 = P1^1;
sbit TrackSensorLeftPin1 = P1^0;
sbit TrackSensorRightPin1 = P1^2;
sbit TrackSensorRightPin2 = P1^3;
//红外传感器采集的数据变量
uchar SensorValue1;
uchar SensorValue2;
uchar SensorValue3;
uchar SensorValue4;
//定义角度值
int myangle = 0;//舵机角度定义
int servo_p = 0;
//定义舵机引脚
sbit ServoPin=P0^6;
uchar pwm_val_left =0;//变量定义
uchar pwm_val_right =0;
uchar set_pwm_val_left = 0;
uchar set_pwm_val_right = 0;
sbit LED1 = P2^5;
sbit LED2 = P2^6;
/*
* 毫秒级延时
*/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
/*
* 舵机函数
*/
void set_angle(int angle)
{
if(angle > 18)
angle = 18;
if(angle < 8)
angle = 8;
myangle = angle;
}
/*
* 电机运行程序,仅支持电机正转
*/
void run(uchar left_speed,uchar right_speed)
{
if(left_speed >100)
left_speed = 100;
if(right_speed >100)
right_speed = 100;
set_pwm_val_left = left_speed;
set_pwm_val_right = right_speed;
return;
}
/*
* 传感器值获取函数,将引脚值赋值给变量以防止误写引脚状态。
*/
void get_sensor(void)
{
SensorValue1 = TrackSensorLeftPin1;
SensorValue2 = TrackSensorLeftPin2;
SensorValue3 = TrackSensorRightPin1;
SensorValue4 = TrackSensorRightPin2;
}
/*
* 发车按键,调用此函数,若按键未按下,则程序一直死在此函数
*/
void key_scan(void)
{
while (key!=0); //当按键没有被按下一直循环
while (key==0) //当按键被按下时
{
delay(10); //延时10ms
if (key==0) //第二次判断按键是否被按下
{
delay(100);
while (key==0); //判断按键是否被松开
}
}
}
/*
* 初始化函数
*/
void init(void)
{
//定时器0控制车速
TMOD|=0X01; //定时器0工作方式1
TH0=0XFF; //100us定时,装入初值
TL0=0XA3;
TR0=1; //启动T0工作
ET0=1; //允许T0中断
EA =1; //开总中断
//舵机引脚初始化为高电平
Left_motor_back = 0; //关反向电桥
Right_motor_back = 0;
ServoPin=1; //舵机电平拉高
set_angle(13); //舵机初始状态对正
}
/*
* 方波生成逻辑
*/
void timer0() interrupt 1
{
TH0=0XFF; //100Us定时
TL0=0XA3;
servo_p++;
//舵机处理部分
if(servo_p <= myangle)
{
ServoPin=1;
}
else if(servo_p < 200)
{
ServoPin=0;
}
else
{
servo_p = 0;
}
pwm_val_left++;
if(pwm_val_left<set_pwm_val_left)
{
Left_motor_go = 1;
}
else if(pwm_val_left<100)
{
Left_motor_go = 0;
}
else
{
pwm_val_left = 0;
}
pwm_val_right++;
if(pwm_val_right<set_pwm_val_right)
{
Right_motor_go = 1;
}
else if(pwm_val_right<100)
{
Right_motor_go = 0;
}
else
{
pwm_val_right = 0;
}
}
//简单实现循迹样例
void sensor_adjust(void)
{
//更新传感器状态,必须有
get_sensor();
if((SensorValue2 == 1)&&(SensorValue3 == 1))
{
set_angle(13);
}
if((SensorValue2 == 1)&&(SensorValue3 == 1)&&(SensorValue1 == 1)&&(SensorValue4 == 1))
{
set_angle(13);
run(0,0);
}
if(SensorValue1 == 1)
{
if(SensorValue2 == 1)
set_angle(12);
else
set_angle(11);
}
else if(SensorValue2 == 1)
{
set_angle(12);
}
else if(SensorValue3 == 1)
{
set_angle(14);
}
else if(SensorValue4 == 1)
{
if(SensorValue3 == 1)
set_angle(13);
else
set_angle(14);
}
}
void main()
{
init();
key_scan();
run(35,35);
//调用按键扫描函数
while(1)
{
sensor_adjust();
}
}
复制代码
程序51hei提供下载:
第三.zip
(31.16 KB, 下载次数: 6)
2019-7-13 16:18 上传
点击文件名下载附件
小车直线行驶
下载积分: 黑币 -5
作者:
admin
时间:
2019-7-13 23:40
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
huihuisun
时间:
2019-10-9 09:34
学习参考一下
作者:
zjd5195
时间:
2019-10-11 20:52
学习了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1