版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、自动往返电动小汽车论文学校: 华侨大学学院: 信息科学与工程学院 组别: 自控06组组员: * * *目 录摘要.3第一章 总体设计方案.41.1系统方案选择.41. 车体的选择.42.方向控制的选择.43.路程测量方案的选择.51.2、总体方案框图.5第二章 硬件设计.52.1 黑线识别探测器.52.2、直流电机驱动电路.62.3测速模块6第三章 软件设计.73.1小车车体调整的程序设计73.2寻黑线的程序设计.73.3 系统整体流程图.8第四章 系统测试.94.1.测试方法:9第五章 总结与体会.9 摘要 单片机技术已经十分普及,在实时检测和自动控制的单片机应用系统中,单片机往往是作为核心
2、部件来使用。我们本次设计的自动往返电动小汽车,是以STC89C52单片机为控制核心,辅以传感器、控制电路、显示电路等外围器件,构成了一个车载控制系统。电动小汽车能够根据题目要求在规定的轨道上完成调速、停车、调头返回等运动形式;这辆小车还可以自动记录、显示一次往返时间、行驶距离及检测到的黑线条数,当检测到黑线时蜂鸣器发出报警,并用PWM脉宽调制技术实现降速的功能。关键字:自动往返 STC89C52单片机 PWM脉宽调制AbstractSCM technology has become very popular, in real-time detection and automatic contr
3、ol of the SCM application system, the microcontroller is often as a core component to use.We present the design of the automatic motor-driven car, is STC89C52 SCM as the control core, supplemented by the sensor, the control circuit, display circuit and other peripheral devices, consisting of a vehic
4、le control system. Electric cars will according to the requirement of the question in terms of the orbit speed, stop, turn round and go back to complete the form of motion; the car can automatically record, display a round trip time, distance and the detected line number, when the detected line buzz
5、er alarm, and use PWM technology to realize speed reduction function.第一章 总体设计方案1.1系统方案选择:1. 车体的选择方案一:用玩具车改造。成本较低,且省去很多制作上的麻烦,但是由于其是已经设计好的产品,扩展性差,许多方面很难达到我们需要的要求。方案二:自己做车体。这样可以制作出完全符合我们要求的小车车体,各部分可以进行专门的设计,但是制作方面费时费力,在整个题目中将占据较多的时间和精力,成本较高。综上考虑,采用方案二,由于这只是练习,我们有多余的时间来自己设计一个比较有个性的车板,同时能根据自己的需要来不断的进行改造
6、。2.方向控制的选择: 为设计要求小车要在特定的跑道内做往返运动,并且根据不同的黑线条数来进行不同前进速度,但同时跑道两侧也是黑线,这就要求小车能够“识别”出是跑道边沿线还是中间的黑线。方案一:在小车两侧加上红外避障模块,让小车卡在特定的跑道前进,但由于黑线是在地上,红外传感必须固定在车上,这使得不仅不好固定红外传感模块,同时也不能良好测到跑道边沿线。方案二:在小车车头装四个黑线识别小模块,位置如下图。小车前进时,如果是正对中间黑线,即2、3探测器先碰见黑线,随即便关闭1、4探测器,让小车通过黑线后在开启,在这之中还可以判断2、3探测器是否同时通过黑线,并做出调整。当小车是倾斜时,便是1、4探
7、测器先碰见黑线,随即控制小车转向,使小车不跑出跑道。但当小车倾斜到垂直跑道时,小车就会跑出跑道。考虑到小车跑道宽只有0.5m,因此垂直于跑道的情况会很小,所以我们选择了第二种方案。3.路程测量方案的选择 方案一:采用U型光电开关。当光电开关导通时产生高电平,反之则产生低电平,通过对脉冲的计数获得速度信息,实现对速度的检测。U型光电开关的最大优点是测量精度高,简单方便,而且成本也很低。 方案二:采用红外探测模块,固定在直流电机上,并在车轮上装上黑白色的码盘,通过对脉冲的计数来计算路程。 1.2、总体方案框图: 单片机STC89C52 稳压 电路路面检测电路 测路 程电路 驱动 电路 报警 电路
8、显示 电路第二章 硬件设计:2.1 黑线识别探测器黑白线检测模块采用了ST188红外反射型对管作为传感器,发射接收集成在一起,使用方便。由于采用红外光,因此受可见光影响较小,在其输出端接比较器,能得到更稳定的波形。应用电路图如下 2.2、直流电机驱动电路 直接选用L298N驱动直流电机,由单片机给它PWM波控制其驱动电机。原理图如下: 2.3测速模块测速模块采用的原理图和黑线检测的原理图一样,本次设计采用的码盘如下图。车轮每转一转产生4个脉冲,记为n,车轮每转一周的周长为35cm。那么S=35n/4 cm。第三章 软件设计3.1小车车体调整的程序设计头安装的4个黑线识别传感器传来的数据来进行小
9、车的转向控制,以保证小车能过顺利跑完全程且不超出跑道.(0表示没检测到黑线,1表示检测到黑线)1234行为0000前进0001左转1000右转0110前进0100左转(调整方向),前进0010右转(调整方向),前进1100左转0011右转xxxx后退3.2寻黑线的程序设计 采用的是扫描I/O口的方法来寻找黑线,当黑线检测模块在没检测到黑线时输出的高电平,检测到黑线时会产生一个低电平,形成一个下降沿,同时设定中断的触发方式为下降沿触发。3.3 系统整体流程图开始 延时0.5s 初始化检测中间黑线检测左右黑线否是否 再启动 减速 有黑线?是是 黑线数量加1避障处理 前进 停止减速转动180度黑线数
10、=3?是 停车10s否黑线数=4?是否是否黑线数=6?黑线数=9?否是黑线数=10?否否黑线数=12?是 停车并显示时间路程第四章 系统测试4.1.测试方法: 时间的测量直接用秒表测量,距离固定值,用米尺来测量,与单片机测量出的距离进行比较,小车的中心与起点线和终点线的偏差。测量次数系统时间(s)实际时间(s)系统距离(m)实际距离 (m)时间差(s)距离差(cm)与终点偏差(cm)与起点偏差(cm)133338.007.208010236367.957.217521332327.57.213031432327.77.205011第五章 总结与体会通过参与这次电子设计大赛,我们遇到了很多实际问
11、题,这加深了对课堂知识的印象,也体会到了实际工作中的很多困难,从中领会了科学研究中所需的严谨求实态度,增强了与队友间的团结协作精神,并学会了一些基本的实践技能,使我们获益非浅。#include#include #include#define uint unsigned int#define uchar unsigned char/停车#define stop(); IN31=0; IN32=0; IN33=0; IN34=0;/后退#define back(); IN31=0; IN32=1; IN33=0; IN34=1;/前进#define go(); IN31=1; IN32=0; IN
12、33=1; IN34=0;/前进时左转#define left_g(); IN31=0; IN32=0; IN33=1; IN34=0;/前进时右转#define right_g(); IN31=1; IN32=0; IN33=0; IN34=0;/后退时左转#define left_b(); IN31=0; IN32=1; IN33=0; IN34=0;/后退时右转#define right_b(); IN31=0; IN32=0; IN33=0; IN34=1;/原地打转180#define turn_round(); IN31=1; IN32=0; IN33=0; IN34=1;sfr
13、T2MOD=0xc9;/使用定时器2时必须sbit IN31= P20;/直流电机输入端IN1sbit IN32= P21;/直流电机输入端IN2sbit IN33= P22;/直流电机输入端IN3sbit IN34= P23;/直流电机输入端IN4sbit EN12= P24;/直流电机输入端IN3sbit EN34= P25;/直流电机输入端IN4sbit rw=P31; /1602端口定义sbit en=P30; /1602端口定义sbit rs=P37; /1602端口定义sbit Test_Black_tape=P33;/小车车轮检测黑带条纹数sbit bing=P36; /蜂鸣器s
14、bit Test_left=P00; /黑线左检测端口定义sbit Test_Middle_left=P01; /黑线中检测端口定义sbit Test_Middle_right=P02; /黑线右检测端口定义sbit Test_right=P03; /黑线右检测端口定义uchar PWM12=47,PWM34=49;/PWM12控制EN12,PWM34控制EN34uchar PWM_i=0;/调速脉冲进行计时uchar Test_flag =0;/低四位表黑线情况,第四,三,二,一位表示左,左中,右中,右侧探测结果,1表示在黑线上uchar detector=8; /4-左侧探测器,2-中间探
15、测器,1-右侧探测器uchar left_flag=0; /首先检测到黑线时被标记为1;uchar right_flag=0; /首先检测到黑线时被标记为1;uchar count=0; / 对黑条进行计数uchar correction_flag=0;/方位矫正函数标志位,为1时可执行矫正函数uchar Control_rotation_angle=0; /控制矫正函数转角大小uchar Control_bing=0;/控制蜂鸣器位,为1时蜂鸣器按一定频率响uchar bing_i=0;/控制蜂鸣器频率uchar flag=1;/控制两边边ST188开关,flag为1时开uint Timin
16、g=0;/控制两边边ST188开关,Timing(定时器中)等于300时(600ms),flag置为1uint mstcnt=0;/定时器重时间计数,每1ms加1uint time=0;/全程时间uint Time_delay=0;/延时时间(2ms)uchar Time_delay_flag=0;/启动延时计时的标志位,1时启动uint Time_interval=0;/中间两个传感器检测的黑线相差的时间(ms)uchar Time_interval_flag=0;/启动中间两个传感器检测的黑线相差的时间(ms)的标志位,1时启动uchar Control_count=1; /为1时允许fl
17、ag开始计时uchar turn_round_flag=1; /转弯标志位uint distance=0,Subsection_distance=0;/全程,每一段时间所行使的路程uint cycle_number=0;/ 记录小车车轮的圈数uchar open_interrupt0=0;/当Close_interrupt=1时,外部中断1s后打开uint interrupt0_i=0;/1s打开中断进行计时uchar stop_flag=0; /终点起点停车标志位uchar disbuf4=0; /存放路程uchar seconde3=0; /存放时间uchar number2=0; /存放
18、黑条数目uchar code table1=S: 0.0 m t: 0s;uchar code table2= count:00 ;/*延时子函数1us*/ void delay1us(uint us) while(us-) ; /*延时子函数1ms*/void delay1ms(uint ms) uchar j; while(ms-) for(j=0;j120;j+); void write_com(uchar com)/1602写指令 rs=0; P1=com; delay1us(4); en=1; en=0; void write_data(uchar data0)/1602写数据 rs
19、=1; P1=data0; delay1us(4); en=1; en=0; void display1( ) /显示时间路程程序 disbuf0 = (distance/1000)%10)+0x30; /路程(cm)千位 disbuf1 = (distance/100)%10)+0x30;/路程(cm)百位 disbuf2 = (distance/10)%10)+0x30; /路程(cm)十位 disbuf3 = (distance%10)+0x30;/路程(cm)个位 seconde0 = (time/100)+0x30;/时间百位 seconde1 = (time%100)/10)+0x
20、30; /时间十位 seconde2 = (time%10)+0x30;/时间个位 if(disbuf0=0x30) disbuf0=0x20;/如果百位为0,不显示(显示空格) if(seconde0=0x30) seconde0=0x20;/如果百位为0,不显示(显示空格) if(seconde1=0x30) seconde1=0x20;/如果百位为0,十位为0也不显示(显示空格) write_com(0x80+2); /显示路程十位delay1us(2);write_data(disbuf0); delay1us(2); write_com(0x80+3); /显示路程个位delay1u
21、s(2);write_data(disbuf1);delay1us(2);write_com(0x80+5); /显示路程十分位位delay1us(2);write_data(disbuf2);delay1us(2);write_com(0x80+6); /显示路程百分位delay1us(2);write_data(disbuf3);delay1us(2);write_com(0x80+12); /显示时间百位delay1us(2);write_data(seconde0); delay1us(2); write_com(0x80+13); /显示时间十位delay1us(2);write_d
22、ata(seconde1);delay1us(2);write_com(0x80+14); /显示时间个位delay1us(2);write_data(seconde2);delay1us(2);void display2( ) /显示黑带函数 number0 = (count/10)+0x30; /黑带数目十位 number1 = (count%10)+0x30;/黑带数目个位 if(number0=0x30) number0=0x20;/如果十位为0,不显示(显示空格) write_com(0x80+0x40+10); /显示黑条数目十位write_data(number0);delay1
23、us(2);write_com(0x80+0x40+11); /显示黑条数目个位delay1us(2);write_data(number1);/*计算路程,并把结果放入lcd1602缓冲区*/void count_distance() Subsection_distance=cycle_number*5; distance=distance+Subsection_distance; cycle_number=0; /*小车前进转弯函数*/void search_back_small( ) /后退小步,缓冲作用 back(); Time_delay_flag=1; while(Time_del
24、ay130); /定时器2延时130x2=260ms Time_delay_flag=0; Time_delay=0; stop();void search_back( ) /后退 back(); Time_delay_flag=1; while(Time_delay200); /定时器2延时200x2=400ms Time_delay_flag=0; Time_delay=0; stop();void search_right_g_5( )/前进实现右转 right_g(); Time_delay_flag=1; while(Time_delay30); /定时器2延时30x2=60ms T
25、ime_delay_flag=0; Time_delay=0; stop();void search_right_g_10( )/前进实现右转 right_g(); Time_delay_flag=1; while(Time_delay70); /定时器2延时70x2=140ms Time_delay_flag=0; Time_delay=0; stop();void search_right_g_20( )/前进实现右转 right_g(); Time_delay_flag=1; while(Time_delay100); /定时器2延时100x2=200ms Time_delay_flag
26、=0; Time_delay=0; stop();void search_right_g_30( )/前进实现右转 right_g(); Time_delay_flag=1; while(Time_delay130); /定时器2延时130x2=260ms Time_delay_flag=0; Time_delay=0; stop();void search_right_g_40( )/前进实现右转 right_g(); Time_delay_flag=1; while(Time_delay170); /定时器2延时170x2=340ms Time_delay_flag=0; Time_del
27、ay=0; stop();void search_right_b( )/后退实现右转 right_b(); Time_delay_flag=1; while(Time_delay105); /定时器2延时105x2=210ms Time_delay_flag=0; Time_delay=0; stop();void search_left_g_5( )/前进实现左转 left_g(); Time_delay_flag=1; while(Time_delay25); /定时器2延时25x2=50ms Time_delay_flag=0; Time_delay=0; stop();void sea
28、rch_left_g_10( )/前进实现左转 left_g(); Time_delay_flag=1; while(Time_delay45); /定时器2延时45x2=90ms Time_delay_flag=0; Time_delay=0; stop();void search_left_g_20( )/前进实现左转 left_g(); Time_delay_flag=1; while(Time_delay70); /定时器2延时70x2=140ms Time_delay_flag=0; Time_delay=0; stop();void search_left_g_30( )/前进实现
29、左转 left_g(); Time_delay_flag=1; while(Time_delay90); /定时器2延时90x2=180ms Time_delay_flag=0; Time_delay=0; stop();void search_left_g_40( )/前进实现左转 left_g(); Time_delay_flag=1; while(Time_delay130); /定时器2延时130x2=260ms Time_delay_flag=0; Time_delay=0; stop();void search_left_b( ) /后退实现左转 left_b(); Time_de
30、lay_flag=1; while(Time_delay115); /定时器2延时115x2=230ms Time_delay_flag=0; Time_delay=0; stop();void turn_round_180( ) turn_round(); Time_delay_flag=1; while(Time_delay=0)&(Time_interval2)&(Time_interval10)&(Time_interval25)&(Time_interval40)&(Time_interval60)&(Time_interval90)&(Time_interval=1;/*根据检测到
31、的黑线情况选择前进方式*/void forward( ) switch(Test_flag) case 0x00: go(); break;case 0x01: search_back_small( ); /先后退小步 search_left_b( ); /后退实现左转 Control_bing=1; /蜂鸣器响一声 break;case 0x02: Control_bing=1; /蜂鸣器响一声 if(left_flag=0)&(right_flag=0) right_flag=1; Time_interval_flag=1; break;case 0x03: search_left_g_2
32、0( ); /后退实现左转 Control_bing=1; /蜂鸣器响一声 break;case 0x04: Control_bing=1; /蜂鸣器响一声 if(left_flag=0)&(right_flag=0) left_flag=1; Time_interval_flag=1; break;case 0x06: go(); break;case 0x08: search_back_small( ); /先后退小步 search_right_b( ); /后退实现右转 Control_bing=1; /蜂鸣器响一声 break;case 0x12: search_right_g_20(
33、 ); /后退实现右转 Control_bing=1; /蜂鸣器响一声 break; default: search_back( ); /异常处理,后退 Control_bing=1; /蜂鸣器响一声 break; /*终点,起点停车函数*/void start_end( ) uchar i=5; if(count=6) /到达终点停留10s后原地打转180返回 display2( ); /显示黑带数目 stop(); while(i-) bing=1; delay1ms(200); bing=0; delay1ms(300); delay1ms(6000); search_back( );
34、search_back( ); delay1ms(500); EX0=0; /关外部中断0 EX1=0; turn_round_flag=0; turn_round_180( ); EX0=1; /开外部中断0 EX1=1; turn_round_flag=1; delay1ms(200); display2( ); /显示黑带数目 if(count=12) /返回到起点,关闭总中断,响铃三声报警 EA=0; stop(); display2( ); /显示黑带数目 while(i-) bing=1; delay1ms(200); bing=0; delay1ms(300); while(1)
35、;/*外部中断0,计算中间黑条的数目*/void INT_0() interrupt 0 count+; EX0=0; if(count=6)|(count=12) /起点,终点处理 start_end( ); if(count=3)|(count=9)/减速行驶 PWM12=38; PWM34=40; else if(count=5)|(count=11) /在距离终点0.5米时低速行驶至终点 PWM12=29; PWM34=30; else/正常速度 PWM12=47; PWM34=49; if(count90) count=0; open_interrupt0=1; display2(
36、);/显示黑带数目/*外部中断1,计算车轮黑条数目*/void INT_1() interrupt 2 delay1us(500); if(Test_Black_tape=0) cycle_number+; IE1=0; /清除中断标志位 if(cycle_number=250) cycle_number=0;/*定时计数器中断2,用于电机PWM调速,计时*/void time_2() interrupt 5 TF2=0; /定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器不同 PWM_i+;mstcnt+; /用于计算时间,每隔10ms加1/*以下为实时计时程序*/ if(mstcnt=500)/对小车行驶的时间进行计时,mstcnt满20即为一秒 time+;/秒+1 mstcnt=0; /对计数单元的清零,重新开始计数 if(time=500) time=0; if(turn_round_flag=1) count_distance(); /计算路程 display1( );/显示时间路程程序 /*中间先过黑线时,两边黑线检测关闭400ms程序*/if(Control_count=1) Timing+;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外墙涂料转让合同范本
- 园林绿化合同补充协议
- 基地空调维修合同范本
- 园林石材铺装合同范本
- 培训机构教师合同范本
- 喷锚合同范本模板模板
- 土地置换房屋合同范本
- 外国阀门销售合同范本
- 商铺翻新保洁合同范本
- 场址的转让权合同协议
- 吉林市2024-2025学年度高三第一次模拟测试 (一模)英语试卷(含答案解析)
- 2024油气管道无人机巡检作业标准
- DL∕T 1084-2021 风力发电场噪声限值及测量方法
- DL∕T 516-2017 电力调度自动化运行管理规程
- 翻修厕所合同范本
- 试剂硫酸生产线建设项目可行性研究报告
- CJJ-181-2012(精华部分)城镇排水管道检测与评估技术规程
- LY/T 3353-2023湿地生态修复技术规程
- 学前儿童故事活动设计与指导
- (完整word版)中医病证诊断疗效标准
- 困难气道管理指南(2023年版)
评论
0/150
提交评论