STC89C51基础及项目第14天:循迹小车、跟随小车、避障小车

1. 循迹小车基本原理和方案(269.114)

循迹模块使用

  • TCRT5000传感器的红外发射二极管不断发射红外线:
  • 当发射出的红外线 没有 被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为 高电平,指示二极管一直处于 熄灭状态
  • 被检测物体出现 在检测范围内 时,红外线 被反射回来 且强度足够大,红外接收管饱和,此时模块的输出端为 低电平,指示二极管 被点亮
  • 总结:没反射回来,D0输出高电平,灭灯
    在这里插入图片描述

在这里插入图片描述

  • 接线方式
    • VCC:接电源正极(3 - 5V)
    • GND:接电源负极
    • DO: TTL开关信号输出 0、1
    • AO: 模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)

循迹小车原理

  • 由于黑色具有较强的吸收能力,当循迹模块发射的红外线 照射到黑线时,红外线将会 被黑线吸收,导致循迹模块上光敏三极管 处于关闭状态,此时模块上 一个 LED 熄灭
  • 没有检测到 黑线时,模块上 两个 LED 常亮
  • 总结:有感应到黑线,D0输出高电平,灭灯
    在这里插入图片描述
  • 循迹模块安装在小车车头两侧:
    • 下方小车两个模块都能 反射回来红外,输出 低电平,灯亮,直走
    • 上方小车左模块遇到黑线,红外被吸收,左模块输出 高电平且左灯灭,右模块输出 低电平且右灯亮,左转,反之右转

2. 根据循迹原理实现循迹功能代码编写(270.115)

  • 代码(20./07. 循迹小车实现)(不调速方式写代码)
#include "motor.h"
#include "delay.h"
#include "reg52.h"

sbit leftSensor = P2^7;
sbit rightSensor = P2^6;

void main(){
   
//下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走
//上方小车左模块遇到黑线,红外被吸收,左模块输出高电平且左灯灭,右模块输出低电平且右灯亮,左转,反之右转
	while(1){
   
		if(leftSensor == 0 && rightSensor == 0){
   //左右都反射回来,都低电平,直走,灯都亮
			goForward();
		}
		
		if(leftSensor == 1 && rightSensor == 0){
   //左边没反射回来,左高电平,左转,右灯亮
			goLeft();
		}
		
		if(leftSensor == 0 && rightSensor == 1){
   //右边没反射回来,右高电平,右转,左灯亮
			goRight();
		}
		
		if(leftSensor == 1 && rightSensor == 1){
   //左右都没反射回来,都高电平,停,灯都不亮
			stop();
		}
	}
}

3. 循迹实际测试和电位器调节(271.116)

4. 解决转弯干滑问题,加入电机调速

#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "timer.h"
#include "reg52.h"

sbit leftSensor = P2^7;
sbit rightSensor = P2^6;

extern char speedLeft;
extern char speedRight;

void main(){
   
	Timer0Init();
	Timer1Init();
	
#include #include "qudong.h" #include "duankou.h" #include "lcd1602.h" #include "celv.h" #define uchar unsigned char #define uint unsigned int #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //****************************************************************************** //全局变量 //****************************************************************************** float voltage=6.0; //实际电压值 int RS1=100; int LS1=100; int RS0=100; int LS0=100; char heixian=0x03; //不等于0x03表示检测到信号,等于0x03表示没检测到信号 char ji_shu=0; //表示第几次检测到黑线 char youxinhao=0; //=1表示检测到信号,=0表示没有检测到信号 uint total_time_count=0;//时间相关变量 uint start_low_speed=0; uint end_low_speed=0; uint end_all=0; uint start_all=0; uint LM_cap_new=0; //测速相关变量 uint LM_cap_old=0; uint LM_cap_count=0; uint LM_mai_kuai=0; float real_LM_speed=0.0; float top_speed=0; float average_speed=0; uint RM_cap_new=0; uint RM_cap_old=0; uint RM_cap_count=0; uint RM_mai_kuai=0; float real_RM_speed=0.0; float total_distance=0; //测量值转化为实际值相关变量 float dis1=0; float dis0=0; uint low_speed_time=0; uint total_time=0; //****************************************************************************** //系统时钟初始化,aclk=32768k,mclk=XT2,SMCLK = XT2。 //****************************************************************************** void Init_clock(void) { DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO数字晶振最高频率 BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL选择高速晶振最高频率 BCSCTL2 |=SELM_2+SELS; //MCLK=8M,SMCLK = XT2,系统主时钟选择高速晶振 do //清除振荡器失效标志,等振荡器稳定。 { IFG1&=~OFIFG; for(unsigned int i=0XFF;i>0;i--); } while((IFG1&OFIFG)!=0); } #pragma vector=ADC_VECTOR //ADC12 interrupt service routine __interrupt void ADC12_ISR (void) { if(ADC12MEM0<2816)P6OUT&=~BIT3; //欠压指示灯亮 else P6OUT|=BIT3; } //*************************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值