ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:185.45KB ,
资源ID:5042895      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5042895.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(自动往返电动小汽车附源代码.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

自动往返电动小汽车附源代码.docx

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 autom

3、atic control 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

4、of a vehicle 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

5、 line buzzer alarm, and use PWM technology to realize speed reduction function.第一章 总体设计方案1.1系统方案选择:1. 车体的选择方案一:用玩具车改造。成本较低,且省去很多制作上的麻烦,但是由于其是已经设计好的产品,扩展性差,许多方面很难达到我们需要的要求。方案二:自己做车体。这样可以制作出完全符合我们要求的小车车体,各部分可以进行专门的设计,但是制作方面费时费力,在整个题目中将占据较多的时间和精力,成本较高。综上考虑,采用方案二,由于这只是练习,我们有多余的时间来自己设计一个比较有个性的车板,同时能根据自己的

6、需要来不断的进行改造。2.方向控制的选择: 为设计要求小车要在特定的跑道内做往返运动,并且根据不同的黑线条数来进行不同前进速度,但同时跑道两侧也是黑线,这就要求小车能够“识别”出是跑道边沿线还是中间的黑线。方案一:在小车两侧加上红外避障模块,让小车卡在特定的跑道前进,但由于黑线是在地上,红外传感必须固定在车上,这使得不仅不好固定红外传感模块,同时也不能良好测到跑道边沿线。方案二:在小车车头装四个黑线识别小模块,位置如下图。小车前进时,如果是正对中间黑线,即2、3探测器先碰见黑线,随即便关闭1、4探测器,让小车通过黑线后在开启,在这之中还可以判断2、3探测器是否同时通过黑线,并做出调整。当小车是

7、倾斜时,便是1、4探测器先碰见黑线,随即控制小车转向,使小车不跑出跑道。但当小车倾斜到垂直跑道时,小车就会跑出跑道。考虑到小车跑道宽只有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 避障处理 前进 停止

10、减速转动180度黑线数=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

12、; IN32=0; IN33=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;

13、 IN34=1;sfr 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 b

14、ing=P36; /蜂鸣器sbit 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;

15、/4-左侧探测器,2-中间探测器,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

16、为1时开uint Timing=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_cou

17、nt=1; /为1时允许flag开始计时 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

18、 number2=0; /存放黑条数目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 da

19、ta0)/1602写数据 rs=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 =

20、 (time%100)/10)+0x30; /时间十位 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(0x

21、80+3); /显示路程个位 delay1us(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(0

22、x80+13); /显示时间十位 delay1us(2); write_data(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+0x

23、40+10); /显示黑条数目十位 write_data(number0); delay1us(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( ) /后退小

24、步,缓冲作用 back(); Time_delay_flag=1; while(Time_delay130); /定时器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_dela

25、y_flag=1; while(Time_delay30); /定时器2延时30x2=60ms Time_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

26、(Time_delay100); /定时器2延时100x2=200ms Time_delay_flag=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_delay=0; stop();void search_right_b( ) /后退实现右转 right_b(); Time_delay_flag=1; while(Time_delay105); /定时器2延时105x2=210ms Time_delay

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1