电子设计竞赛往返变速小车实验报告 本文关键词:小车,变速,往返,竞赛,实验
电子设计竞赛往返变速小车实验报告 本文简介:重庆邮电大学电子设计竞赛培训智能小车设计报告作者:徐国英(2013211997)曾鹏(2013212009)生物信息学院日期2015年4月5日一方案论证与选择1总体框图选定自动往返小车的题目后,我们决定购买一台符合尺寸要求的玩具遥控小车,通过去掉其遥控部分,并直接利用上面的直流电机的方法实现要求。根
电子设计竞赛往返变速小车实验报告 本文内容:
重庆邮电大学电子设计竞赛培训
智能小车设计报告
作者:
徐国英(2013211997)
曾
鹏(2013212009)
生物信息学院
日期
2015年4月5日
一方案论证与选择
1
总体框图
选定自动往返小车的题目后,我们决定购买一台符合尺寸要求的玩具遥控小车,通过去掉其遥控部分,并直接利用上面的直流电机的方法实现要求。
根据设计任务要求,经过论证选择,最终确定的系统设计框图如下:
外部传感器模块
STC89C51单片机
电机驱动模块
电源模块
系统分为单片机控制模块、外部传感器模块、电机驱动模块、电源模块、显示模块。
2
各模块方案选择
2.1控制模块
控制模块负责接收传感器的信息,并处理接收到的信息。由于我们才接触到电子设计,所以选择了相对容易学会并且普遍应用的单片机作为主控制器。在考虑到本系统无需复杂的逻辑功能,我们选择了**单片机。
2.2电源模块
采用电池作为电源直接输入直流后,用多个稳压器稳压得到理想的不同幅值直流电源。这种方法获取电源方便,且电源输出电流能力大。
2.3外部传感器模块
方案1:
该方案用光敏电阻组成光敏探测器检测黑线,用霍耳传感器进行测速。首先,光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化,只要将阻值的变化值经过比较器就可以输出高低电平。其次,使用利用霍耳效应的传感器。当载流导体或半导体出于与电流相垂直的磁场中时,在其两端将产生电位差的这一现象称为霍尔效应。如果在车轮的内侧装上一条细磁铁,把霍耳传感器同样装在车轮的内侧,测量霍尔传感器的输出就可以知道车轮转过的圈数。
方案2
使用光电对管进行检测黑线和测速,这是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。该当经过黑线时接收器输出高电平。测速时,在车轮的内侧贴上一个光电码盘,用光电对管对码盘进行检测。光电对管照射到黑色和白色的边界时输出信号会有跳变,将跳变的输出信号送给单片机进行检测就可以得到轮子的转速。
经过论证比较,由于光电对管内置可见光过滤器能减小离散光的影响,同时光电对管调理电路简单,工作性能稳定。因此,外部传感器模块选用方案二
2.4电机驱动模块
二系统硬件设计与实现
1各模块硬件设计
黑线检测,最小系统
电机驱动
1.1程序
#include
sbit
sign
=
P0^0;
sbit
result
=
P0^1;
sbit
base1
=
P3^0;
sbit
base2
=
P3^1;
bit
Index
=
0;
unsigned
char
T0RH
=
0;
unsigned
char
T0RL
=
0;
unsigned
char
RxdByte
=
0;
unsigned
char
RxdBuff
=
0;
unsigned
char
tmr
=
0;
signed
char
BlackLine
=
0;
//初始的时候黑线会自动加1归零
signed
char
Line;
unsigned
char
timer1
=
0;
unsigned
char
flag
=
0;
void
Configms(unsigned
char
ms);
void
Time1Config();
void
delay10ms(unsigned
int
c);
void
seekline();
void
main()
{
EA
=
1;
result
=
1;
RxdByte
=
0x00;
sign
=
0;
base1
=
base2
=
1;
Configms(1);
Time1Config();
while(1)
{
while(1)
{
if(BlackLine
=
6)
{
while(1)
{
if(timer1
>8);
T0RL
=
(unsigned
char)tmp;
TMOD
TMOD
|=
0x01;
TH0
=
T0RH;
TL0
=
T0RL;
ET0
=
1;
TR0
=
1;
}
void
Time1Config()
{
TMOD
TMOD
|=
0x10;
TH1
=
0xFE;
TL1
=
0x0C;
ET1
=
1;
TR1
=
1;
}
void
delay10ms(unsigned
int
c)
//10ms延时器
{
unsigned
char
a,b;
for
(;
c>0;
c--)
{
for
(b=38;
b>0;
b--)
{
for
(a=130;
a>0;
a--);
}
}
}
void
InterruptTimer0()
interrupt
1
{
TH0
=
T0RH;
TL0
=
T0RL;
seekline();
}
void
Time1(void)
interrupt
3
{TH1
=
0xFE;
TL1
=
0x0C;
timer1++;
if(timer1
>
100)
timer1
=
0;
}
三:心得体会
很开心