1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 51智能小车黑线寻迹(防出线)

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

时间:2022-03-23 08:07:11

相关推荐

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

此实验需要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_stopsEN1=0 //左电机停止#define right_motor_en EN2=1 //右电机使能#define right_motor_stopsEN2=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_backIN3=0,IN4=1 //右电机反转#endif

#include <REGX52.H>#include <QXA51.H>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,输出100HZTR0 = 1;//启动定时器0ET0 = 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();//后退}}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。