您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C51单片机应用与C语言程序设计第六章
第六章机器人的距离检测深圳市鸥鹏科技有限公司黄曦2009.3.21©2008Open-Tech.Allrightsreserved.摘要•用同样的IRLED/探测电路检测距离•任务一定时/计数器的运用•任务二测试扫描频率•任务三尾随小车•任务四跟踪条纹带•工程素质和技能归纳•科学精神的培养©2008Open-Tech.Allrightsreserved.探测电路检测距离•元件搭建:参考第五章任务一•新增工具和原料:(1)尺子(2)一张纸©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用本任务主要介绍51单片机定时/计数器的使用方法,单片机STC89C52的定时/计数器可以分为定时器模式和计数器模式。其实这两种模式没有本质上的区别,均使用二进制的加一计数:当计数器的值计满回零时能自动产生中断的请求,以此来实现定时或者计数功能。它们的不同之处在于定时器使用单片机的时钟来计数,而计数器使用的是外部信号。©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用•定时/计数器的控制51系列单片机有两个定时/计数器,通过TCON和TMOD这两个特殊功能寄存器控制。TCON和TMOD你都可以在头文件uart.h中看到其应用TCON为定时器控制寄存器,有8位,每个位的含义为如下表所示。TCON的低4位与定时器无关,它们用于检测和触发外部中断。©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用•定时/计数器的控制–TMOD为定时器模式寄存器,它也有8位,但不能像TCON一样可以一位一位的设置,只能通过字节传送指令来设定TMOD的各个状态。TMOD的各位定义如下表所示:©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用工作模式每个定时/计数器都有一个16位的寄存器Tn(n=0或1)来控制计数长度,由高8位THn和低8位TLn置初值。定时/计数器有四种工作模式。•模式0:定时/计数器按13位自加1计数器工作。这13位由TH的全部8位和TL中的低5位组成,TL中的高3位没有用到。•模式1:定时/计数器按16位自加1计数器工作。•模式2:定时/计数器被拆成一个8位寄存器TH和一个8位计数器TL,以便实现自动重载。这种模式使用起来非常方便,一旦设置好TMOD和THn,定时器就可以按设定好的周期溢出。•模式3:TH0和TL0均作为两个独立的8位计数器工作。定时器1在模式3下不工作。©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用•定时/计数器初值的计算定时/计数器是在计数初值的基础上加法记数的,假设Tn(TLn和THn)中写入的值为TC,在该模式下最大计数值为2n,程序运行的计数值为CCTC=2n-CC•通过定时/计数器来实现LED测试电路源程序:参考教材P105例程TimeApplication.c©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用•例程TimeApplication.c是如何工作的–在C程序中,一个函数的定义可以放在任意位置,既可放在主函数main之前,也可放在main之后,但如果放在main之后的话,那么应该在main函数的前面加上这个函数的声明:voidinitial(void);//子函数声明主函数main():首先对中断进行初始化设置,然后等待中断。IE=0x82;EA=1且ET0=1,打开了全局和定时器0的中断TCON=0x00;停止定时器,并清除了中断标志。TMOD=0x02;M1=0且M0=0,定时器0选择模式2TH0=0x38;TL0=0x38;设置计数初值和重载值。TR0=1;启动定时器0©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用•中断–中断即发生了某种情况(事件),使得CPU暂时中止当前程序的执行,转去执行相应的处理程序。中断在单片机应用的设计与实现中起着非常重要的作用。使用中断允许系统响应事件并在执行其他程序的过程中处理该事件。中断驱使系统能够在同一时间处理许多任务。在某种程度上,中断与子程序有些相似:CPU执行另一个程序——子程序——然后返回主程序。©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用•中断:–单片机AT89S52有5个中断源:2个外部中断源;2个定时器中断;1个串口中断。–每个中断源可以单独允许或禁止,通过修改可位寻址的专用寄存器IE(允许中断寄存器)实现,如下表所示©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用中断优先级•AT89S52的中断分为2级,高和低。利用“优先级”的概念,允许拥有高优先级的中断源中断系统正在处理的低优先级的中断源。•中断的优先级由高到低依次为:外部中断0,定时器0,外部中断1,定时器1,串口中断,定时器2中断。•编译器KeiluVision2支持在C源程序中直接开发中断程序,提高了工作效率。中断服务程序是通过按规定语法格式定义的一个函数,语法格式如下:返回值函数名([参数])interruptm[usingn]{……}其中,m(0~31)表示中断号,C51编译器允许32个中断,定时器0的中断号为1;n(0~3)表示第n组寄存器,例程没有使用该参数,默认为寄存器组0。©2008Open-Tech.Allrightsreserved.任务一定时/计数器的运用该你了——调整定时器时间•为了可以看见LED灯闪烁,你可以使用定时器模式0,由于在此方式下最大延时时间为8ms(213=8192)。对比第二章的LED程序,分析它们有何不同之处,使用示波器观察,你会发现使用定时器方式可以产生更精确的时间。•若效果还不明显,你可设计一个循环,如当检测到2500次中断后更改一次IO口的电平,即将闪烁时间改为2500*0.4ms=1s,有利于肉眼观察。©2008Open-Tech.Allrightsreserved.任务二测试扫描频率•对频率扫描进行编程做距离探测下图举例说明机器人如何用红外发射频率做距离测试。在这个例子中,目标物体在区域3。也就是说,发送35700Hz和38460Hz频率能发现物体,发送29370Hz、31230Hz以及33050Hz频率就不能发现物体。如果你移动物体到区域2,那么发送33050Hz、35700Hz以及38460Hz可以发现物体,发送29370Hz和31230Hz频率不能发现物体。©2008Open-Tech.Allrightsreserved.任务二测试扫描频率•源程序:参考教材P109例程TestLeftFrequencySweep.c例程TestLeftFrequencySweep.c是如何工作的•建立机器人复杂运动中,你用字符型数组存储机器人的运动,这里你将用整数型数组存储五个频率值:unsignedintfrequency[5]={29370,31230,33050,35700,38460};uart_Init();•串口的初始化,这个函数已多次用到。timer_init();•定时器的初始化。此例程使定时器0工作在模式1,16位定时模式,不具备自动重载功能。注意,timer_init()并没有开启定时器。Get_lr_Distances();©2008Open-Tech.Allrightsreserved.任务二测试扫描频率•机器人要发射某一频率,该给定时器设定多大的值呢?•频率为f时,周期T=1/f,高低电平持续时间为t=1/(2T),根据公式TC=2n-CC可算定时器初值time©2008Open-Tech.Allrightsreserved.任务二测试扫描频率•运行程序时,在机器人前端放一白纸,前后移动白纸,调试终端将会显示白纸所在的区域,如下图所示。程序通过计算“1”出现的数量,就可以确定目标在哪个区域。©2008Open-Tech.Allrightsreserved.任务二测试扫描频率•该你了――测试右边的IRLED/探测器–修改程序TestLeftFrequencySweep.c,对右边的IRLED/探测器做距离探测测试–运行该程序,检验这对IRLED/探测器能否测量同样的距离。–你可参考教材配套光盘对应例程中的注释部分。–尝试测量不同物体的距离,弄清物体的颜色和(或)材质是否会造成距离测量的差异©2008Open-Tech.Allrightsreserved.任务三尾随小车让一个机器人跟随另一个机器人行走,跟随的机器人也叫尾随车。尾随车要正常工作必须知道距离引导车有多远。如果尾随车落在后面,它必须能察觉并加速。如果尾随车距离引导车太近,它也要能察觉并减速。如果当前距离正好合适,它会等待直到测量距离变远或变近。闭环控制是一种常用的维持控制目标数据的方法,它很好地帮助机器人保持与一个物体之间的距离。闭环控制算法类型多种多样,最常用的有滞后、比例、积分以及微分控制。©2008Open-Tech.Allrightsreserved.任务三尾随小车•下图所示的方框图描述了机器人用到的比例控制过程的步骤,即机器人用右边的IRLED/探测器探测距离并用右边的伺服电机调节机器人之间的位置以维持适当的距离。©2008Open-Tech.Allrightsreserved.任务三尾随小车•左边的IRLED/探测器以及左边的伺服电机的控制框图如下图所示,与右边的运算法则类似。不同的是比例系数Kp的值由+70变为为-70。假设与右边的测量值一样,输出修正的脉冲宽度应该为1640。下面是该框图的计算等式:Leftservooutput=(Leftdistancesetpoint–Measuredleftdistance)Kp+Centerpulsewidth=((2–4)·(–70))+1500=1640http:/
本文标题:C51单片机应用与C语言程序设计第六章
链接地址:https://www.777doc.com/doc-3535426 .html