TCRT5000模块(循迹)
1、模块原理:红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或强度不够大时,模块的输出高电平1(指示灯不亮);当红外线有被反射回来,此时模块输出低电平0(指示灯亮)
2、接线:vcc接5v,gnd接地,DOttl开关信号输出,A0模拟信号输出(不同距离输出不同电压,在此实验可以不接)
3、循迹原理:有感应到黑线,红外线被吸收反射较弱,DO=1(灭灯);没有感应到黑线,红外线能反射回来,DO=0(亮灯)
向前:两个模块都能反射回来,输出低电平
向左:左边压线,左边模块反射不回来是高电平,右边模块能反射回来是低电平
向右:右边压线,左边模块能反射回来输出低电平,右边模块反射不回来输出低电平
4、识别不灵敏或过于灵敏的时候将模上电位器调整到合适的位置
代码:
1、
main.c
//#include "reg52.h"//代码里边没有,sbit i/o口,可以不要声明 //#include "intrins.h"//代码里边没有_nop_();可以不要该声明 #include "motor.h" #include "dalay.h" #include "uart.h" sbit leftsenser=P2^6; sbit rightsenser=P2^7; void main() { Delay1000ms(); UartInit(); if(leftsenser==0&&rightsenser==0){ goforward(); } if(leftsenser==1&&rightsenser==0){ goleft(); } if(leftsenser==0&&rightsenser==1){ goright(); } if(leftsenser==1&&rightsenser==1){ stop(); } while(1); }
2、
motor.c
#include "reg52.h" sbit right1=P3^2; sbit right2=P3^3; sbit left1=P3^4; sbit left2=P3^5; void goback() { left1=1; left2=0; right1=1; right2=0; } void goforward() { left1=0; left2=1; right1=0; right2=1; } void goleft() { left1=0; left2=0; right1=0; right2=1; } void goright() { left1=0; left2=1; right1=0; right2=0; } void stop() { left1=0; left2=0; right1=0; right2=0; }
motor.h
void goback(); void goforward(); void goleft(); void goright(); void stop();
3、
uart.c
#include "reg52.h" #include "motor.h" #include "string.h" #define SIZE 12 sfr AUXR=0x8E;//不认识AUXR,报错需要声明 char buffer[SIZE]; void UartInit(void) //9600bps@11.0592MHz { AUXR=0x01; SCON=0x50;//配置串口工作方式1,ren能接收01000000 TMOD&=0x0F; TMOD|=0x20;//定时器1的工作方式8位自动重装配置 TH1=0xFD; TL1=0xFD;//9600波特率的初值 TR1=1;//启动定时器 EA=1;//打开总中断 ES=1;//允许串口中断 } void uart_toutine()interrupt 4 { static int i = 0; char tmp; if(RI) { RI = 0; tmp = SBUF; if(tmp=='M'){//WIFI GOT IP中既包含W、又包含F,底下条件满足FI,D5亮 i = 0; } buffer[i++] = tmp; if(buffer[0] == 'M'){ switch(buffer[1]){ case '1': goforward(); break; case '2': goleft(); break; case '3': goright(); break; case '4': goback(); break; default: stop(); break; } } } if(i == 12){ memset(buffer, '\0', SIZE); i = 0; } }
uart.h
void UartInit(); //9600bps@11.0592MHz
4、
dalay.c
#include "intrins.h" void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); }
dalay.h
void Delay1000ms();