51智能小车黑线寻迹(防出线) 您所在的位置:网站首页 51单片机循迹小车避障代码 51智能小车黑线寻迹(防出线)

51智能小车黑线寻迹(防出线)

2023-09-04 05:44| 来源: 网络整理| 查看: 265

此实验需要pwm的知识,实验用到的传感器主要就是RPR220传感器;实验原理就是左右两个传感器通过对红外光进行判断,如果是黑线的话输出0,否则输出1

 实验之前需要调节左右两个电位器,用一根宽度为2.6厘米的黑线尽量将左右两个LED的调到碰到黑线同时灭,离开黑线同时亮

 通过原理图找到关于实验的两个控制引脚为P3^2,P3^3;其中还要定义蜂鸣器和矩阵键盘的引脚

#ifndef __QXA51_H__ #define __QXA51_H__ /*电机驱动IO定义*/ 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;//左寻迹信号 为0没有识别到黑线 为1识别到黑线 sbit right_led1=P3^2;//右寻迹信号 为0没有识别到黑线 为1识别到黑线 sbit beep=P2^3; sbit key_s2=P3^0; #define left_motor_en EN1=1 //左电机使能 #define left_motor_stops EN1=0 //左电机停止 #define right_motor_en EN2=1 //右电机使能 #define right_motor_stops EN2=0 //右电机停止 #define left_motor_go IN1=0,IN2=1 //左电机正转 #define left_motor_back IN1=1,IN2=0 //左电机反转 #define right_motor_go IN3=1,IN4=0 //右电机正转 #define right_motor_back IN3=0,IN4=1 //右电机反转 #endif

#include #include unsigned char pwm_left_val = 150;//左电机占空比值 取值范围0-170,0最快 unsigned char pwm_right_val = 150;//右电机占空比值取值范围0-170 ,0最快 unsigned char pwm_t;//周期 void delay(unsigned int z)//毫秒级延时 { unsigned int x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*小车前进*/ void forward() { left_motor_go; //左电机前进 right_motor_go; //右电机前进 } /*小车左转*/ void left_run() { left_motor_stops; //左电机停止 right_motor_go; //右电机前进 } /*小车右转*/ void right_run() { right_motor_stops;//右电机停止 left_motor_go; //左电机前进 } /*小车后退*/ void backward() { left_motor_back; //左电机后退 right_motor_back; //右电机后退 } //定时器0中断 void timer0() interrupt 1 { pwm_t++;//周期计时加 if(pwm_t == 255) pwm_t = EN1 = EN2 = 0; if(pwm_left_val == pwm_t)//左电机占空比 EN1 = 1; if(pwm_right_val == pwm_t)//右电机占空比 EN2 = 1; } void main() { for(;;) //死循环 { if(key_s2 == 0)// 实时检测S2按键是否被按下 { delay(5); //软件消抖 if(key_s2 == 0)//再检测S2是否被按下 { while(!key_s2);//松手检测 beep = 0; //使能有源蜂鸣器 delay(200);//200毫秒延时 beep = 1; //关闭有源蜂鸣器 break; //退出FOR死循环 } } } delay(1000);//延时1秒 TMOD |= 0x02;//8位自动重装模块 TH0 = 220; TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ TR0 = 1;//启动定时器0 ET0 = 1;//允许定时器0中断 EA = 1;//总中断允许 while(1) { //为0 没有识别到黑线 为1识别到黑线 if(left_led1 == 1 && right_led1 == 1)//左右寻迹探头识别到黑线 { forward();//前进 } else { if(left_led1 == 1 && right_led1 == 0)//小车右边出线,左转修正 { left_run();//左转 } if(left_led1 == 0 && right_led1 == 1)//小车左边出线,右转修正 { right_run();//右转 } if(left_led1 == 0 && right_led1 == 0)//左右寻迹探头都没识别到黑线 { backward();//后退 } } } }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有