帮我看下这3路红外寻线小车程序对不对,麻烦修改下
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharpro_left,pro_righ...
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar pro_left,pro_right,i,j;
sbit left1=P2^3;
sbit left2=P2^4;
sbit right1=P2^6;
sbit right2=P2^7;
sbit en1=P2^2;
sbit en2=P2^5;
sbit left_red=P1^0;
sbit mid_red=P1^1;
sbit right_red=P1^2;
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);
}
}
void init()
{
left_red=0;
mid_red=1;
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i<=pro_right) {en1=1;}
else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_left) {en2=1;}
else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight()
{
pro_right=39;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_left()
{
pro_right=5;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_back()
{
left1=1;
left2=0;
right1=0;
right2=1;
pro_right=39;
pro_left=39;
}
void infrared()
{
uchar flag;
if(left_red==1)
{flag=1;}
else
if(right_red==1)
{flag=2;}
else
if((left_red==0)&(mid_red==0)&(right_red==0))
{flag=3;}
else flag=0;
switch (flag)
{
case 0: straight();
break;
case 1: turn_left();
break;
case 2: turn_right();
break;
case 3: turn_back();
break;
default:
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
// straight();
}
}
void int0(void)interrupt 0
{
} 展开
#define uchar unsigned char
#define uint unsigned int
uchar pro_left,pro_right,i,j;
sbit left1=P2^3;
sbit left2=P2^4;
sbit right1=P2^6;
sbit right2=P2^7;
sbit en1=P2^2;
sbit en2=P2^5;
sbit left_red=P1^0;
sbit mid_red=P1^1;
sbit right_red=P1^2;
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);
}
}
void init()
{
left_red=0;
mid_red=1;
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i<=pro_right) {en1=1;}
else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_left) {en2=1;}
else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight()
{
pro_right=39;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_left()
{
pro_right=5;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_back()
{
left1=1;
left2=0;
right1=0;
right2=1;
pro_right=39;
pro_left=39;
}
void infrared()
{
uchar flag;
if(left_red==1)
{flag=1;}
else
if(right_red==1)
{flag=2;}
else
if((left_red==0)&(mid_red==0)&(right_red==0))
{flag=3;}
else flag=0;
switch (flag)
{
case 0: straight();
break;
case 1: turn_left();
break;
case 2: turn_right();
break;
case 3: turn_back();
break;
default:
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
// straight();
}
}
void int0(void)interrupt 0
{
} 展开
1个回答
展开全部
1.小车控制及驱动单元的选择
此部分是整个小车的大脑,是整个小车运行的核心部件,起着控制小车所有运行状态的作用。通常选用单
片机作为小车的核心控制单元,本文以台湾凌阳公司的SPCE061A单片机为例予以介绍。SPCE061是一款拥有
2K RAM、32KFlash、32 个I/O 口,并集成了AD/DA功能强大的16位微处理器,它还拥有丰富的语音处理功能,
为小车的功能扩展提供了相当大的空间。只要按照该单片机的要求对其编制程序就可以实现很多不同的功能。
小车驱动电机一般利用现成的玩具小车上的配套直流电机。考虑到小车必须能够前进、倒退、停止,
并能灵活转向,在左右两轮各装一个电机分别进行驱动。当左轮电机转速高于右轮电机转速时小车向右转,
反之则向左转。为了能控制车轮的转速,可以采取PWM调速法,即由单片机的IOB8、IOB9输出一系列频率固定
的方波,再通过功率放大来驱动电机,在单片机中编程改变输出方波的占空比就可以改变加到电机上的平均
电压,从而可以改变电机的转速。左右轮两个电机转速的配合就可以实现小车的前进、倒退、转弯等功能。
2.小车循迹的原理
这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断
地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果
遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来
确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过15cm。对于发射和接收红
外线的红外探头,可以自己制作或直接采用集成式红外探头。
(1)自制红外探头电路如图1所示,红外光的发送接收选用型号为ST168的对管。当小车在白色地面行驶时,
装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中
光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三
极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。将检测到的信号送到单片机I/O口,
当I/O口检测到的信号为高电平时,表明红外光被地上的黑色引导线吸收了,表明小车处在黑色的引导线上;
同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。此种方法简单,价格便宜,灵敏度可
调,但是容易受到周围环境的影响,特别是在图1较强的日光灯下,对检测到的信号有一定的影响。
(2)集成式红外探头可以采用型号为E3F-DS10C4集成断续式光电开关探测器,它具有简单、可靠的工作性
能,只要调节探头上的一个旋钮就可以控制探头的灵敏度。该探头输出端只有三根线(电源线、地线、信号线)
,只要将信号线接在单片机的I/O口,然后不停地对该I/O口进行扫描检测,当其为高电平时则检测到白纸,当
为低电平时则检测到黑线。此种探头还能有效地防止普通光源(如日光灯等)的干扰。其缺点则是体积比较大
,占用了小车有限的空间。
3.红外探头的安装
在小车具体的循迹行走过程中,为了能精确测定黑线位置并确定小车行走的方向,需要同时在底盘装设4个
红外探测头,进行两级方向纠正控制,提高其循迹的可靠性。这4个红外探头的具体位置如图2所示。图中循迹
传感器共安装4个,全部在一条直线上。其中InfraredMR与InfraredML 为第一级方向控制传感器,InfraredSR
与InfraredSL 为第二级方向控制传感器。小车行走时,始终保持黑线(如图2 中所示的行走轨迹黑线)
在InfraredMR和InfraredML这两个第一级传感器之间,当小车偏离黑线时,第一级探测器一旦探测到有黑线,
单片机就会按照预先编定的程序发送指令给小车的控 制系统,控制系统再对小车路径予以纠正。若小车回到
了轨道上,即4个探测器都只检测到白纸,则小车会继续行走;若小车由于惯性过大依旧偏离轨道,越出了第
一级两个探测器的探测范围,这时第二级动作,再次对小车的运动进行纠正,使之回到正确轨道上去。可以看
出,第二级方向探测器实际是第一级的后备保护,从而提高了小车循迹的可靠性。
4.软件控制
其程序控制框图如图3。小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测
到某个I/O口有信号,即进入判断处理程序(switch),先确定4个探测器中的哪一个探测到了黑线,如
果InfraredML(左面第一级传感器)或者InfraredSL(左面第二级传感器)探测到黑线,即小车左半部分压到黑线
,车身向右偏出,此时应使小车向左转;如果是InfraredMR(右面第一级传感 器)或InfraredSR(右面第二级传
感器)探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。在经过了方向调整
后,小车再继续向前行走,并继续探测黑线重复上述动作。
由于第二级方向控制为第一级的后备,则两个等级间的转向力度必须相互配合。第二级通常是在超出第一
级的控制范围的情况下发生作用,它也是最后一层保护,所以它必须要保证小车回到正确轨迹上来,则通常使
第二级转向力度大于第一级,即level2>level1(level1、level2为小车转向力度,其大小通过改变单片机输出
的占空比的大小来改变),具体数值在实地实验中得到。
专家点评:根据本文所讲述的方法,我们可以较容易地做出按照一定轨迹行走的智能电动小车。但是按照
该方法行走的小车如果是走直线,有可能会是蛇形前进。为了使小车能够按轨迹行走的更流畅,可以在软件编
程时运用一些简单的算法。例如,在对小车进行纠偏时,适当提前停止纠偏,而不要等到小车完全不偏时再停
止,以防止小车的过冲。
此部分是整个小车的大脑,是整个小车运行的核心部件,起着控制小车所有运行状态的作用。通常选用单
片机作为小车的核心控制单元,本文以台湾凌阳公司的SPCE061A单片机为例予以介绍。SPCE061是一款拥有
2K RAM、32KFlash、32 个I/O 口,并集成了AD/DA功能强大的16位微处理器,它还拥有丰富的语音处理功能,
为小车的功能扩展提供了相当大的空间。只要按照该单片机的要求对其编制程序就可以实现很多不同的功能。
小车驱动电机一般利用现成的玩具小车上的配套直流电机。考虑到小车必须能够前进、倒退、停止,
并能灵活转向,在左右两轮各装一个电机分别进行驱动。当左轮电机转速高于右轮电机转速时小车向右转,
反之则向左转。为了能控制车轮的转速,可以采取PWM调速法,即由单片机的IOB8、IOB9输出一系列频率固定
的方波,再通过功率放大来驱动电机,在单片机中编程改变输出方波的占空比就可以改变加到电机上的平均
电压,从而可以改变电机的转速。左右轮两个电机转速的配合就可以实现小车的前进、倒退、转弯等功能。
2.小车循迹的原理
这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断
地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果
遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来
确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过15cm。对于发射和接收红
外线的红外探头,可以自己制作或直接采用集成式红外探头。
(1)自制红外探头电路如图1所示,红外光的发送接收选用型号为ST168的对管。当小车在白色地面行驶时,
装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中
光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三
极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。将检测到的信号送到单片机I/O口,
当I/O口检测到的信号为高电平时,表明红外光被地上的黑色引导线吸收了,表明小车处在黑色的引导线上;
同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。此种方法简单,价格便宜,灵敏度可
调,但是容易受到周围环境的影响,特别是在图1较强的日光灯下,对检测到的信号有一定的影响。
(2)集成式红外探头可以采用型号为E3F-DS10C4集成断续式光电开关探测器,它具有简单、可靠的工作性
能,只要调节探头上的一个旋钮就可以控制探头的灵敏度。该探头输出端只有三根线(电源线、地线、信号线)
,只要将信号线接在单片机的I/O口,然后不停地对该I/O口进行扫描检测,当其为高电平时则检测到白纸,当
为低电平时则检测到黑线。此种探头还能有效地防止普通光源(如日光灯等)的干扰。其缺点则是体积比较大
,占用了小车有限的空间。
3.红外探头的安装
在小车具体的循迹行走过程中,为了能精确测定黑线位置并确定小车行走的方向,需要同时在底盘装设4个
红外探测头,进行两级方向纠正控制,提高其循迹的可靠性。这4个红外探头的具体位置如图2所示。图中循迹
传感器共安装4个,全部在一条直线上。其中InfraredMR与InfraredML 为第一级方向控制传感器,InfraredSR
与InfraredSL 为第二级方向控制传感器。小车行走时,始终保持黑线(如图2 中所示的行走轨迹黑线)
在InfraredMR和InfraredML这两个第一级传感器之间,当小车偏离黑线时,第一级探测器一旦探测到有黑线,
单片机就会按照预先编定的程序发送指令给小车的控 制系统,控制系统再对小车路径予以纠正。若小车回到
了轨道上,即4个探测器都只检测到白纸,则小车会继续行走;若小车由于惯性过大依旧偏离轨道,越出了第
一级两个探测器的探测范围,这时第二级动作,再次对小车的运动进行纠正,使之回到正确轨道上去。可以看
出,第二级方向探测器实际是第一级的后备保护,从而提高了小车循迹的可靠性。
4.软件控制
其程序控制框图如图3。小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测
到某个I/O口有信号,即进入判断处理程序(switch),先确定4个探测器中的哪一个探测到了黑线,如
果InfraredML(左面第一级传感器)或者InfraredSL(左面第二级传感器)探测到黑线,即小车左半部分压到黑线
,车身向右偏出,此时应使小车向左转;如果是InfraredMR(右面第一级传感 器)或InfraredSR(右面第二级传
感器)探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。在经过了方向调整
后,小车再继续向前行走,并继续探测黑线重复上述动作。
由于第二级方向控制为第一级的后备,则两个等级间的转向力度必须相互配合。第二级通常是在超出第一
级的控制范围的情况下发生作用,它也是最后一层保护,所以它必须要保证小车回到正确轨迹上来,则通常使
第二级转向力度大于第一级,即level2>level1(level1、level2为小车转向力度,其大小通过改变单片机输出
的占空比的大小来改变),具体数值在实地实验中得到。
专家点评:根据本文所讲述的方法,我们可以较容易地做出按照一定轨迹行走的智能电动小车。但是按照
该方法行走的小车如果是走直线,有可能会是蛇形前进。为了使小车能够按轨迹行走的更流畅,可以在软件编
程时运用一些简单的算法。例如,在对小车进行纠偏时,适当提前停止纠偏,而不要等到小车完全不偏时再停
止,以防止小车的过冲。
上海边城电子科技有限公司
2023-07-25 广告
2023-07-25 广告
使用无线讲解器时需要注意以下几点:1. 外观设计:选择一款一体化设计的无线讲解器,确保发射器和接收器外观简洁、紧凑,方便携带和隐藏,避免影响讲解过程。2. 声音质量:购买前需要测试无线讲解器的声音质量,确保发射器和接收器之间的音频传输清晰、...
点击进入详情页
本回答由上海边城电子科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询