巡线小车开发实验报告
- 格式:doc
- 大小:1.59 MB
- 文档页数:15
开放性实验报告——巡线小车设计系别:测控技术与仪器姓名:高东(06072112)王启瑞(06072113)蒋康(06072115)张娇(06072137)指导老师:赵勇时间:2009.10.24—2009.12.7目录1 系统功能介绍 (1)2 设计任务与要求 (1)3 系统硬件设计 (1)3.1系统总体设计框图 (1)3.2寻线模块(ST188) (2)3.3电机控制模块 (3)3.4单片机最小模块 (4)3.5数码管显示模块 (5)4 系统软件实现 (6)4.1 设计思路 (6)4.2 软件程序流程图 (7)4.3程序代码见附录Ⅰ (7)5 调试结果 (7)6 实验总结 (7)附录Ι (9)附录Ⅱ (13)1 系统功能介绍本设计以单片机作为控制核心,电路分为最小系统模块,黑线检测模块,电机驱动模块,数码管显示模块。
黑线检测模块采用反射式关电传感器st188,并且接相应的三级管来规划传感器的输出,当输出高电平为正常情况。
电机为伺服电机,给定脉宽为1.5ms的信号电机保持不动,给定脉宽为1.7ms的信号电机正向转到给定脉宽为1.3ms的信号电机逆向转到。
数码管动态显示小车行进过程所用的时间。
2 设计任务与要求◆了解关电传感器st188的设计原理和方法。
◆熟悉51系列单片机的原理及应用。
◆掌握伺服电机的驱动方法。
◆掌握动态数码管显示的方法。
◆设计小车的硬件电路及软件程序。
◆制作小车的硬件电路,并调试软件,最后实现小车的自动测量黑线。
3 系统硬件设计3.1系统总体设计框图该系统中51单片机作为主微控芯片,其外多个I/O口作为通用I/O口接受传感器的信号并输出相应的控制信号。
系统硬件总体设计框图如下图3.1-1所示。
51控制核心检测模块电机驱动模块数码管显示模块图3.1-1系统硬件总体设计框图 3.2寻线模块(ST188)该系统中的寻线模块我们采用的是ST188传感器。
ST188是一个无限红外模块,它有一个发射管(白色)和一个接收管(黑色),一般情况下接收管能收到发射管发送的红外光,但当遇到吸光介质(如黑色物体)时接收管便不能收到发射管的红外光。
由于这种现象,加上合适的硬件电路(如图3.2-1),我们可以引出一条信号线,当一切正常时,信号线处于一种状态,但当遇到吸光介质时信号线便处于另一种状态,利用这种不同状态的差异我们便可以通过微控制器来实现小车的寻线行驶。
ST188详细资料见附录Ⅱ下图3.2-1是该系统中我们的ST188外接硬件电路图:图3.2-1 寻线模块电路图图中R1为发射管的限流电阻,若R1阻值过大,则发射管功率会大幅降低,所以其阻值在50-200欧之间。
R4为发光二极管的保护电阻。
R2,R3,R5为起分流的作用,其阻值可根据情况而定。
其工作原理是通过R2,R3,R5来确定输出信号的门限值,当发射管E端V高于R5上的压降时,由于运放的饱和特性,输出低电压0V:当V低于R5上的电压时,输出电压为5V。
图中的通过发光二极管指示是否有信号输出。
实际硬件中我们可以通过调节滑动变阻器的R5电阻值来选取理想的反射距离,从而提高ST188传感器的灵敏度。
本设计中我们利用ST188来控制小车寻线。
由以上叙述可知,为使小车寻线稳定,最好选择差异较大的环境,例如在白地板上贴上黑线,可使ST188寻线模块工作更加灵敏稳定。
3.3电机控制模块本次实验采用的伺服电机的工作模式如下所示:通过I/O口给电机的信号输入如图3.3-1所示的信号电机保持静止,这个信号称为电机的零标定信号,这个指令由时间间隔为20ms脉宽为1.5ms的一系列脉冲组成。
图3.3-1舵机控制信号(静止状态)通过I/O口给电机的信号输入如图3.3-2所示的信号电机将全速逆时针旋转,这个指令由时间间隔为20ms脉宽为1.3ms的一系列脉冲组成。
图3.3-2舵机控制信号(逆时针旋转状态)通过I/O口给电机的信号输入如图3.3-3所示的信号电机将全速逆时针旋转,这个指令由时间间隔为20ms脉宽为1.7ms的一系列脉冲组成。
图3.3-3舵机控制信号(顺时针旋转状态)3.4单片机最小模块整个试验的控制器件是51单片机,它在实验中起了核心作用,采用内部时钟方式,给它的XTAL1和XTAL2引脚外接晶振,这样就构成了自激振荡器并在单片机内部产生时钟脉冲信号,给晶振的每个角又接了一个30PF的电容,让晶振快速起振并可以达到12M稳定频率,给单片机的RST口按键开关使之构成复位电路。
具体电路如图3.4-1所示图3.4-1单片机最小模块3.5数码管显示模块由于时钟电路显示的内容是变化的,因此本实例采用动态显示实验时数码管采用的是共阳极的数码管,4个数码管的段选相应并联在一起,由一个8位的I/O控制,动态显示时,各位数码管轮流通,要使其稳定显示必须采用扫描的方式,即在某一时刻只选通以位数码管,并送出相应的段码,在另一时刻选通另一位数码管,并送出此想相应的段码,依次规律循环,即可使各位数码管显示将要显示的字符,虽然这些字符是不不同的时刻分别显示的,但由于人眼存在暂留效应,只要每位显示时间足够短就可以给人不同的显示感觉。
采用动态显示方式时,采用三极管的放大作用,以增加led的亮度。
具体电路图如3.5-1所示。
其中数码管的ds1端的各位1、2、3、4、5、6、7接I/O的P0口,段选端接I/O的P2口。
图3.5-1数码管硬件电路4 系统软件实现4.1 设计思路在程序中用定时器0用用于输出小车电机所需的脉冲波形,定时器1用于数码管显示。
计数器0,1初始化后,进入while循环,在while循环中等待定时器1中断并相应的相应时间。
否则等待定时器0输出脉冲波形。
由于中断1只是为了显示时间,而0中断影响到小车的行进与否,所以在程序中设置1中断的优先级高于0中断。
从而使从而使I/O口输出稳定的脉冲波形。
4.2 软件程序流程图开始系统初始化进入循环等待T0中断是否有黑线?调用go函数继续前进结束驱动电机避开黑线是否有t0中断数码管显示YESNOYESNO图4.2-1系统软件程序流程图4.3程序代码见附录Ⅰ5 调试结果按照上面的设计思路,焊接好电路板连组装在小车上,进行实验,而且最终小车也完成了基本的寻线的功能。
按照实验时的跑道总共用时35s,当两个传感器同时检测到黑线时表示寻线结束,这时数码管上显示的时间正是35s 本次的实验的缺陷是数码管在动态显示的过程中总是在不停的闪烁。
6 实验总结本次实验的结果最终还是完成了寻线的基本功能。
我从刚开始的一无所知到完成了实验,我是边学习边实践来完成的。
从基本的学习单片机的C程序,到完成电路板的设计。
由于是第一次做,所以走了不少弯路。
不过幸亏有老师和同学的帮助使我很快完成了实验。
在实验过程中我也得出了一些经验,当然也遇到了不少问题:(1)有些程序代码在我们理论看来是可以行得通可是到下载到单片机上却不能达到想要的目的,我也不知道是我的程序逻辑思路有问题还是硬件电路的问题。
(2)在实验中我用仿真软件可以实现,我把程序下载到单片机上时却得不到想要的结果,总是从在误差。
我尝试了很多次。
由于本次实验中定时的要求比较高必须得出精确的1.5ms,1.3ms,1.7ms脉冲波形,由于以上的原因我只能不断的通过实践来调整。
(3)数码管在动态显示的过程中,延时的问题到最后我还是没调整好,数码管总是不断的闪烁,但是当我单独使用数码管显示时这个问题就不存在了。
但是当两个定时器同时工作的时候问题就出来了。
这个问题我一直也没调好。
在这次实验中我学到了很多东西,同时我也知道我不知道的还有很多,需要我不断的努力。
当我看到小车按照我自己的意愿行进时,我的心里很高兴,我也是第一次感觉到自己所学的知识这么快的被我用于实践中,也激发我了学习的兴趣。
附录Ι程序代码如下:#include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned intsbit right=P1^0;sbit left=P1^1;sbit Lchuan=P1^6;sbit Rchuan=P1^7;uchar num,disnum,count,shi,ge,min;ucharcodetabledu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //数码管编码void display(uchar,uchar,uchar ); //显示函数void delay(uchar ); //延时函数void speed(uint,uint); //速度函数void stop(); //停止函数void main() //主函数{P1=0xff;P0=0xff;P2=0xff;TMOD=0x11; //设置定时器为工作方式1(0001 0001)TH1=(65536-50000)/256; //装初值TL1=(65536-50000)%256;TH0=(65536-100)/256; //装初值TH0=(65536-100)%256;EA=1; //开总中断PT0=1; //定时器0中断定义为高优先级ET0=1; // 开定时器0中断ET1=1; //启动定时器0TR0=1; //开定时器1中断TR1=1; //启动定时器0中断while(1) //进入循环并等待中断的产生{while(Lchuan!=0||Rchuan!=0){if(Lchuar==0&&Rchuan!=0)speed(14,16); //小车左转else if(Rchuan==0&&Lchuang!=0)speed(13,14); //小车右转elsespeed(12,16); // 小车直线前进}if(Lchuan==0&&chuang==0){stop(),ET1=0; //小车停止前进,关定时器1display(shi,ge,a1);}}}void time1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;count++;if(count==20) //如果到了20次,1秒时间到{count=0; //num清0重新再计20次disnum++;if(disnum>59) //disnum==59,1分钟到{disnum=0; //disnum清0再计时min++;}shi=disnum%10; //把disnum分离后分别送数码管ge=disnum/10; //显示十位和个位display(shi,ge,min); //调用显示函数} }void time0() interrupt 1{TH0=(65536-100)/256;TH0=(65536-100)%256;num++;}void display(uchar shi,uchar ge,uchar min) //数码管显示子函数{P2=0xe0; //数码管段选P0=tabledu[shi]; //数码管位选delay(15);P2=0xd0;P0=tabledu[ge];delay(15);P2=0xb0;P0=0xb7;;delay(15);P2=0x70;P0=tabledu[min];delay(15);}void delay(uchar x) //延时子函数{uchar a,b;for(a=x;a>0;a--)for(b=123;b>0;b--);}void speed(uint M,uint N) //速度调节子函数,其中14 { //15ms脉冲的参数,16为if(num<M) //17ms的脉冲参数,13为right=1; //13ms的脉冲参数。