单片机课程设计-智能小车.doc

上传人:爱问知识人 文档编号:5019282 上传时间:2020-01-29 格式:DOC 页数:33 大小:492.50KB
返回 下载 相关 举报
单片机课程设计-智能小车.doc_第1页
第1页 / 共33页
单片机课程设计-智能小车.doc_第2页
第2页 / 共33页
单片机课程设计-智能小车.doc_第3页
第3页 / 共33页
单片机课程设计-智能小车.doc_第4页
第4页 / 共33页
单片机课程设计-智能小车.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《单片机课程设计-智能小车.doc》由会员分享,可在线阅读,更多相关《单片机课程设计-智能小车.doc(33页珍藏版)》请在三一文库上搜索。

1、单片机课程设计智能小车学 院:电子工程学院 指导教师: 制 作 人: 制作时间:2010/7/13目录摘要:3一、设计任务概述31.1设计任务概述31.2基本任务3二、系统方案论证与选择42.1车体方案论证与选择62.2控制模块论证与选择62.3电源模块论证与选择62.4电机模块选择与论证72.5电机驱动模块选择与论证72.6避障模块的选择与论证72.7循迹模块选择与论证72.8智能小车最终方案8三、硬件系统的设计与功能实现83.1救援小车主线路板制作83.2微控制器电路的设计与原理93.3电源电路原理与设计103.4电机驱动电路的原理与设计10四、软件设计的实现与说明104.1主程序流程图1

2、04.2路面循迹子程序流程图11五、系统程序125.1驱动电机程序125.2红外接收程序175.3红外遥控程序215.4循迹小车测试程序255.5循迹小车 黑线 程序285.6避障程序30六、结论32七、结束语32八、参考文献:33摘要智能车辆是当今车辆工程领域研究的前沿,它体现了车辆工程、人工智能、自动控制、计算机等多个学科领域理论技术的交叉和综合,是未来汽车发展的趋势。本小组设计制作的一款智能小车,本文介绍一款红外线遥控小车,以STEC89C52单片机为核心控制器,用L283驱动直流电机工作,控制小车的运行。本款小车具有红外线遥控手动驾驶、自动驾驶、寻迹前进等功能。本系统采用模块化设计,软

3、件用C语言编写。 本作品以四个直流减速电机为驱动,通过各类传感器件来采集信息,送入主控单元STC 89C52单片机,处理数据后完成相应的操作,以实现相应的功能。直流减速电机采用电机专用驱动芯片L293进行驱动,其中采红外接收发送模,来实现避障、循迹; 关键词:小车底盘、无线遥控、STC89C52 、L293、HD74HCO4P一、设计任务和要求以STEC89C52单片机为核心,制作一款红外遥控小车,小车具有自动驾驶,手动驾驶和循迹前进等功能。自动驾驶时,前进过程中可以避障。手动驾驶时,遥控控制小车前进、后退、左转、右转等操作。寻迹前进时小车还可以按照预先设计好的轨迹前进。1.1设计任务概述设计

4、制作一个智能小车,该小车能按照要求自动前进、后退、左转、右转。能通过预设好的黑色路线自动循迹。1.2基本任务1、实现前进、后退、左转、右转.2、前进过程中遇到障碍物能自动停止,从而进行人为操作(图一)3、循迹电路是用以实现小车沿着场地的黑色弧形引导轨迹BC进行前进,并校正的,且小车不能偏离该轨迹。(图三)(图一)路径黑线的识别的准确程度决定智能车能否完成快速、稳定的寻线。识别装置由高发射功率红外光电二极管和高灵敏度光电晶体管组成,以非接触检测方式检测距离可调整达420 mm。为了精确测定智能车的相对位置,将3对ST178并排安放在车底盘下部的前端,其分布垂直于智能车行走的方向。当车行走时,保持

5、3个发光管发光,当某一个光电对管的下方为黑色轨迹时,相应的接收管输出为高电平,而下方为白色路面的接收管输出为低电平。再经数据处理后,控制系统就可以分析出当前车行走的位置,从而达到调整智能车运行状态的目的。例如,假设路面黑线的宽度为三组红外线对管的宽度,当黑线在车体中间时,7个输入引脚为28H(0011100);当车体左或右偏时,接收到的数据会改变,即“1”会相应的左移或右移,如0001110(右偏)、0111000(左偏),偏移幅度不同,“1”的移动位数便不同(图二)二、系统方案论证与选择根据题目中的设计要求,本系统主要由微控制器模块、电源模块、避障模块、循迹传感器模块、直流电机及其驱动模块等

6、构成。本系统的方框图如图1所示: 系统总框图为较好的实现各模块的功能,我们分别设计了几种方案并分别进行了论证。2.1车体方案论证与选择方案1:购买玩具电动车。购买的玩具电动车具有组装完整的车架车轮、电机及其驱动电路。玩具电动车的电机多为玩具直流电机,力矩小,空载转速快,负载性能差,不易调速。而且这种电动车一般都价格不菲。因此我们放弃了此方案。 方案2:自己制作电动车。经过反复考虑论证,我们制定了四两轮分别驱动,即四个轮分别用四个转速和力矩基本完全相同的直流电机进行驱动。这样,当两个直流电机转向相反同时转速相同时就可以实现电动车的原地旋转,由此可以轻松的实现小车坐标不变的90度和180度的转弯。

7、方案3:通过淘宝网上订购小车车体,因为实验室的材料限制,所以我们选择此方案小车实物2.2控制模块论证与选择方案一:采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力强、可靠性高、功耗低、结构简单、具有语音处理、运算速度快等优点,但考虑到我们小组对这个方案采用的微处理器并不熟悉,使用起来并不是很方便,这对于硬件电路的设计和软件编程增加了难度。我们决定不再使用此方案,考虑其他方案。方案二:采用STC 89C52单片机作为主控制器。STC 89C52是一个超低功耗,和标准51系列单片机相比较具有运算速度快,抗干扰能力强,支持ISP在线编程,片内含8k空间的可反复擦写1000次的Fla

8、sh只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个I/O口,2个16位可编程定时计数器。其指令系统和传统的8051系列单片机指令系统兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,在后来的实验中我们发现,STC 89C52精确度和运算速度也都完全符合我们系统的要求。综合以上方案我们选择比较普通的更为熟悉的方案二使用STC89C52单片机为我们整个系统的控制核心。2.3电源模块论证与选择由于本系统需要给救援小车系统供电,我们考虑如下几种方案:方案一:采用7.2V可充电动力电池组。动力电池组具有较强的电流驱动能力及稳定的电压输出性能,经测试在用此种供电方式下,单片

9、机和传感器工作稳定,直流电机工作良好,且电池体积较小、可以充电、能够重复利用等,能够满足系统的要求。方案二:采用1.5v多节电池为直流电机供电,将两个6V电压分别给单片机系统和其它芯片供电。由于小车耗电量大,故选择容易更换的电池组综上考虑,我们选择了方案二来完成智能小车系统供电的任务。2.4电机模块选择与论证 方案一:采用直流减速电机。直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便,小车电机内部装有减速齿轮组,所以并不需要考虑调速功能,很方便的就可以实现通过单片机对直流减速电机前进、后退、停止等操作,方案二:采用步进电机作为该系统的驱动电机,由于其转动的角度可以精确定位,可以实现小

10、车前进距离和位置的精确定位。虽然采用步进电机有诸多优点,但步进电机的输出力矩较低,随转速的升高而下降,且在较高的转速时会急剧下降,其转速较低时不适于小车等对速度有一定要求的系统。经综合比较分析我们决定放弃此方案。综合以上考虑我们选择方案一的直流减速电机作为整个救援小车的驱动电机。2.5电机驱动模块选择与论证方案一:采用分立组件组成的平衡式驱动电路,这种电路可以由单片机直接对其进行操作,但由于分立组件占用的空间比较大,还要配上两个继电器,考虑到小车的空间问题,此方案不够理想,我们决定放弃此方案。 方案二:因为小车电机内部装有减速齿轮组,考虑不需调速功能,采用市面易购的电机驱动芯片L293控制减速

11、电机,该芯片是利用TTL电平进行控制,通过改变芯片控制端的输入电平,即可以对电机进行正转、反转和停止操作,亦能满足直流减速电机的要求,用该芯片作为电机驱动具有的操作方便、稳定性好等优点。综合以上分析与论证我们选择方案二的驱动芯片L293D作为整个救援小车系统的电机驱动电路。2.6避障模块的选择与论证方案一:用超声波传感器进行避障。超声波传感器的原理是:超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,再被超声波传感器接收。超声波传感器在避障的设计中被广泛应用。但是超声波传感器需要40KHz的方波信号来工作,因为超声波传感器对工作频率要求较高,偏差在1内,所以用模拟电路来做方波发生器比较

12、难以实现。因此我们考虑其它的方案。方案二:用漫反射式光电开关进行避障。光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。考虑到本系统只需要检测障碍物,没有十分复杂的环境。为了使用方便,便于操作和调试,我们最终选择了方案二。光电开关的实物如下图:方案三:通过红外接收发送来实现,它测量距离近,但反应灵敏、准确。相比光电传感器而言,其体积较小,价格低,安装较容易. 2.7循迹模块选择与论证方案一:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线

13、的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白色轨迹上方和黑色轨迹上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。单片机据此来判断小车是否偏离轨道,并根据反馈来不同的电平信号,发出相应的控制操作命令来校验小车的位置。来完成小车的循迹任务。但是这种方案的缺点是受环境中光线的影响很大,不能够稳定的工作。因此我们考虑其它更加稳定的方案。 方案二:用HD74HCO4P红外接收发送模块来为系统循迹。HD74HCO4P芯片构成的是集成电路,因此具有体积小,结构集成紧凑,灵敏度高,容易调整。经测试方案二不论是在黑暗或者是强光

14、照射下,小车系统均可以很稳定的工作,对环境的适应能力较强。因此我们选择方案二。2.8智能救援小车最终方案经过反复的探讨和论证我们最终确定智能救援小车的如下最终方案:1.车体采用购买的整体车体2.采用STC89C52单片机作为整个电路的控制核心。3.使用八节电池为系统提供基准电源。4.采用直流减速电机作为小车系统的驱动电机。5.使用电机专用驱动芯片L293作为直流减速电机的驱动芯片。6.采用红外接收发送模块器组成小车的避障、循迹系统。三、硬件系统的设计与功能实现3.1小车主线路板制作3.2微控制器电路的设计与原理微控制器电路是整个智能救援小车系统的核心控制部分,它负责对各路传感信号的采集、处理、

15、分析及对各部分硬件电路进行调整。本设计制作的智能救援小车系统以STC89C52单片机最小系统电路为整个系统的控制电路,通过各种传感器电路,采集各种传感器信息,以发出各种控制信号命令,来完成相应的操作,单片机控制电路原理图如所示:单片机控制电路原理图3.3电源电路原理与设计3.4电机驱动电路的原理与设计本设计中采用的电机专用驱动芯片L293D。L293D是欧洲著名的SGS公司的产品,为单块集成电路、高电压、高电流、四通道驱动。设计用来接收DTL或者TTL逻辑电平,驱动感性负载(比如继电器,直流电机),和开关电源晶体管。内部包含4通道逻辑驱动电路。其额定工作电流为1A,最大可达1.5A,Vss电压

16、最小4.5V,最大可达36V。 输入引脚和输出引脚的逻辑关系 L293d可直接的对电机进行控制,无须隔离电路。通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作(表1是其使能端、输入引脚和输出引脚的逻辑关系。),操作非常方便,亦能满足直流减速电机的大电流要求。调试时在依照上表,用程序输入对应的码值,即可以实现对应的操作。其驱动电路原理图如下所示: 四、软件设计的实现与说明 4.1主程序流程图 我们所设计的软件的主程序流程图如下图所示: 4.2路面循迹子程序流程图 五、系统程序5.1驱动电机程序include#define sen_port P1#define LED

17、 P0sbit EN1=P22;sbit IN1=P23;sbit IN2=P24;sbit EN2=P25;sbit IN3=P26;sbit IN4=P27;sbit beed=P20;sbit start_botton=P16;/the second toucth bottonsbit stop_botton=P17;/the frist toucth bottonunsigned char pattern=0;void delay(unsigned long n) /延时子程序 unsigned int i,j,k; for(i=n;i0;i-) for(j=10;j0;j-) for

18、(k=50;k0;k-); unsigned char sensor_inp()unsigned char sensor;sensor = sen_port;sensor &= 0x07;/LED = sensor|0xf8;return sensor;/*motor control program*/void faward()IN1=1;IN2=0;IN3=1;IN4=0;EN1=1;EN2=1;void turn_left()IN1=1;IN2=0;IN3=0;IN4=0;EN1=1;EN2=1;void turn_right()IN1=0;IN2=0;IN3=1;IN4=0;EN1=1;

19、EN2=1;void stop()EN1=0;EN2=0;/*beed control program*/void beed_on()/beed is onbeed=0;void beed_off()/beed=1;/*start & stop */void turn_onoff()if( start_botton = 0 )pattern=1;if( stop_botton = 0 )pattern=0;/*check_line*/void check_line()if( sensor_inp() = 0x03 )LED=0xf0;pattern=21;if( sensor_inp() =

20、0x06 )LED=0x0f;pattern=31;/*main*/void main(void)LED=0x55;delay(150);LED=0xAA;delay(150);LED=0xff;while(1)turn_onoff();switch(pattern)case 0:/waiting for the start bottonstop();LED=0x1f;delay(30);LED=0xf8;delay(30);break;case 1:/the time to startstop();LED=0x7f;beed_on();delay(80);beed_off();delay(6

21、0);LED=0x0f;beed_on();delay(80);beed_off();delay(60);LED=0x00;beed_on();delay(120);beed_off();delay(40);pattern=11;break;case 11:/flowing the black linecheck_line();switch( sensor_inp() )case 0x02:faward(); break;case 0x04:turn_right(); break;case 0x01:turn_left(); break;default: break;break;case 21

22、:turn_left();beed_on();delay(20);beed_off();delay(80);pattern=22;break;case 22:/stop car in left cart switch( sensor_inp() )case 0x02:faward(); break;case 0x04:turn_right(); break;case 0x01:turn_left(); break;case 0x07: stop();pattern=0; break;default: break;break;case 31:turn_right();beed_on();dela

23、y(20);beed_off();delay(80);pattern=32;break;case 32:/stop car in right cart switch( sensor_inp() )case 0x02:faward(); break;case 0x04:turn_right(); break;case 0x01:turn_left(); break;case 0x07: stop();pattern=0; break;default: break;break;default:break;5.2红外接收程序#include#include#define uchar unsigned

24、 char#define uint unsigned int#define sen_port P1/传感器入口sbit EN1=P20;sbit IN1=P21;sbit IN2=P22;sbit EN2=P23;sbit IN3=P24;sbit IN4=P25;sbit bz=P14;void delay1(uint x)uint a,b;for(a=x;a0;a-)for(b=1000;b0;b-);void delay(unsigned long n) /延时子程序 unsigned int i,j,k; for(i=n;i0;i-) for(j=10;j0;j-) for(k=50;

25、k0;k-); unsigned char sensor_inp()unsigned char sensor;sensor = sen_port;sensor &= 0x07;P1 = sensor;return sensor;void faward()IN1=1;IN2=0;IN3=1;IN4=0;EN1=1;EN2=1;void backward()IN1=0;IN2=1;IN3=0;IN4=1;EN1=1;EN2=1;void turn_left()IN1=1;IN2=0;IN3=0;IN4=1;EN1=1;EN2=1;void turn_right()IN1=0;IN2=1;IN3=1

26、;IN4=0;EN1=1;EN2=1;void left()IN1=1;IN2=0;IN3=0;IN4=0;EN1=1;EN2=1;void right()IN1=0;IN2=0;IN3=1;IN4=0;EN1=1;EN2=1;void stop()EN1=0;EN2=0;void xunji()/delay(10);switch( sensor_inp() )case 0x02:faward(); break;case 0x01:right(); break;case 0x04:left(); break;default: break;void bizang() if(bz=0)backwa

27、rd();delay1(10);turn_left();delay1(8); elsefaward();void main(void)init_IR();while(1) switch( read_IR() )case 0x1c:bizang(); break;case 0x19:xunji(); break;case 0x14:turn_left();break;case 0x13:faward();break;case 0x10:turn_right(); break;case 0x17:backward();break;case 0x0e:stop();break;default: br

28、eak;5.3红外遥控程序 #include#includesbit beep=P20;sbit inf=P33;sbit led1=P21;sbit CLK=P10;sbit DAT=P11;uchar key_code=255;uint buf_key_code=0;uchar key_bit_count=0;uint count_T=0,buf_CT=0;uchar common_code_count=0;uchar inf_status=0;unsigned char w4;unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8

29、2,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/0-11,-,全灭 (共阳字段表)/*/void display(void)unsigned char i,j,num;unsigned long temp;temp=key_code;w3=temp&0x000f;temp=4;w2=temp&0x000f;temp=4;w1=temp&0x000f;temp=4;w0=temp&0x000f;for(i=0;i4;i+)num=tabwi;for(j=0;j8;j+)CLK=0;DAT=num&0x80; /(0x80即十进制的128, 二进制的

30、10000000 按位发送)CLK=1;num=1;/*/void Time0(void) interrupt 1count_T+;if(inf_status=0 & count_T160)EX1=0;else if(inf_status=1|inf_status=2)&count_T500)inf_status=0;count_T=600;/*/void int_1(void) interrupt 2beep=0;TR0=1;if(count_T15&count_T15&buf_CT210&buf_CT15&buf_CT32&buf_CT=26)inf_status=2;common_cod

31、e_count=0;key_bit_count=0;buf_key_code=0;else if(inf_status=2)if(buf_CT15&buf_CT=1;key_bit_count+;else if(buf_CT32&buf_CT=1;buf_key_code|=0x80;key_bit_count+;if(key_bit_count=8)led1=!led1;inf_status=0;key_bit_count=0;key_code=buf_key_code;buf_key_code=0;TR0=0;count_T=600;buf_CT=0;beep=1;EX1=1;void m

32、ain()ET0=1;TMOD=0x02;TH0=0xCA;TL0=0xCA;IT1=1;EX1=1;TR0=1;EA=1;while(1)P0=key_code;/display();delayms(50);5.4寻迹小车测试程序#include#define sen_port P1sbit SEN1=P10;sbit SEN2=P11;sbit EN1=P20;sbit IN1=P21;sbit IN2=P22;sbit EN2=P23;sbit IN3=P24;sbit IN4=P25;void delay(int n) /延时子程序 unsigned char i,j,k; for(i

33、=n;i0;i-) for(j=100;j0;j-) for(k=200;k0;k-); unsigned char sensor_inp()unsigned char sensor;sensor = sen_port;sensor &= 0x03;P0 = sensor;return sensor;void forward()/two motos are runing forwardIN1=1;IN2=0;IN3=1;IN4=0;EN1=1;EN2=1;void backward()/two motos are runing backwardIN1=0;IN2=1;IN3=0;IN4=1;E

34、N1=1;EN2=1;void turn_left()/left moto is runing, but right moto is brakeIN1=1;IN2=0;IN3=0;IN4=0;EN1=1;EN2=1;void rotate_left()/right moto is runing forward, and left moto is running backwardIN1=1;IN2=0;IN3=0;IN4=1;EN1=1;EN2=1;void turn_right()/right moto is runing, but left moto is brakeIN1=0;IN2=0;

35、IN3=1;IN4=0;EN1=1;EN2=1;void rotate_right()/left moto is running forward, and right moto is running backwardIN1=0;IN2=1;IN3=1;IN4=0;EN1=1;EN2=1;void free()/two motos is freeIN1=0;IN2=0;IN3=0;IN4=0;EN1=0;EN2=0;void stop()/two motos stopIN1=1;IN2=1;IN3=1;IN4=1;EN1=1;EN2=1;void main(void)/delay(10);/P0

36、=0x55;while(1)/P0=P1;/delay(100); forward();/delay(100); stop();/delay(100); backward();/delay(100); stop();/delay(100); turn_left();/delay(100); stop();/delay(100); turn_right();/delay(100); stop();delay(100); rotate_left();delay(100); stop();delay(100); rotate_right();delay(100); stop();/*delay(100); stop();*/delay(20);forward();/delay(20);backward();/delay(20);/*/5.5巡际小车 黑线 程序bz=P14 xun1=13 xun2=P12 xun3=P11 xun4=P10 xun5=空 *

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1