标题:
52单片机的避障小车代码
[打印本页]
作者:
小李子尾插
时间:
2021-8-3 15:44
标题:
52单片机的避障小车代码
利用52单片机做的一个避障小车,还有一些地方不足,供参考
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define obstructionDis 20 //到障碍物距离
sbit LED = P0^0; //距离小于20就亮
sbit Trig = P1^1; //TRIG用来发送方波
sbit Echo = P1^2; //ECHO用来接收方波
sbit Motor_1 = P2^1; //控制第一个电机正反转
sbit Motor_2 = P2^2;
sbit Motor_3 = P2^3; //控制第二个电机正反转
sbit Motor_4 = P2^4;
sbit servoMotors = P1^0; //PWM控制舵机引脚
float L = 0;
uchar sum;
uchar Motor_pwm = 0;
uchar Servor = 5; //设置舵机占空比
uchar servorTime = 0;
uchar ifLeft = 0; //左方向是否有障碍物
uchar ifRight = 0; //右方向是否有障碍物
void delay(uchar time) //延时函数
{
uchar i;
for(;time > 0;time--){
for(i = 0;i < 255;i++);
}
}
void turnLeft() //左
{
Motor_1 = 1;
Motor_2 = 0;
Motor_3 = 0;
Motor_4 = 0;
}
void turnRight() //右
{
Motor_1 = 0;
Motor_2 = 0;
Motor_3 = 1;
Motor_4 = 0;
}
void turnUp() //前
{
Motor_1 = 1;
Motor_2 = 0;
Motor_3 = 1;
Motor_4 = 0;
}
void turnDown() //后
{
Motor_1 = 0;
Motor_2 = 1;
Motor_3 = 0;
Motor_4 = 1;
}
//发射超声波测距波形
void openHc()
{
Trig = 1;
_nop_(); //1us,一共20us
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();
Trig = 0;
}
//超声波
uchar getDistance()
{
TH0 = 0;
TL0 = 0;
openHc(); //发送一个方波信号,
while(!Echo); //等于0一直循环,直到Echo为高电平,信号反弹回来
TR0 = 1; //开启定时器
while(Echo);
TR0 = 0;
sum = TH0*256 + TL0; //高八位加低八位组成16位
L = (sum*1.78)/100; //L为距离
if(L < obstructionDis){ //如果距离小于20
LED = 1;
return 0;
}else{
LED = 0;
return 1;
}
}
//控制舵机方向
void control()
{
Servor = 21; //舵机向左摆动
servorTime = 0; //从0开始计数
TR1 = 1; //开启T1,舵机开始工作
delay(200); //等待
TR1 = 0;
delay(3000);
if(getDistance() == 0){
turnLeft();
delay(200);
delay(200);
}
Servor = 13; //超声波正对前方
servorTime = 0;
TR1 = 1; //定时器T1开始工(T1用来控制舵机)
delay(200); //等待中断
TR1 = 0; //关闭定时器
delay(3000);
if(getDistance() == 0){
turnDown();
delay(200);
delay(200);
delay(100);
turnRight();
delay(200);
delay(200);
}
Servor = 5; //舵机向右
servorTime = 0;
TR1 = 1;
delay(200);
TR1 = 0;
delay(3000);
if(getDistance() == 0){
turnRight();
delay(200);
delay(200);
}
Servor = 13; //超声波正对前方
servorTime = 0;
TR1 = 1; //定时器T1开始工(T1用来控制舵机)
delay(200); //等待中断
TR1 = 0; //关闭定时器
delay(3000);
if(getDistance() == 0){
turnDown();
delay(200);
delay(200);
delay(100);
turnRight();
delay(200);
delay(200);
}
}
//初始化
void Init()
{
LED = 1; //LED先亮
EA = 1;
ET1 = 1;
TMOD |= 0x10; //00000001,方式1
TH1 = (65536 - 100)/256; //65436,100us
TL1 = (65536 - 100)%256;
}
//主程序
void main()
{
Init();
servorTime = 0;
while(1){ //如果返回的是1,则说明没有障碍物所以一直向前
turnUp();
if(getDistance() == 1){
control();
}else{
turnDown();
delay(200);
delay(200);
delay(100);
control();
break;
}
}
}
//T1中断
void T1_int() interrupt 3 //产生舵机所用脉常(输出PWM信号)
{
TH1 = 0xff; //重新赋值
TL1 = 0x9c;
servorTime++; //用来计数中断次数,加一次就代表100us
if(servorTime <= Servor){
servoMotors = 1; //舵机旋转
}else{
servoMotors = 0; //舵机停止
}
if(servorTime >= 100){ //加到100舵机就停止
servorTime = 0; //舵机停
}
}
复制代码
作者:
艾尔文
时间:
2021-9-4 17:29
博主,程序能运行吗?我看起来有点懵
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1