1、基于单片机的智能小车 第一部分 全书内容概括第一章 引言和介绍 C51单片机与应用与C语言程序设计,介绍如何应用AT89S52作为机器人的大脑制作一款机器人,并用C语言对AT89S52进行编程,使机器人实现下述4个基本任务。(1)安装传感器以探测周边环境;(2)基于传感器信息做出决定;(3)控制机器人运动(通过操作带动轮子旋转的电机);(4)与用户交换信息。第二章 单片机AT89S522.1 内容概述: AT89S52单片机是控制单元的核心。起着控制小车所有运行状态的作用。使用该芯片很容易实现对其他模块的控制。通过对单片机AT89S52写入程序,可以方便的用软件来控制整个过程. (1)AT89
2、S52单片机最小系统包括了一路复位开关,用于小车复位。 P1.0输出PWM信号, P1.1P1.5分别控制电机驱动。 其他P口用外接控制小车的各种控制开关, P0口外接10K的上拉电阻,可用于外接LCD1602。 (2)AT89S52 单片机介绍:AT89S52 是一种低功耗、高性能CMOS8位微控制器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护
3、方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。其引脚排列如下: AT89S52引脚排列图 2.2 主要性能 与MCS-51单片机产品兼容; 8K字节在系统可编程Flash存储器; 1000次擦写周期; 全静态操作:0Hz33Hz; 三级加密程序存储器; 32个可编程I/O口线; 三个16位定时器/计数器; 全双工UART串行通道; 低功耗空闲和掉电模式; 掉电后中断可唤醒; 看门狗定时器; 双数据指针; 掉电标识符。第三章 所用软件 (1) Keil uVision2 IDE集成开发环境 (2) stc-isp-v3.97软件下载工具 (3) 串口
4、调试工具第四章 智能机器人各部分功能实现4.1 伺服电机 4.1.1 运转速度 实现:高电平持续时间描述:1)通过让单片机的输入输出口来输出不同的脉冲序列来实现控制机器人伺服电机以不同速度运动,51系列单片机有4个8位的并行I/O口:P0、P1、P2和P3.这四个接口,既可以作为输入,也可以作为输出,这里主要用P1口来完成机器人伺服电机的控制。2)当高电平持续时间为1.3ms时,电机顺时针全速旋转,当高电平持续时间1.7ms时,电机逆时针全速旋转。3)P1_0引脚的控制输出用来控制右的伺服电机,而P1_1则用来控制左边的伺服电机。 原理图如下: 4.1.2 所用函数 (1)延时函数 要生成伺服
5、电机的控制信号,就需要用另一个延时函数delay_nus这个函数可以实现更小的延时,它的延时单位是微秒,即千分之一毫秒,参数n为延时微秒数。 (2)举例:程序片断 (目的: 让连接到P1_0脚的伺服电机轮子全速旋转) while(1) P1_0=1; /P1_0输出高电平 delay_nus(1700); /延时1.7ms P1_0=0; /P1_0输出低电平 delay_nus(20000); /延时20ms 4.2 控制运行时间或距离 4.2.1 描述:让微控制器不断发出控制指令,用到以while(1)开头的死循环(即永不结束的循环)。要求机器人运动一段给定的距离或者一段固定的时间。需要控
6、制代码执行的次数,用到for函数。4.2.2 实现函数 (1)for 函数 for(表达式1;表达式2;表达式3) 语句它的执行过程如下:1) 先求解表达式12) 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步3) 求解表达式34) 转回上面第2)步继续执行5) 循环结束,执行for语句下面的一个语句for语句最简单的应用形式也就是最易理解的形式如下:for(循环变量赋初值;循环条件;循环变量增/减值) 语句 (2)举例 (目的使电机运行几秒钟)for(Counter=1;Counter=100;i+)P1_
7、1=1;delay_nus(1700);P1_1=0;delay_nms(20);第五章 简单巡航控制5.1描述: 对单片机编程可以使机器人完成各种巡航动作,本章机器人在无感觉的情况 下巡航。5.2 基本巡航动作 (1)向前训航 发给单片机控制引脚的高电平持续时间决定了伺服电机旋转的速度和方向。for循环的参数控制了发送给电机的脉冲数量。由于每个脉冲的时间是相同的,因而for循环的参数也控制了伺服电机运行的时间(2)向后走,原地转弯和绕轴旋转将delay_nus函数的参数n以不同的值组合就可以使机器人以其它的方式运行5.3匀加速/减速运动 (1) for循环 示例 (匀加速运动程序片段):fo
8、r(pulseCount=10;pulseCount=200;pulseCount=pulseCount+1) P1_1=1; delay_nus(1500+pulseCount);P1_1=0;P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); (2)分析解释: 使机器人的速度由停止到全速。循环每重复执行一次,变量pulseCount就增加1:第一次循环时,变量pulseCount的值是10,此时发给P1_1、P1_0的脉冲的宽度分别为1.51ms、1.49ms;第二次循环时,变量pulseCount的值是11,此时发给P1_
9、1、P1_0的脉冲的宽度分别为1.511ms、1.489ms。随着变量pulseCount值的增加,电机的速度也在逐渐增加。到执行第190次循环时,变量pulseCount的值是200,此时发给P1_1、P1_0的脉冲的宽度分别为1.7ms、1.3ms,电机全速运转。5.4 函数分类(1)从函数定义的角度来看,函数有两种 标准函数,即库函数。 用户定义函数,以解决你的专门需要(2)从有无返回值角度来看,函数又分为以下两种:有返回值函数:函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值(3)从主调函数和
10、被调函数之间数据传送的角度看又可分为两种:无参函数:函数定义、说明及调用中均不带参数。 有参函数:在函数定义及说明时都有参数,称为形式参数5.5 函数定义 类型标识符 函数名(形式参数列表) 声明部分 语句 其中类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。函数名是由用户定义的标识符,函数名后有一个括号(不可少写),若函数无参数,则括号内可不写内容或写“void”;若有参数,则形式参数列表给出各种类型的变量,各参数之间用逗号间隔。中的内容称为函数体。函数体中的声明部分,是对函数体内部用到的变量的类型说明。在很多情况下都不要求函数有返回值,此时函
11、数类型符可以写为void。 第六章 单片机输入接口与机器人触觉导航6.1 内容概述: 将在机器人前端安装并测试一个称为胡须的触觉开关。对机器人大脑编程、来监 视触觉开关的状态,以及决定当它遇到障碍物时如何动作。最终的结果就是通过触觉给机器人自动导航。6.2 胡须安装 右边胡须状态信息输入是通过P1口的第4脚完成,而左边胡须状态信息输入是通过P2口的第3脚完成 6.3 通过胡须导航 (1)实现函数要用到if语句的另一种形式,if-else-if形式,它可以进行多分支(2)一般形式:if(表达式1) 语句1;else if(表达式2) 语句2;else if(表达式3) 语句3; else if(
12、表达式n-1) 语句n-1;else 语句n;(3)含义: 语义为:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序;如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。(4)示例: if(P1_4state()=0)&(P2_3state()=0)/*两个胡须同时检测到障碍物时,后退,再向左转180度*/Back_Up();Turn_Left();Turn_Left();else if(P1_4state()=0) /右边胡须检测到障碍物时,后退,再向左转90度Back_Up();Left_Turn();else if(P2_3stat
13、e()=0) /左边胡须检测到障碍物时,后退,再向右转90度Back_Up();Right_Turn ();else /没有胡须检测到障碍物时,向前走 Forward(); 6.4带着胡须行走描述:主程序中的语句首先检查胡须的状态。如果两个胡须都触动了即P1_4state()和P2_3state()都为0,调用Backward(),紧接着调用Left_Turn ()两次;如果只是右胡须被触动即只有P1_4state()=0,程序调用Backward(),然后再调用Left_Turn ();如果左胡须被触动即只有P2_3state()=0,程序调用Backward(),然后再调用Right _T
14、urn();如果两个胡须都没有触动,在这种情况下,在else中调用Forward()语句。第七章 C51输入/输出接口与红外线导航7.1 内容概述:机器人可以使用红外线进行导航,让机器人的C51微控制器可以收发红外光信号,从而实现机器人的红外线导航。7.2 搭建并测试IR发射和探测器对进行IR探测时使用AT89S52的四个引脚:P1_2、P1_3、P3_5和P3_6#define LeftIR P1_2 /左边红外接收连接到P1_2#define RightIR P3_5 /右边红外接收连接到P3_5#define LeftLaunch P1_3 /左边红外发射连接到P1_3#define R
15、ightLaunch P3_6 /右边红外发射连接到P3_67.3 探测和避开障碍物7.4 高性能的IR导航(1)应用函数 dowhile语句(2)描述: 在C语言中,直到型循环控制语句是“dowhile”,它的一般形式为:do 语句 while(表达式); 其中,语句通常为复合语句,称为循环体(3)基本特点:先执行后判断第八章 机器人的距离检测8.1 内容概述:如果机器人可以检测到前方物体的距离,就可以编程让机器人跟随物体行走而不会碰上它,也可以编程让机器人沿着白色背景上的黑色轨迹行走。8.2 定时/计数器的运用(1) 分类:定时器模式、计数器模式 联系与不同:均使用二进制的加一计数:当计数
16、器的值计满回零时能自动产生中断的请求,以此来实现定时或者计数功能;它们的不同之处在于定时器使用单片机的时钟来计数,而计数器使用的是外部信号。(2)定时/计数器的控制 单片机的AT89S52有两个定时/计数器,通过TCON和TMOD这两个特殊功能寄存器控制(3)中断单片机AT89S52有5个中断源:2个外部中断源;2个定时器中断;1个串口中断。(4)中断优先级 AT89S52的中断分为2级,高和低。利用“优先级”的概念,允许拥有高优先级的中断源中断系统正在处理的低优先级的中断源。中断的优先级由高到低依次为:外部中断0,定时器0,外部中断1,定时器1,串口中断,定时器2中断。8.3 测试扫描频率8
17、.4尾随小车8.5 跟踪条纹带第九章 多传感器智能机器人9.1 内容概述: 触觉和红外传感器结合设计一款多传感器智能机器人,使它能够结合传感 器检测到的信息进行综合判断,执行理想的行走方案。 第二部分 智能小车功能实现简要分析第十章 智能机器人功能示例 -循迹避障小车 摘要利用AT89S52单片机为控制核心,结合多种传感器以及PID算法实现循迹避障功能的智能小车。利用反射式光电传感器检测黑线实现小车循迹,利用超声波传感器检测道路上的障碍,控制电动小汽车的自动避障,整个系统具有自动寻迹、寻光和速度测试功能。其中,控制部分采用AT89S52,电机驱动采用常用的PWM方式进行电机的调速控制,小车的速
18、度通过液晶屏来显示 1、系统总方案1.1 总体方案设计(1)描述:在现有小车的基础上,加装反射式红外光电传感器、超声波传感器、速度检测传感器以及光敏二极管阵列,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。(2)系统整体方框图 1.2 各个系统和元件1.2.1 传感器选择传感器是一种检测装置,能感受到被测量的信息,并能将检测感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求它是实现自动检测和自动控制的首要环节。选择合适的传感器可以使设计简便
19、,还可以简化硬件电路。(1)循迹检测系统 红外光电传感器在实时性和对主控芯片的要求方面要好(2)障碍物检测系统 红外检测不易受外界环境干扰(3)光源检测系统 光敏二极管利用它对光源变换的敏感反映,检测外部光源(4)速度检测系统 光电码盘1.2.2 电机驱动系统使用直流电机,加上适当减速比的减速器。直流电机具有良好的调速性能,控制起来也比较简单。1.2.3 单片机控制电路系统整个小车运行的核心部分,起着控制小车所有运行状态的作用。单片机要完成电机控制、循线控制、避障控制金属检测控制和光源检测控制等工作。主控采用AT89S52单片机,我们可以通过软件编程产生PWM。1.2.4 显示模块液晶显示电路
20、简单,使用方便,一个液晶显示器就可以同时满足此处同时显示速度和距离的要求。 2、硬件设计2.1 总体设计方案智能小车采用后轮驱动,后轮左右两边各用一个电机驱动,调制两个后面两个轮子的转速从而达到控制转向的目的,前轮是万象轮,起支撑的作用。将四个红外线光电传感器装在车体的底盘前端,小车根据传感器检测到的情况执行。 避障的原理和循迹一样,在车头装了一个传感器,传感器检测到障碍物时,小车减速,车体做出相应的反应。小车速度的检测也是靠的红外线,只不过是器件的型号不同,速度检测的传感器用的是对射式,避障用的是直射式。把码盘装在电机的轴上,码盘随电机一起转动,考虑到电机控制要使用PWM波形,而AT89S5
21、2单片机本身不能产生PWM,需要外加电路或使用软件的方式实现,为减少硬件电路,这里选用软件产生PWM方式2.2 单片机控制电路单片机是控制单元的核心使用的是AT89S52。通过对单片机AT89S52写入程序,可以方便的用软件来控制整个过程. 2.3 电机驱动电路2.3.1驱动电路小车使用的是直流电机。从单片机输出的信号功率很弱,即使在没有其它外在负载时也无法带动电机,所以在实际电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动。本设计中电机驱动采用L298集成H桥芯片。直流电机常用的PWM,及脉宽调制方式驱动。利用单片机调整出PWM脉冲和高低电平对直流电机进行驱动
22、和控制。 电机驱动电路L298集成H桥芯片。其外形、管脚分布如图 2.3.2 PWM调速原理脉冲宽度调制简称PWM。脉冲周期不变,只改变晶闸管的导通时间,即通过改变脉冲宽度来进行直流调速。PWM的理论基础是:冲量相等而形状不同的的窄脉冲加在具有惯性的环节上,其效果基本相同。采用PWM进行电机的调速控制,实际是保持加在电机电机电枢上的脉冲电压频率不变,调节其脉冲宽度。 PWM等效图示意图2.4 循迹检测电路该智能小车在铺有约两厘米宽黑纸的路面行驶,路面可以近似看为白色。由于黑纸和白色路面对光线的反射系数不同,可以根据接收的反射光的强弱来判断道路黑纸轨迹。红外探测法,即用红外线在不同颜色的物表面具
23、有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外线遇到白色地面时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑纸则红外光被吸收,小车上的接收管接收不到信号。本系统采用反射式红外线光电传感器ST178进行轨迹检测 ST168检测电路 2.5 障碍物检测电路超声波检测障碍物。原理是:超声波发生器T发出超声波信号,当这个信号遇到障碍物时反射回来,被接收器R收到。为使小车能准确避障,设计在小车的车体前端左右两侧分别各装一个超声波传感器。小车则可以根据接收到的信号做出相应的避障反应。 2.6 光源检测电路采用多个光敏阵列管2.7 速度检测电路光电码盘作为测量元件,是一种光电
24、器件。在现转过程中可以输出A、B两相脉冲,每旋转一周输出一脉冲,通过对A、B两相脉冲计数就可以确定光电码盘旋转的角度。2.8 液晶显示电路使用1602液晶显示器 3、软件设计3.1 系统控制流程 3.2 调试 4.参考文献 1. 秦志强 ,C51单片机与应用与C语言程序设计,电子工业出版社 2.张毅刚、彭喜元著.人民邮电出版社 3. AT89S52中文资料_XX文库 4. 智能循迹避障小车设计_XX文库 5.参考程序#include #define char unsigned char#define hint unsigned ftpsuit P1_0=P10;suit P1_1=P11;su
25、it P1_2=P12;suit P1_3=P13;suit P1_4=P14;suit P1_5=P15;char a,b,c;void delay_us(uint time) /微秒延时for(;time0;time-);void delay_ms(uint time) /毫秒延时 for(;time0;time-)delay_us(1000);void port_init() /I/O口初始化 P1=0x00; P0=0x00; void ex0_init() /中断初始化 PX0=1; EA=1; IT0=0; IT1=0; EX0=1; EX1=1; void pulse() /脉冲
26、驱动 P1_0=1; delay_us(800); P1_0=0; delay_us(2400); void int0_init() TMOD=0x01; TH0=-16000/256; TL0=-16000%256; ET0=0; TR0=0; void forword() /前进P1_1=1;P1_2=0;P1_3=1;P1_4=0;void back() /后退P1_1=0;P1_2=1;P1_3=0;P1_4=1;void left() /原地左转P1_1=0;P1_2=0;P1_3=1;P1_4=0;void right() /原地右/转P1_1=1;P1_2=0;P1_3=0;P1
27、_4=0;void stop() /刹车P1_0=0;void ex1() interrupt 2 using 2void int0() interrupt 1 using 1 TR0=0; TH0=-16000/256; TL0=-16000%256; TR0=1; void main() port_init(); ex0_init(); P1_5=1; while(1) switch(P0&0x0f) case 0x9: forword(); pulse(); break; case 0x1: case 0x3: case 0x7: case 0xb: left(); pulse(); break; case 0x8: case 0xc: case 0xe: case 0xd: right(); pulse(); break; default: back(); for(b=6;b0;b-) pulse(); void ex0() interrupt 0 using 0 EA=0; P1_5=0; for(c=25;c0;c-) back(); pulse(); for(b=35;b0;b-) left(); pulse(); for(a=35;b0;b-) forword(); pulse(); P1_5=1; EA=1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1