2011年全国电子设计大赛小车设计论文

更新时间:2023-04-20 16:45:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

这是我参加2011年全国赛的设计论文

2011年全国大学生电子设计竞赛

设计报告

智能小车(本科C题) 广西赛区【94组】

摘 要

本系统是以AT89S52单片机为控制核心的智能小车的设计,采用L298构成电机驱动电路,,利用红外对管检测黑线,同时还用超声波传感器实现两车距离的测量,完成超车功能,其中速度由单片机输出的PWM波控制。AT80S52单片机是一款八位单片机,它的易用性和多功能性受到了广大使用者的好评。由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量度方面能达到工业实用的要求,因此在移动机器人的研制上也得到了广泛的应用。

一、 系统设计

1.1设计要求

甲车车头紧靠起点标志线,乙车车尾紧靠边界,甲、乙两辆小车同时起动,先后通过起点标志线,在行车道同向而行,实现两车交替超车领跑功能。跑道如图1所示。

这是我参加2011年全国赛的设计论文

1.1.1 基本要求

(1)甲车和乙车分别从起点标志线开始,在行车道各正常行驶一圈。

(2)甲、乙两车按图1 所示位置同时起动,乙车通过超车标志线后在超车区内实现超车功能,并先于甲车到达终点标志线,即第一圈实现乙车超过甲车。 (3)甲、乙两车在完成(2)时的行驶时间要尽可能的短。 1.1.2 发挥部分

(1)在完成基本要求(2)后,甲、乙两车继续行驶第二圈,要求甲车通过超车标志线后要实现超车功能,并先于乙车到达终点标志线,即第二圈完成甲车超过乙车,实现了交替领跑。甲、乙两车在第二圈行驶的时间要尽可能的短。

(2)甲、乙两车继续行驶第三圈和第四圈,并交替领跑;两车行驶的时要尽可能的短。 (3)在完成上述功能后,重新设定甲车起始位置(在离起点标志线前进方向40cm 范围内任意设定),实现甲、乙两车四圈交替领跑功能,行驶时间要尽可能的短。

1.2 总体方案设计

1.2.1 总体方案设计与比较

方案一:采用各种类数字电路来组成小车的控制系统,对外围黑线检测信号,超声波测距,电机驱动,电源模块进行处理。本方案电路复杂,灵活性不高,效率低,不利于小车智能化的扩展,对各路信号处理比较困难。

方案二:采用AT89S51单片机作为整机的控制单元,红外线探头采用市面通用

这是我参加2011年全国赛的设计论文

的发射管怀及接收头,经过单片机调制后发射,并用于检测边界线与标志线,控制小车前进及拐弯。利用超声波检测与前面车辆的距离,从而实现超车。此方案灵活,采用软件方法解决复杂的硬件电路部分,使系统更加简洁化,各类功能易于实现,能很好地满足题目的要求。

比较以上两种方案的优缺点,方案二简洁、灵活、可扩展性好,能达到题目的设计要求,因此采用方案二来实现。 1.2.2 系统组成

本系统主要由单片机系统、红外发射与接收电路、超声波发射电路和超声波检测接收电路、电源电路分别组成。

系统总框架图如图所示:

二、 理论分析与计算

2.1 信号检测与控制

超声波测距适用于高精度的中长距离测量。本超声波测距采用AT89S52单片机,晶振:12M,单片机用P3.4 口输出超声波换能器74ALS04转化为所需的40K 方波信号,利用外部中断0 口监测超声波接收电路输出的返回信号。通过超声波测距来检测两车的距离,从而判断小车超车的情况。

这是我参加2011年全国赛的设计论文

2.2 两车之间的通信方法

进入超车区后,通过让乙车判断两车的距离,实现超车,并让甲车停止行驶。然后甲车检测乙车是否完成超车,若完成任务继续行驶。

三、 电路与程序设计

3.1 主要单元电路设计

3.1.1信号产生及单片机系统设计

信号产生设计:单片机通过P3.4引脚经反相器来控制超声波的发送,然后单片机不停的检测INT1引脚,当INT1引脚的电平由高电平变为低电平时就认为超声波已经返回。计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离,单片机立即发出令绕过障碍物,实现超车。

单片机系统设计:单片机采用AT89S52。采用12MHz 高精度的晶振,以获得较稳定的时钟频率,减小测量误差。单片机用P3.4端口输出超声波并经74ALS04转化为所需的40KHz方波信号,利用外中断1 口检测超声波接受电路输出的返回信号。并由单片机指挥避障,实现超车。

单片机系统及电路图如下图所示:

3.1.2 各模块电路

超声波发射原理及电路图:超声波的发送是有单片机控制,单片机用P3.4端口输出40KHz超声波并经74ALS04转化为所需的方波信号发送出去。发射电路图如图6所示。

这是我参加2011年全国赛的设计论文

图6 超声波发射电路

超声波接收电路:采用AT89S52 来实现对CX20106A 红外接收芯片和TCT40-10 系列超声波转换模块的控制。使用CX20106A 集成电路对接收探头接收到的信号进行放大、滤波。其总放大增益80db。当CX20106A 红外接收芯片接收到发出后返回的信号时,就立即向外部中断1发出信号,提示以有一个信号返回,单片机内部马上进行计算此时所在距离,然后进行绕开障碍物,实现超车。接收电路如图7所示:

图7 超声波接收电路

红外线发射与接收电路:红外收发对管是一种利用红外线的开关管,接受管在接受和不接受红外线时电阻了发生明显变化,利用外围电路可以使输出产生明显的高低电平的变化,高低电平的变化输入单位片机就可使之识别,从而实现智能控制。电路图如下:

这是我参加2011年全国赛的设计论文

电源电路:根据题目要求,本系统使用电池供电,单片机必须与大电流器件分开供电,避免大电流器件对单片机造成干扰。采用两路供电,这样可以使用其中一路单独为单片机、指示灯供电,另外一路为L298等供电。下图为双5V电源电路:

3.2 系统软件设计

这是我参加2011年全国赛的设计论文

3.2.1系统软件的组成

系统软件主要由主程序、超声波发生接收程序。其中主程序包括边界线的检测和调整,转变标志线的判断与控制基转变,超声波发生子程序、接收中断程序用于实现小车的超车。

3.2.2主程序设计

主程序首先对系统环境初始化,设置定时器T1工作模式为16位的定时计数主程序流程图如下图,程序在附件1

这是我参加2011年全国赛的设计论文

3.2.3超声波发生子程序和超声波接收中断程序

超声波发生子程序的作用是通过P3.4端口发送2个左右的超声波信号频率,有外部中断1接收,约40KHz的方波,脉冲宽度为12us左右,同时把计数器T1打开进行计时。超声波测距器主程序利用外中断1检测返回超声波信号,一旦接收到返回超声波信号(INT1引脚出现低电平),立即进入中断程序。进入该中断后就立即关闭计时器T1停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T1溢出中断将外中断1关闭,并将测距成功标志字赋值2以表示此次测距不成功。程序流程图如下图,程序在附件2

四、 系统测试

4.1 测试使用的仪器:

包括秒表、直流稳压电源、信号发生器、示波器、数字万用表 测试方法

这是我参加2011年全国赛的设计论文

数字万用表主要用来测试分立元件的电阻、压降、截止/导通状态等参数; 信号发生器与示波器用于测试各光电传感器信号的接收与传输; 直流稳压电源在测试期间为各待测系统供电;

秒表用于产品测试,对制成的智能小车进行产品测试,进行计时。 4.2 测试结果及分析

经过实验,甲、乙两辆小车基本可以实现基本要求。由于时间有限,系统尚存在许多问题有待改进:

(1)抗干扰能力。小车因赛道上会遇到各种植情况,如交叉线、断续线,以及还有赛道上的干扰点,以及环境光线不均匀造成的干扰。

(2)考虑节能问题。由于要求小车的行驶时间要尽可能的短,采用功率相对比较大的电动机,但同时消耗电量也大。还有在调试的过程中,红外线对管经常损坏,耗材多。

五、 收获和总结

经过紧张的四天三夜的奋力拼搏,与小组其他成员通力协作,团结互助,终于完成了实验项目。首先,我代表我们小组全体成员感谢主持本次竞赛的主委会和全体评审老师以及我们的辅导老师,谢谢你们给了我们一个提高自己和展现自己的舞台,让我们在以后的人生中更加自信和坚定。在国庆节来临之际,我们全体成员祝所有评审老师和辅导教员节日快乐。回想这四天三夜,短暂而充实,就我个人而言,我在许多方面都有了明显进步和收获,无论是拼搏精神还是团队精神都是对我一生都是一笔丰富的财富。所以这次竞赛无论能否取得好名次,我都不会有遗憾,我会继续发扬这四天三夜的精神,在以后的日子里更加努力地提高自己、充实自己。

参考文献

[1]李建中编著. 单片机原理及应用[M]. 西安:西安电子科技大学出版社,2005. [2]李全利 主编. 单片机原理及应用技术(第2版)[M]高等教育出版社,2004. [5]郑国平 主编 模拟电子技术[M].北京: 清华大学出版社,2008

[4]周兴华 编著 手把手教你学单片机(第2版)[M].北京:北京航空航天大学出版社,2007.

[3]求是科技 编著 单片机典型模块设计实例导航(第2版)[M].北京:人民邮电出版社,2008. 附件1:

#include<reg52.h> #include<intrins.h>

#define uchar unsigned char #define uint unsigned int sbit di1=P0^0 ; sbit di2=P0^1 ; sbit di3=P0^2 ; sbit di4=P0^3 ; sbit zuo=P1^3 ;

这是我参加2011年全国赛的设计论文

sbit you=P1^2 ; sbit qian=P1^1 ;

sbit out=P3^4; //发射超声波端口 sbit in=P3^2; //接收超声波端口 sbit kong=P2^7;

volatile uint sec,count,time,on, t1=0; uchar flag;

void quit() {

di1=0; di2=0 ; di3=0; di4=0; }

void delayt(uint a) {

uint i,j ;

for(i=0;i<100;i++) for(j=0;j<a;j++); }

void zuozhuang() {

di1=1; di2=0 ; di3=1; di4=0; }

void youzhuang() {

di1=0; di2=1 ; di3=0; di4=1; }

void qianjin() {

di1=1; di2=0 ; di3=0 ; di4=1; }

void tui() {

这是我参加2011年全国赛的设计论文

di1=0; di2=1 ; di3=1 ; di4=0; }

void zu() {

uchar i,j=0;

for(i=0;i<10;i++) {

if(you&&!zuo)//左转 压右线 {

j=1;

di1=1; di2=0 ; di3=1; di4=0;

delayt(160); quit();

delayt(100); qianjin(); delayt(200); quit(); } } if(j==1) {

youzhuang(); delayt(100); j=0; } }

void yo() {

uchar i,j=0;

for(i=0;i<100;i++)

{ if(!you&&zuo)//右转 { j=1 ; di1=0; di2=1 ; di3=0; di4=1;

delayt(200); quit();

这是我参加2011年全国赛的设计论文

delayt(100); qianjin(); delayt(200); quit(); } } if(j==1)

{ zuozhuang(); j=0;

delayt(100); } }

void qia() {

if(!zuo&&!you&&!qian) //前进 {

di1=1; di2=0 ; di3=0 ; di4=1; } }

void jiao() {

qianjin(); delayt(400); zuozhuang(); delayt(350); qianjin(); delayt(1400); zuozhuang(); delayt(580); }

volatile uchar shu=0,aa=0,pan=0; void main() {

TMOD=1;

TH0=(65536-10000)/256; TL0=(65536-10000)/256;

EA=0; //总中断打开

ET0=1; //定时器中断打开 TR0=1; //定时器开关打开

这是我参加2011年全国赛的设计论文

while(1) {

if(pan==1) {

quit();

delayt(12000); pan=0; aa=1; }

zu(); yo(); qia(); if(qian) { shu++;

if(shu==1) {

qianjin(); delayt(300); }

if(shu<5&&shu>1) {

jiao();

if((shu==4)&&kong) {

zu(); yo();

qianjin(); delayt(1000); zu(); yo();

delayt(1000); zu(); yo();

delayt(300); pan=1; } }

if(shu>=5) {

qianjin(); delayt(1600); delayt(200); zuozhuang(); delayt(1000);

这是我参加2011年全国赛的设计论文

qianjin(); if(!aa) {

while(!qian); } else {

aa=0; tui();

delayt(50);} quit(); while(1); }

while(qian) ; }

} }

void tim() interrupt 1 {

zu();

TH0=(65536-10000)/256; TL0=(65536-10000)/256; }

附件2:#include<reg52.h>

#include<intrins.h> #define uint unsigned int #define uchar unsigned char

code uchar temp1[]=" 环形跑道 " ; code uchar temp2[]="距离前车 CM" ; code uchar temp3[]=" CM";

code uchar temp4[]="现在状态为: " ;//这是串口程序 /*****P1.0=A ;P1.1=B ;P1.2=A' ; P1.3=B'****/

这是我参加2011年全国赛的设计论文

code unsigned char GZZ[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //四相八拍工作方式(正转)(输出为高电平时工作)

code unsigned char GFZ[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //四相八拍工作方式(正转)(输出为高电平时工作) sbit out=P3^4; //发射超声波端口 sbit in=P3^2; //接收超声波端口

sbit PSB=P2^3; //sbit bell=P3^6;

sbit DJ_1=P3^6; // 电机1使能端 sbit DJ_2=P1^1; //电机2使能端 uint sec,count,time,on, t1=0; uchar flag; uchar T[3];

void write_bt(uchar star,uchar com); /********按键*****************/ sbit clk=P2^0;

//脉冲信号

sbit da=P2^1; //R/W读写选择端口 第五脚 sbit jian3=P2^2; sbit jian4=P2^3;

void SZ_JIAN(); //按键设置自加函数 void SZ_JIA(); //按键设置自减函数

/**************************延时**************************/ void delay1() //延时2个空指令 {

这是我参加2011年全国赛的设计论文

_nop_();

_nop_();

}

void delay40ms(void) {

uint i;

for(i=0;i<2000;i++); }

void delay1ms(void) //延时1MS {

uchar i;

for(i=0;i<255;i++); }

void delay(uint k) //延时Kms {

uint i,j; for(i=0;i<k;i++) for(j=0;j<121;j++);

}

void delayn(uchar i) {

while(!i); }

这是我参加2011年全国赛的设计论文

void delay_anjian(uint time) //按键延时函数

{ uint x,y;

for(x=time;x>0;x--) for(y=110;y>0;y--); }

void delay_dj(i)//电机延时函数 {

uint j,k; for(j=0;j<i;j++) for(k=0;k<250;k++); }

/******************按键函数*****************************/ /****************************************/

/******************* 电机函数***************************/ /*************中断发射频率******************/ void tim(void) interrupt 3 { uint i; ET1=0; TR0=0; TH0=0; TL0=0; TR0=1;

这是我参加2011年全国赛的设计论文

for(i

=0;i<4;i++) //超声波发射40KHZ

{

out=~out;

_nop_(); _nop_(); _nop_(); _nop_();

_nop_();

_nop_(); _nop_();

_nop_();

}

delayn(50);

IT0=1;//下降边延 ET1=1;

TH1=0Xb0;

TL1=0X3c; EX0=1;

}

/****************中断*接收**********************/ void r_int() interrupt 0//接收超声波 {

这是我参加2011年全国赛的设计论文

_nop_();

if(in==0) //判接收到 {

TR0=0;

EX0=0;

time=TH0*256+TL0; //数据转换

count=time*0.185; flag=1;

// bb=1; //置位标志位

while(!in);

//判是否已经完成转换

}

EX0=1; //接收完了就关闭中断接收 }

/*********总初始化********************************/ void start()

//初始化

{

ET1=1;

TR1=1; TMOD=0X11; //定时器工作方式

TH0=0; TL0=0;

TH1=0xb0; //50ms TL1=0x3c;

本文来源:https://www.bwwdw.com/article/dziq.html

Top