⑴ 51单片机 超声波红外避障 程序
这是一个超声波避障小车的源程序,可以参考下,用的89C52单片机,舵机控制转角避障。
#include<AT89x51.H>
#include <intrins.h>
#define Sevro_moto_pwm P2_7 //接舵机信号端输入PWM信号调节速度
#define ECHO P2_4 //超声波接口定义
#define TRIG P2_5 //超声波接口定义
#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机向后转
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边两个电机停转
#define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右边两个电机向前走
#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右边两个电机向前走
#define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右边两个电机停转
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
unsigned char disbuff[4] ={ 0,0,0,0,};
unsigned char posit=0;
unsigned char pwm_val_left = 0;//变量定义
unsigned char push_val_left =14;//舵机归中,产生约,1.5MS 信号
unsigned long S=0;
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned long S4=0;
unsigned int time=0; //时间变量
unsigned int timer=0; //延时基准变量
unsigned char timer1=0; //扫描时间变量
/************************************************************************/
void delay(unsigned int k) //延时函数
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void Display(void) //扫描数码管
{
if(posit==0)
{P0=(discode[disbuff[posit]])&0x7f;}//产生点
else
{P0=discode[disbuff[posit]];} if(posit==0)
{ P2_1=0;P2_2=1;P2_3=1;}
if(posit==1)
{P2_1=1;P2_2=0;P2_3=1;}
if(posit==2)
{P2_1=1;P2_2=1;P2_3=0;}
if(++posit>=3)
posit=0;
}
/************************************************************************/
void StartMole() //启动测距信号
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/***************************************************/
void Conut(void) //计算距离
{
while(!ECHO); //当RX为零时等待
TR0=1; //开启计数
while(ECHO); //当RX为1计数并等待
TR0=0; //关闭计数
time=TH0*256+TL0; //读取脉宽长度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
disbuff[0]=S%1000/100; //更新显示
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
/************************************************************************/
//前速前进
void run(void)
{
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
/************************************************************************/
//前速后退
void backrun(void)
{
Left_moto_back ; //左电机往前走
Right_moto_back ; //右电机往前走
}
/************************************************************************/
//左转
void leftrun(void)
{
Left_moto_back ; //左电机往前走
Right_moto_go ; //右电机往前走
}
/************************************************************************/
//右转
void rightrun(void)
{
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往前走
}
/************************************************************************/
//STOP
void stoprun(void)
{
Left_moto_Stop ; //左电机停走
Right_moto_Stop ; //右电机停走
}
/************************************************************************/
void COMM( void )
{
push_val_left=5; //舵机向左转90度
timer=0;
while(timer<=4000); //延时400MS让舵机转到其位置
StartMole(); //启动超声波测距
Conut(); //计算距离
S2=S;
push_val_left=23; //舵机向右转90度
timer=0;
while(timer<=4000); //延时400MS让舵机转到其位置
StartMole(); //启动超声波测距
Conut(); //计算距离
S4=S;
push_val_left=14; //舵机归中
timer=0;
while(timer<=4000); //延时400MS让舵机转到其位置 StartMole(); //启动超声波测距
Conut(); //计算距离
S1=S; if((S2<20)||(S4<20)) //只要左右各有距离小于20CM小车后退
{
backrun(); //后退
timer=0;
while(timer<=4000);
}
if(S2>S4)
{
rightrun(); //车的左边比车的右边距离小 右转
timer=0;
while(timer<=4000);
}
else
{
leftrun(); //车的左边比车的右边距离大 左转
timer=0;
while(timer<=4000);
}
} /************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_Servomoto(void)
{
if(pwm_val_left<=push_val_left)
Sevro_moto_pwm=1;
else
Sevro_moto_pwm=0;
if(pwm_val_left>=200)
pwm_val_left=0;
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
timer++; //定时器100US为准。在这个基础上延时
pwm_val_left++;
pwm_Servomoto(); timer1++; //2MS扫一次数码管
if(timer1>=20)
{
timer1=0;
Display();
}
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 0
{
} /***************************************************/ void main(void)
{ TMOD=0X11;
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
TH0=0;
TL0=0;
TR1= 1;
ET1= 1;
ET0= 1;
EA = 1; delay(100);
push_val_left=14; //舵机归中
while(1) /*无限循环*/
{ if(timer>=1000) //100MS检测启动检测一次
{
timer=0;
StartMole(); //启动检测
Conut(); //计算距离
if(S<30) //距离小于20CM
{
stoprun(); //小车停止
COMM(); //方向函数
}
else
if(S>30) //距离大于,30CM往前走
run();
}
}
}
/**************************************************************************/
下面是头文件:
头文件(一)
/*--------------------------------------------------------------------------
AT89X51.H Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __AT89X51_H__
#define __AT89X51_H__
/*------------------------------------------------
Byte Registers
------------------------------------------------*/
sfr P0 = 0x80;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr P1 = 0x90;
sfr SCON = 0x98;
sfr SBUF = 0x99;
sfr P2 = 0xA0;
sfr IE = 0xA8;
sfr P3 = 0xB0;
sfr IP = 0xB8;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
/*------------------------------------------------
P0 Bit Registers
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_ 0x01
#define STOP_ 0x02
#define PD_ 0x02 /* Alternate definition */
#define GF0_ 0x04
#define GF1_ 0x08 #define SMOD_ 0x80 /
*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0 = 0x88;
sbit IE0 = 0x89;
sbit IT1 = 0x8A;
sbit IE1 = 0x8B;
sbit TR0 = 0x8C;
sbit TF0 = 0x8D;
sbit TR1 = 0x8E;
sbit TF1 = 0x8F;
/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_ 0x01
#define T0_M1_ 0x02
#define T0_CT_ 0x04
#define T0_GATE_ 0x08
#define T1_M0_ 0x10
#define T1_M1_ 0x20
#define T1_CT_ 0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F
/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97; /
*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI = 0x98;
sbit TI = 0x99;
sbit RB8 = 0x9A;
sbit TB8 = 0x9B;
sbit REN = 0x9C;
sbit SM2 = 0x9D;
sbit SM1 = 0x9E;
sbit SM0 = 0x9F;
/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;
/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */
sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */
sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */
sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */
sbit ES = 0xAC; /* 1=Enable Serial port interrupt */
sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */ sbit EA = 0xAF; /* 0=Disable all interrupts */
/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7; sbit RXD = 0xB0; /* Serial data input */
sbit TXD = 0xB1; /* Serial data output */
sbit INT0 = 0xB2; /* External interrupt 0 */
sbit INT1 = 0xB3; /* External interrupt 1 */
sbit T0 = 0xB4; /* Timer 0 external input */
sbit T1 = 0xB5; /* Timer 1 external input */
sbit WR = 0xB6; /* External data memory write strobe */
sbit RD = 0xB7; /* External data memory read strobe */
/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0 = 0xB8;
sbit PT0 = 0xB9;
sbit PX1 = 0xBA;
sbit PT1 = 0xBB;
sbit PS = 0xBC;
sbit PT2 = 0xBD;
/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P = 0xD0;
sbit FL = 0xD1;
sbit OV = 0xD2;
sbit RS0 = 0xD3;
sbit RS1 = 0xD4;
sbit F0 = 0xD5;
sbit AC = 0xD6;
sbit CY = 0xD7;
/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */
#define TF0_VECTOR 1 /* 0x0B Timer 0 */
#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */
#define TF1_VECTOR 3 /* 0x1B Timer 1 */
#define SIO_VECTOR 4 /* 0x23 Serial port */ #endif
头文件(二)
/*--------------------------------------------------------------------------
INTRINS.H Intrinsic functions for C51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__ extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float); #endif
⑵ 基于单片机的红外避障小车设计
1、如果想学习单片机你可以在网上找一下相关资料很多。
2、如果想快速制作一个红外避障小车并掌握红外避障及其控制原理,可以尝试用精控-定时程序控制器控制器实现。
3、下图是控制器的通用接线原理图。
4、传感器可以采用日本神视CX422反射式红外传感器,检测距离在800mm范围以内,选用NPN晶体管型。
5、将此传感器直接接在控制器输入端,传感器的棕色线接24V电源,蓝色线接地线,黑色线接控制器的一个输入端。
6、转向控制需要分别接到两个输出端,例如:左转接Y1,右转接Y2。
7、控制原理:当传感器检测到有障碍物时向左转,并可设定一定的左转延时时间(例如:0.3秒),当避过障碍物后自动向右转一定的时间(例如:0.3秒),使之继续向原方向前进。
⑶ keil小车避障功能的作用
1.通过解决相关实际问题,以巩固、加深对嵌入式的认识和相关知识的理解,提高综合运用课程知识的能力。
2.熟悉与计算机相关的嵌入式方面的电子元器件和电路特性,能正确反映设计和实验成果,提高自主创新能力。
3.培养严肃认真的工作作风和严谨科学态度。通过课程设计实践,获得初步的应用经验,为以后从事生产和科研工作打下的坚实的基础。
4.培养根据课题需要选学参考书籍、查阅手册图表和文献资料的自学能力。通过独立思考,深入钻研有关问题,学会自己分析解决问题。
5.了解与课程有关的电子电路以及元器件技术规范,按课程设计任务书的要求编写设计说明书。提高自己的动手能力,培养严肃、认真的工作作风和科学态度。
6.为了完成一款自主设计、制作的嵌入式作品,以提升个人能力和队嵌入式的兴趣。
7.对避障小车的避障原理有充分的理解,掌握其避障的方法,能够对实验过程中出现的问题进行解决,发现问题,解决问题。
1.2 背景
学习智能小车系统,有助于提高搭建系统的能力和对自动控制技术的理解。智能小车是一个较为完整的智能化系统,而智能化的研究已成为我国追赶世界科技水平的重要任务。智能小车有它特有的特点:成本低,涉及的知识面广,易于拓展[1]。整个智能小车系统作为一个完整的系统,从它的原理图的实现到实物的完成的过程,不仅需要深厚的电子方面的知识,还有对电路实现的良好掌握,对于培养学生的实践能力都有重要的意义。智能小车的竞赛在我国各大高校中都受到了重视,吸引了大批的高校学生的兴趣,而且取得了很多优异的成果,为我国推进智能化的进程做出了巨大的贡献,也为智能汽车的发展提供了理论依据[2-3]。
只有当把理论和模型应用到实践中,这样的创新才用意义,我们国家这几年在智能化方面的进步越来越快,也推动了我国在国际社会上在智能化方面的话语权。智能小车是智能化的一部分,它的系统里的避障、循迹、红外遥控的技术用到了智能化,将智能化应用到传统技术上是21世纪发展的趋势。
我国虽然从改革开放以来大力发展科技创新,但是在智能化的创新水平与国外较发达的国家相比还有巨大的差距,智能竞赛在高校越来越流行,也证明了我国教育在这方面很快会赶上世界上的发展水平。本次设计是以单片机为电路板,通过编程和一些外围电路的设计来实现红外遥控,避障,循迹等功能。最重要的是把模型上的研究应用到实际生活中,智能车辆便做到了这一点[4-6]。在实际应用中比如在倒车的过程中实现的红外警报系统是以智能小车为模型而研发出来的。对于电子知识的热爱与钻研有利于研发更多智能车辆,使我们的生活更加便利、智能化。
本次课程设计主要任务是实现基于51单片机智能小车红外避障和循迹的主要功能应用。以红外避障的功能解决小车在不同的环境避开行走的障碍物,直到终点,以红外循迹的功能去感应黑线找到走出迷宫的线索为目标。让机器人小车变得更加灵活。
2 需求分析
智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探等等用途;并且能实现显示时间、速度、里程,具有红外自动寻迹、避障等功能,可程控行驶速度、定位停车,远程传输图像、按键控启动K4让小车运行起来,利用红外传感器感应黑线进行寻迹,利用红外反射感应进行红外避障功能。
图1 智能小车设计思维导图
如图1所示,我们使用STC89C52RC单片机电路板控制整个机器人小车的功能,通过接线建立好小车的电路图连接以及通过C51书写红外避障以及循迹功能程序。在设计好的场地,从出发点到终点,通过现有的功能顺利躲开障碍物的干扰以及通过智能机器人寻找黑线的功能一直走好直线且顺利到达终点,完成任务。在车的模型上分析,我们也补充到了红外感应原理,红外传播通过我们学习物理光学知识后,能解决为什么避障反应慢的问题,并解决了。
如图2所示,智能小车初步构想流程图,让整个项目实现的目标更加清晰明了。利用红外传感器,其优点是对近距离的障碍物反应速度灵敏,不同方位的传感器之间信号不会相互干扰,最终选择红外传感器作为小车的眼睛,进行避障。
由于本次实验小车轮子没有实现转弯功能,所以通过设定左右两组轮子的不同前进速度来实现转弯功能。当向右转时,左侧轮子的速度要比右侧轮子的前进速度快,反之实现左转功能,此设计需小心谨慎,防止出现轮子不同步,无法实现转弯功能。
图2 智能小车功能模块流程图
3.系统设计
3.1总体设计
3.1.1 设计思路
总体来说,这个程序设计还算比较简单,比较基础,目的就是要学会基本的应用,这个过程中利用红外线传感器发射和接收信号模块来控制单片机,让单片机翻译传输指令,从而实现相应的功能。具体的过程如下:四路红外传感器,每一路发射一个信号,检测接收到的信号,若出现高电平,则说明该方向前方有障碍物,则单片机控制电机正转和反转,从而实现绕开障碍物继续前行。同时还增加一个无线发射和无线接收模块控制单片机,让单片机翻译传输指令,从而实现相应的功能。无线发射模块发出指令,无线接收模块接收信号后,传递给单片机,单片机翻译接收到信号后,传输给驱动电路驱动电机旋转,从而实现让小车的前进、后退、左转和右转。
在主控制器模块上分析,采用STC89C52单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
⑷ 51单片机红外避障小车教程
你好,我以前参加过飞思卡尔智能小车竞赛,程序已经找不到了,但我可以给你一些建议。
寻路或者避障,主要由光电和摄像头两种,如果你采用光电去做,你需要了解一写光电传感器,距离传感器的知识。如果你选择摄像头去做,你需要了解一些AD转换,图像处理的知识
C程序应该包括电机驱动,舵机驱动,当前传感器状态识别/当前图像处理等内容
⑸ 红外避障传感器测距离原理
一般的红外测距都是采用三角测距的原理。红外发射器按照一定角度发射红外光束,遇到物体之后,光会反向回来,检测到反射光之后,通过结构上的几何三角关系,就可以计算出物体距离D。
当D的距离足够近的时候,上图中L值会相当大,如果超过CCD的探测范围,这时,虽然物体很近,但是传感器反而看不到了。
当物体距离D很大时,L值就会很小,测量量精度会变差。
因此,常见的红外传感器 测量距离都比较近,小于超声波,同时远距离测量也有最小距离的限制。
另外,对于透明的或者近似黑体的物体,红外传感器是无法检测距离的。但相对于超声来说,红外传感器具有更高的带宽。
(5)单片机遥控红外避障扩展阅读:
避障常用传感器:
不管是要进行导航规划还是避障,感知周边环境信息是第一步。
就避障来说,移动机器人需要通过传感器 实时获取自身周围障碍物信息,包括尺寸、形状和位置等信息。
避障使用的传感器多种多样,各有不同的原理和特点,目前常见的主要有视觉传感器、激光传感器、红外传感器、超声波传感器等。
⑹ c51单片机应用和c语言程序设计中怎么写小车机器人红外探测避障
红外探测避障,可以利用红外发二极管与红外接收二极管,市面上也有组装在一起的对管。
发射管发射红外线,收到障碍物阻挡反射回来,被接收管接收,不同的距离,接受管的都通率不同,因此可以检测接收管的导通率来确定障碍物的距离,单片机再控制小车避开障碍物
⑺ MSP430单片机驱动的红外避障,其避障距离一般是多少呀,看了一些报告,感觉
自己搭建电路么?之前有做过智能小车的,用光电对管大概半米吧。晚上有卖专门的红外壁障模块的,当时买的是30左右,距离好像是十几厘米到2m可调的。
⑻ 用ATmega16单片机做一个红外避障小车需要什么东西
一、最小系统
二、驱动模块(一般L298N用的较猛好多)
三、红外对光管(一般有两路、稿宏四路等多种可选)
四、驱动/逻辑 电源
五、直流减速电机(带轮子)
六、小车键知册底板
七、其他零件如短路帽、杜邦线等等
⑼ 红外避障传感器与单片机连接
单片机开始工作是需要满足一些条件的,满足基本条件刚好能工作的单片机系统就是:最小系统。所以请你按下图先搭建一个最小系统,你的程序应该没问题。
另外,你的程序是怎么烧进去的,应该没有用串口下载功能吧?(STC系列单片机支持串口下载)你可以搭一个串口下载电路,实现程序的在线更新,免得拔来拔去,把片子拔坏了。