单片机实习报告_简易智能小车_第1页
单片机实习报告_简易智能小车_第2页
单片机实习报告_简易智能小车_第3页
单片机实习报告_简易智能小车_第4页
单片机实习报告_简易智能小车_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

指导老师:李勇波 日期:2011 年 7 月 班级:073092-15 | 姓名:赵英俊(20091002410) 中国地质大学 (武汉 ) 单片机实习报告 简易智能小车报告 摘要 本小车以 Atmel 公司生产的 AT89S52 为核心,完成寻迹、 避障、光源检测和车速测量等功能。在机械结构上,对普通的 小车进行了改造,即用一个万向轮来代替两个前轮,是小车的 转向更加灵敏。采用 PWM 驱动芯片控制电机,红外传感器检 测白线、障碍物以及用来测量速度,光敏器件检测光强。基于 可靠的硬件设计和稳定的软件算法,基本实现题目要求。 关键字:STC89C52 寻迹 光源检测 避障 测速测量 Abstract This design is controlled with the MCU (AT89S52) to complete the function of finding trace,avoiding barrier,tending to light and measure speed. In the mechanical structure, about the car, the reform which is a universal wheel instead of two front, the more sensitive to the car. Using PWM motor drive chip control, infrared sensor detection white line, obstacles and used to measure the speed, photodetector detection light intensity. Based on reliable hardware design and stable software algorithm, basically realize the topic request. Key words: STC89C52 trace avoiding barrier tending to light measure speed 1.系统设计 1.1 设计要求 1. 基本要求 (1)小车从起跑线出发(不得超过起跑线) ,沿引导线到 达 B 点 在 B 点有一障碍物需绕过障碍物到达 C 点 (2)小车到达 C 点沿一段直到到达 D 点后进入 “弯道区” (中间有一断点) ,此时有一光源照射,引导小车转弯并通过断 点继续进入大弯道区。 (3)小车在光源的引导下通过进入停车区并到达车库 (4)小车在最终在遇到停车标志后停车,并最终显示时间 和速度(实时速度 )。 1.2 方案论证 1. 电机驱动方案的选择与论证 由于普通直流电机更易于购买,小车对于精度要求不是特 别高,同时电路和控制相对简单,所以本设计采用直流电机作 为驱动单元。 方案一:使用继电器对电机进行开关控制和调制。但缺点 很明显,继电器响应慢而且机械结构容易坏。 方案二:使用三极管或达林顿管,结合单片机输出 PWM 信号实现调速的目的,此方案易于实施,但若控制电机转动方 向较为困难。 方案三:使用 PWM 控制芯片来实现对电机的控制。 方案选择:采用方案三。该方案电路简单,性能稳定,可 以轻松实现对电机方向的控制。 2. 路面寻迹模块 方案一:采用光敏传感器,根据白色背景和黑色反光程度 的不同来判断是否位于黑线上。 方案二:采用采用反射式红外传感器来进行探测。只要选 择数量和合适的红外传感器,可以准确的判断出黑线的位置。 方案选择:采用方案二。方案一受环境光的影响太大,效 果不佳而红外光不易受到环境光的干扰。 3. 趋光模块 方案一:采用单一的光敏电阻,利用其在不同的光强下阻 值不同,确定小车的转向,保证其朝着光源最强的角度前进。 方案二:采用多个光敏电阻,在小车车头摆成半圆状结构。 方案选择:方案二精度较高,实现较为复杂,这里采用方 案一,实现效果足以。 4. 避障模块 方案一:采用光电式传感器,根据白色背景和黑色反光程 度的不同来判断障碍物。 方案二:采用超声波测距的方法,利用超声波传感器,监 视测量发射脉冲和接受脉冲的时间差,计算超声波和物体之间 的距离。可以将避障和寻光模块一起排列为环状结构。 方案选择:虽然超声波测距有其性能上的优势,但价格过 高,且通过算法上的优化光电式传感器测距完全可以满足设计 要求,故采用方案一。 5. 测距模块 方案一:采用断电式光电开关测距。 方案二:采用光电传感器,结合轮子外围自身所带白条, 通过光电传感器红外检测单位时间内扫描到白条的个数。 方案选择:考虑到小车的实际机械结构,如果采用方案一 必然会对小车的结构有较大的改变。方案二结构简单易于在小 车上很好的固定安装,而且在软件上也易于实现。 2.硬件电路设计 智能小车总体构成: 趋光 单片机最小系统 避 障 电 机 控 制 器 测速 寻 迹 本系统以 STC89C52 为控制核心,最小系统如下: 2.1 主控制模块 STC89C52 是一种带 8K 字节闪烁可编程擦出只读存储器的 低电压,高性能 COMMOS8 的微处理器。该器件采用 ATMEL 高 密度非易失真存储器制造技术制造,与工业标准的 MCS-51 指令 集和输出管脚相兼容。 STC89C52 主要完成液晶显示、寻迹、避障、光源检测和车 速测量等功能。 2.2 电机驱动模块 电机的驱动芯片选用 L298N 作为驱动芯片。工作稳定电机 驱动信号由单片机提供,信号经过光耦隔离后传至 PWM 控制 芯片 L298N,通过 L298N 的输出引脚与两个电机相连。 L198N 的连接方法如下图所示 本设计中采用脉宽调制技术(PWM)控制使能端(En) ,然 后改变 IN1 和 IN2 的状态实现电机的正转和反转。同时可改变 脉宽的占空比来调节电机的转速。PWM 波形为周期不变的周期 性高低电平信号,占空比为高电平时间除以周期,改变占空比 实质上是改变了电动机的驱动电压。下图为 10%和 50%占空比的 PWM 信号。 2.2 寻迹模块 当小车在白色地面行驶时,装在小车下的红外发射管发射 红外线信号,经白色反射后,被接收管接受,一旦接收管接收 到信号,输输出端将输出低电平,从而实现了通过红外线检测 信号的功能。将检测到的信号传到单片机的 I/O 口,当 I/O 口检 测到的信号为高电平时,表明红外光被地上的黑线吸收了,表 明小车正处在黑色的引线上;同理,当 I/O 口检测到的信号为 低电平时,表明小车行驶在白色地面线上。 反射式红外传感器 ST188 采用高发射功率红外广电二极管 和高灵敏度光电晶体管组成。检测距离可调整范围为 415mm; 采用非接触式检测方式。 当 ST188 前方为白色时,ST188 接收管导通,电阻值减少, 输出电压降低,此时比较器同相输入端(3 脚)输入电压小, 比较器输出为低电平,发光二极管点亮。如下图所示 En A IN1 IN2 运转状 态 0 X X 停止 1 1 0 正转 1 0 1 反转 1 1 1 刹停 1 0 0 停止 2.3 趋光避障模块 本设计采用光敏电阻检测光源从而达到趋光效果,光敏电 阻阻值随光照强度增大而减小,首先在自然光条件下调节 R18 改变基准电压,使发光二极管点亮。当光照强度增大,光敏电 阻阻值减少,输出电压增加,此时比较器同相输入端(3 脚) 输入电压大,比较器输出为高电平,发光二极管熄灭,如下图 所示 在进行避障时采用了反射式红外传感器 ST188,放于小车 前部,三个 ST188,左右中间各一个,且左右两个各向各自的 两边倾斜 45 度角。具体算法如下: 否 遇 到 障 碍 物 单片 机检 测到 信号 小车 右拐 继续 前进 小车 左拐 90 度 并前 进 1s 小车 倒退 1s 是否再 次遇到 障碍物? 继续执行,当再次遇到障碍物时再次执行上程序,直到绕出障 碍物为止。 2.4 测距和显示模块 测距采用反射式红外传感器 ST188 结合小车轮子外围白条, 进行扫描,由单片机计算其一秒钟所扫描白条的个数乘以两白 条间的距离即可。 显示部分: 控制端口如下: RS RW E D0D7 读状态 L H H 状态字 写状态 L L 高脉冲 指令码 读数据 H H H 数据 写数据 H L 高脉冲 数据 2.5 电源模块 小车采用单电源供电,12VDC 给电机驱动芯片 L298N 供电, 并经一降压模块输出 5V 给主控制芯片以及其他芯片供电,电路 如图所示: 3.结论 按照要求,小车已经较好的完成了题目要求的任务。涉及 包括机械结构,硬件,软件。其中机械结构是小车能否稳定运 行的基础,硬件电路决定了小车实现的功能,而软件部分则是 控制的灵魂,算法的好坏直接决定了完成任务的质量。 整个设计无疑是一个充满辛苦的过程,期间也遇到了很多 的困难,不过在全组组员的共同努力下,在整个实验室同仁的 无私帮助下,以及老师的指导下,最终完成任务,在此对指导 老师以及各位同学一并表示感谢! 程序源代码: /* 后来修改部分:趋光由 P1.6 改为 P3.0 四传感器 将传感器 INT 去掉,接上 P0.3 /*/ #include #include #define uint unsigned int #define uchar unsigned char #include “motor.h“ #include “1602.h“ #include “xunji.h“ #define WHITE 0 #define BLACK 1 sbit BUZZER = P17; sbit OPT = P30; sbit zhang_left =P33; sbit zhang_middle =P34; sbit zhang_right =P35; sbit cesu =P04; uchar flag = 0; /全白标志位 char road_status=0; /*蜂鸣器发声 xMs,低电平发声*/ void Buzzer(uchar x) BUZZER = 0; DelayMs(x); BUZZER = 1; /*趋光* 函数名称: Park 函数输入: 函数输出: 函数功能: */ void Park(void) /灯亮( OPT1 导通 OPT=0 ,左拐) Stop(100,100); GoHead(0,0); DelayMs(100); / if(OPT = 1) / 这种情况下只能用 do.while 光照一下即可 / do / / GoHead(52,5);DelayMs(5);/右转 / while(RIGHT_ST188 /任何一个检测到白线停止 do TurnLeft(20,20);DelayMs(1000); GoHead(20,15); while(OPT); /*蔽障* 函数名称: Bizhang 函数输入: 函数输出: 函数功能: */ void BiZhang(void) / 倒退 右转 90 度 前进_ 左转 90 度 GoBack(20,20); DelayMs(200); TurnRight(25,25); /右转 90 度 DelayMs(1000); GoHead(21,21); DelayMs(1000); TurnLeft(25,25); /左转 90 度 road_status = (P0 while(!zhang_left | !zhang_middle | !zhang_right ); road_status = (P0 /*主函数*/ void main() Init(); /内部资源初始化 LcdReset(); /液晶初始化 DisplayListChar(0,0,“Time“,4); DispOneChar(7,0,:); DisplayListChar(0,1,“Speed“,5); DisplayListChar(8,1,“cm/s“,4); / DisplayListChar(8,0,“Time“,4); road_status = (P0 /取低四位 0000 1111 while(1) road_status = (P0 if( (road_status=0) /一次全白 Buzzer(1000); / 1000ms flag+; if(flag = 1) /第一次全白,开始趋光 Park();/趋光 else if(!zhang_left | !zhang_middle | !zhang_right) BiZhang(); else if(flag = 2) /第二次全白,终点停车 Stop(0,0); EA = 0; /关总中断 while(1) DispOneChar(5,0,MinuteH+0x30); /显示时间 0011 0000 x , y , *DLata , L DispOneChar(6,0,MinuteL+0x30); / + 48 DispOneChar(8,0,SecondH+0x30); DispOneChar(9,0,SecondL+0x30); DispOneChar(5,0,MinuteH+0x30); /显示时间 0011 0000 x , y , *DLata , L DispOneChar(6,0,MinuteL+0x30); / + 48 DispOneChar(8,0,SecondH+0x30); DispOneChar(9,0,SecondL+0x30); RoadTrack(road_status); /循迹 DispOneChar(6,1,(b/10)+0x30); /显示速度 DispOneChar(7,1,(b%10)+0x30); Delay_10Us(5); #define dataport P2 /8 位数据口 #define dataport P0 #define busy 0x80 /忙检测 DB7 DB7=1 忙,DB7=0 允许读写 sbit rs=P07; /寄存器选择输入端(硬件) sbit rw=P06; /读写控制输入端(硬件) sbit e =P05; /使能信号输入端(硬件) /*液晶显示头文件 */ /*- 简易延时函数 -*/ void delay(unsigned int i) for(i;i0;i-); void Delay5Ms(void) uint Temp = 4552; while(Temp-); /*-延时-*/ void Lcddelay(unsigned char MS) unsigned char i,j; while(MS!=0) j = 4; while(j!=0) i=0xf0; while(i!=0) i-; j-; MS-; /*- 检测 lcd 状态 -*/ void WaitForEnable(void) / 等待使能 dataport=0xff; / dataport =P2; P2=0xff; rs=0; rw=1; Lcddelay(5); _nop_(); e=1; _nop_(); _nop_(); / DB7=1 忙,DB7=0 允许读写 while(dataport / busy =0x80 1000 0000 e=0; /*- 写命令 -*/ void LcdWriteCommand(unsigned char CMD,unsigned char AttribC) if(AttribC) / en 需要一个高脉冲 读出/写入 WaitForEnable(); rs=0; rw=0; _nop_(); dataport=CMD; Lcddelay(5); _nop_(); e=1; _nop_(); _nop_(); e=0; /*- 显示光标定位 -*/ void LocateXY(char polx,char poly) unsigned char temp; temp=polx / 0xf =0x0f poly if(poly) temp |= 0x40; temp |= 0x80; LcdWriteCommand(temp,0); /*- 写字符 -*/ void LcdWriteLata(char lataW) WaitForEnable(); /检测忙否 且 en 需要一个高脉冲 读出/写入 rs=1; rw=0; _nop_(); dataport=lataW; Lcddelay(5); _nop_(); e=1; _nop_(); _nop_(); e=0; /*- 在指定位置显示单个字符 -*/ void DispOneChar(unsigned char x,unsigned char y,unsigned char Wlata) LocateXY(x,y); LcdWriteLata(Wlata); /*- 初始化 -*/ void LcdReset(void) LcdWriteCommand(0x38,0); / 显示模块设置 0011 1000; Lcddelay(5); LcdWriteCommand(0x38,0); Lcddelay(5); LcdWriteCommand(0x38,0); Lcddelay(5); LcdWriteCommand(0x38,1); / 清屏 LcdWriteCommand(0x08,1); / 0000 1000 关显示,不显示光标,光标 不闪烁; LcdWriteCommand(0x01,1); LcdWriteCommand(0x06,1); LcdWriteCommand(0x0c,1); /*- 在指定位置显示字符串 -*/ / void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DLata,unsigned char L) unsigned char i; for(i=0;iL;i+) DispOneChar(X+,Y,DLatai); / 扫到白线输出为低 /*道路检测循迹* 函数名称: RoadTrack 函数输入: 函数输出: 函数功能: */ void RoadTrack(road_status) switch (road_status) case 1: GoHead(64,30); break; /小小右转 0001 0x01 case 3: GoHead(65,13); break; /小右转 0011 0x03 / case 7: GoHead(65,6); break; /大右转 0111 0x07 / case 11: GoHead(80,81); break; /直线前进 1011 0x0b / case 13: GoHead(80,81); break; /直线前进 1101 0x0d / case 9: GoHead(80,81); break; /直线前进 1001 0x09 / case 8: GoHead(30,64); break; /小小左转 1000 0x08 case 12: GoHead(13,65); break; /小左转 1100 0x0c / case 14: GoHead(6,64); break; /大左转 1110 0x0e / case 15: GoBack(20,21); DelayMs(2); break; /倒退 1111 / 0x0f /case 0x00: GoBack(50,50); break; /直线后退 default:break; /* /*直道循迹* void RoadTrackZ() road_status = P0 switch (road_status) case 0x09: GoHead(50,50);DelayMs(2);break;/ 1001 前进 /一下: P0.0-P0.3 case 0x0d: GoHead(40,55); break; / 1011 一级左转 case 0x0c: GoHead(40,55); break; / 0011 二级左转 case 0x0e: GoHead(20,55); break; / 0111 三级左转 case 0x0b: GoHead(55,45); break; / 1101 一级右转 case 0x03: GoHead(55,40); break; / 1100 二级右转 case 0x07: GoHead(50,20); break; / 1110 三级右转 case 0x00: Stop(98,98); break; / 0000 全白停车 case 0x0f: break; / 1111 全黑保持 default: break; /*弯道寻迹* void RoadTrackW() road_status = P0 switch (road_status) case 0x09: GoHead(40,40);DelayMs(2);break;/ 1001 前进 case 0x0d: GoHead(30,55); break; / 1011 一级左转 case 0x0c: GoHead(20,55); break; / 0011 二级左转 case 0x0e: GoHead(10,70); break; / 0111 三级左转 case 0x0b: GoHead(55,30); break; / 1101 一级右转 case 0x03: GoHead(55,20); break; / 1100 二级右转 case 0x07: GoHead(75,10); break; / 1110 三级右转 case 0x00: Stop(98,98); break; / 0000 全白停车 case 0x0f: break; / 1111 全黑保持 default: break; /*对齐白线* void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论