智能测速小车实验报告.docx
《智能测速小车实验报告.docx》由会员分享,可在线阅读,更多相关《智能测速小车实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
智能测速小车实验报告
XXXX大学
智能测速小车系统的设计
报告书
院(系)名称
:
学生姓名
:
专业名称
:
班级
:
时间
:
1.绪论
1.1开发背景
随着科学技术迅猛发展,人们对设备越来越高的应用需要已经无法满足当前和未来高性能的应用与发展需求。
显然,嵌入式系统的软、硬件技术和开发手段,
正日益受到重视,成为各领域技术创新的重要基础。
目前,嵌入式系统是近年来发展很快的计算机方面的学科方向,并迅速渗透到控制、自动化、仪器仪表等学科。
嵌入式方向包括了软硬件协同设计、嵌入式体系结构、实时操作系统、嵌入式产品设计等方面的知识,大于当代大学生,更需要掌握嵌入式系统设计的典型开发工具和开发核心技术。
近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。
嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。
毋庸置疑,机电一体化人才的培养不论是在国外还是在国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:
亚洲广播电视联盟亚太地区机器人大赛、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对机电一体化的兴趣与强化机电一体化的相关知识。
所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。
为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:
通过独立设计一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法。
所以立“基于单片机的智能小车测速设计”一题作为尝试。
这项设计是以采购的小车为基础,采用16位STC89C52单片机作为控制核心,逐步实现测速、调速、显示这三大功能。
本次设计主要解决问题是如何实现所要求的三大功能,最后完成硬件实物的组装,并编制相关程序,使其实现功能的融合,做出具有预先要求功能的实物。
1.2设计思路
图1.1简易硬件框图
2.STC89C52RC单片机简介
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
2.1标准功能
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
2.2主要特性
8K字节程序存储空间;
512字节数据存储空间;
内带4K字节EEPROM存储空间;
可直接使用串口下载;
2.3器件参数
①增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.[1]
②工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
③工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
④用户应用程序空间为8K字节
⑤片上集成512字节RAM
⑥通用I/O口(32个),复位后为:
P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
⑦ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片;
⑧具有EEPROM功能
⑨共3个16位定时器/计数器。
即定时器T0、T1、T2
⑩外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒
⑪通用异步串行口(UART),还可用定时器软件实现多个UART
⑫工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
⑬PDIP封装
2.4引脚说明
单片机STC89C52如下图2-1所示
①Vss:
第20个引脚,功能是电源地。
②Vcc:
第40个引脚,功能是电源引脚。
正常操作、空闲、掉电以及对OTPROM、Flash ROM编程或校验进的工作电压。
一般为2.7~6.0V(89C5X、89C5XX2电源电压一般为5.0V)。
③P00~P17:
作为I/O口使用时,P0口是漏极开路双向口,向口锁存器写入1 时,I/O口引脚悬空,是高阻输入引脚;在读写外部存储器时,P0口作为低8位地址/数据总线。
④P10~P17:
内部带有弱上拉的准双向口I/O口,作为输入引脚使用前,先向P1口锁存器写入1,使P1口引脚上拉至高电平。
P10,P11口除了作为一般I/O口使用外,还具有第二输入/输出功能。
T2(P10)——定时器T2的计数输入端或定时器T2的时钟输出端。
T2EX(P11)——定时器T2的外图2.1STC89C52引脚图
部触发输入端。
⑤P20~P27:
内部带有弱上拉的准双向I/O口,作输入引脚使用前,先向P2口锁存器写入1,使P2口引脚上拉至高电平。
在读写外部存储器时,P2口输出高8位地址信号A15~A8。
⑥P30~P37:
内部带有弱上拉的准双向I/O口,作输入引脚使用前,先和向P3口锁在器写入1,使P2口引脚上拉至高电平。
P3口除了可作为一般的I/O口使用外,还具有第二输入/输出功能。
RXD(P30)——串行数据接收(输入)端。
TXD(P31)——串行数据发送(输出)端。
INT0(P32)——外部中为0输入端。
INT1(P33)——外部中断1输入端。
T0(P34)——定时/计数T0的外部输入端。
T1(P35)——定时/计数T1的外部输入端。
WR(P36)——外部数据存储器写选通信号,低电平有效。
RD(P37)——外部数据存储器读选通信号,低电平有效。
⑦RST:
第9个引脚,功能是复位信号输入端,高电平有效。
⑧ALE:
第30个引脚。
低8位地址锁存信号。
⑨PSEN:
第29个引脚。
外部程序存储器读选通信号,低电平有效。
从外部程序存储器取指令时,每个机器周期PSEN信号被激活两次。
只有执行外部程序存储器中的指令时,PSEN才有效,而执行其它操作时PSEN无效。
⑩EA/Vpp:
第31个引脚。
外部程序存储器读选通信号,低电平有效。
⑪XTAL1:
第19个引脚。
片内晶振电路反相放大器输入端,接CPU内部时钟电路。
⑫XTAL2:
第18个引脚。
片内部晶振电路反相放大器输出端。
3.光电传感器
3.1光电传感器工作原理
光电传感器是通过把光强度的变化转变成电信号的变化来实现控制的。
一般的光电传感器由三大部分组成:
发光器、光接收器和检测电路发光器对准发光目标(光接收器或者是某种反光物质)发射光束,发射的光束一般来自半导体光源,如:
发光二极管、激光二极管或红外发射二极管。
光接收器接收发光器发出的光(或者反光物质反射回来的光)。
常用的光接收器一般
有:
光电二极管、光电三极管及光电池。
为了增强光电传感器的检测灵敏度及精确度,可以再接收器的前面装一个光学元件,如:
透镜、光圈等。
光接收器接检测到的光信号转换成相应的电信号,电信号传递给给相应的检测电路和滤波电路,从而提供正确的有效信号。
3.2光电传感器的常用类型
①槽型光电传感器
所谓的槽型光电传感器就是把一个光发射器和一个接收器面对面地组装于一个凹槽的两侧。
正常工作状态下,发光器能够在在驱动电路的工作下发出红外光或者是可见光,光接收器是用来接收发光器所发出的光的。
若发光器与接收器之间没有遮挡物,即槽内无障碍,发光器发出的光可以被接收器接收;反之则不能。
当接收器不能接收到发光器发出的光时,相应的光电开关便动作。
该种传感器能检测的距离很小,一般只有数厘米。
②对射型光电传感器
为了使检测距离增大,可以将发光器和接收器分开组装在相距较远的两个物体上,这就是对射型光电传感器。
对射式光电传感器可以检测较远的距离,一般能达到数米甚至数十米的距离。
使用时将发光器和接收器固定在检测物通过的路径的两侧,检测物通过该光电传感器时,检测物挡住发光器发出的光,接收器检测不到光信号,做出相应的开关动作。
③反光型光电传感器
反光型光电传感器把发光器和接收器装入同一个装置,在其前方固定一块反光板,利用反射原理完成光电控制。
一般情况发光器发出的光可以被光接收器接收,但当传感器与反光板之间有不透光的障碍物时,由反光板反射回来的光就不能被光接收器接收,光电开光就做出相应的动作,输出一个开关控制信号。
④扩散型光电传感器
扩散型光电传感器内装有一个发光器和一个光接收器。
但前面没有挡光板,正常情况光接收器不能检测到发光器发出的光;若发光器前方有障碍物时,发光器发出的光照在障碍物上发生漫反射,将部分光发射回来,由光接收器接收。
光接收器接收到反射回来的光信号,输出一个相应的开关信号。
4.仿真图及其结果
4.1仿真电路图
图4.1仿真电路图
4.2仿真结果
①启动仿真
图4.2仿真电路图-启动
②实现“加速”操作
图4.3仿真电路图-加速
③实现“减速”操作
图4.4仿真电路图-减速
④实现“置零”操作
图4.5仿真电路图-置零
⑤实现“重置”操作
图4.6仿真电路图-重置
5.软件程序设计
5.1 语言的选用
本设计中采用的处理器是AT89S52单片机,由此可采用面向MCS-51的程序设计语言,包括ASM51汇编语言和C51高级语言,这两种语言各有特点。
汇编语言更接近机器语言,常用来编制与系统硬件相关的程序,如访问I/O端口、中断处理程序、实时控制程序、实时通信程序等;而数学运算程序则适合用C51高级语言编写,因为用高级语言编写运算程序可提高编程效率和应用程序的可靠性。
C语言是一种通用的计算机程序设计语言,在国际上十分流行,它即可用来编写计算机系统程序,也可以用来编写一般的应用程序。
以前计算机的系统软件主要是用汇编语言编写的,对于单片机应用系统来说更是如此。
由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用程序的周期长,而且调试和排错也比较困难。
C语言具有很好的可移植性和硬件控制能力,表达和运算能力也较强。
它具有以下特点:
①语言简洁,使用方便灵活;②可移植性好;③表达能力强;④表达方式灵活;⑤可进行架构化程序设计;⑥可以直接操作计算机硬件;⑦生成的目标代码质量高。
为了提高编制计算机系统和应用程序的效率,改善程序的可读性和可移植性,在此采用高级语言编程。
5.2程序设计流程图
图5.1程序设计流程图
程序说明:
将定时器设置为方式1,对外部脉冲进行计数,并判断Flag_clac的值。
当Flag_calc=1时,将脉冲的数值由十六进制转换成十进制,按转速转换公式转换后,载入数据缓冲区。
图5.2定时显示程序流程图
程序说明:
定时器设置为方式1,定时10ms。
当定时达到10ms时,产生中断,对数码管显示屏进行刷新,显示转速,并使时间计数标志T加1。
当时间计数标志T=500时,使Flag_calc置1,取出计数器在此时间内计算的脉冲数,通过转速计算程序计算得出转速值后,存入数据缓冲区,供数码管显示使用。
5.心得体会
5.1个人心得
xx:
此次课程设计涉及模拟电路和数字电路知识,还涉及到了单片机、AD转换器、显示器等多种器件。
是对大学期间所学知识的一次综合的应用,是一个知识融会贯通的过程。
此外,由于课题要求制作实物,在考察所掌握专业知识的同时也对自身的动手能力提出了挑战。
本系统的设计过程并非一帆风顺,刚开始接触这个课题时,心中并没有一个清晰的框架,通过翻看手册与查阅相关资料后,我渐渐有了设计的思路,对于系统所要用到的元器件类型也有了一定程度的了解。
本设计能够顺利完成,还承蒙老师以及身边的很多同学的指导和帮助。
在设计过程中,老师给予了悉心的指导,最重要的是给了我解决问题的思路和方法,并且在设计环境和器材方面给予了大力的帮助和支持,在此,我对老师表示最真挚的感谢!
同时感谢所有帮助过我的同学!
xx:
从开始进行设计智能壁障小车到完成实现壁障和测速功能,我找了很多资料,并应用了Proteus8professional软件进行仿真,运用单片机知识进行编程以完成设计要求的功能。
在途中,也遇到了好多问题。
我已经尽了自己的最大努力,也从中学到了很多知识,获益匪浅。
特别是每次把问题解决以后,那种心情是非常开心的,当看到小车自动测速以后,脸上自然露出自豪的笑容。
感谢学院给我们提供这样的实践动手机会,并通过课程设计使我们能够有机会将书本上学到的知识运用到的实际中去。
在课设过程中陈老师给了我很多的指导和帮助,并监督我及时完成了本次课程设计在此特别感谢老师和给予我帮助的同组同学。
xx:
经过自己不断的搜索努力以及老师的耐心指导和热情帮助,本设计已经基本完成。
在这个过程中老师以及曾做过此类设计的同学给予了我很大的帮助,给我提供了大量的硬件和软件资料,也给我的设计提出了宝贵的意见和建议。
在此,对大家表示衷心的感谢!
这次设计不仅是对我的专业知识的一次集中地检验,同时也为我们提供了一个进入职场前的实战机会;通过这次在老师指导下做设计的机会,我对于技术实践方面有了更深刻的认识,也进一步夯实了所学的专业知识。
虽然在设计中对于知识的运用和衔接还不够熟练。
但是我将在以后的工作和学习中继续努力、不断完善。
这设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。
由于自身水平有限,设计中一定存在很多不足之处,敬请老师批评指正。
5.2总结:
本设计采用光电开关测速法,利用对射式光电开关采集转速信号,通过信号处理电路得到适合的脉冲后,输入单片机进行处理、计算,得出实际的转速值,辅以数码管显示屏显示。
1.此系统实现了设计的要求:
①光电开关与电机转换平台简单适用
②采集电路能实时采集转速信息
③单片机处理系统运算快速简单,程序可读性强,条理分明,能形成独立模块以便于其他类似系统的计算
④数码管显示屏为主体的人机界面能准确显示速度值
2.本设计存在的问题:
①系统选择位数最多的定时/计数器工作方式1(为16位),但仍有其局限性。
此计数器的最大计数脉冲数为63336(216),若每秒钟计算一次,则当1秒内外部脉冲的输入数超过65536个时,计数器会溢出,从而产生中断,使得测出的转速值小于实际的转速值。
根据转速计算方法(若转盘齿数为10),Vmax=65536*60s/(10*1)=39321r/min,所以本系统不能测量范围不能超过此值。
②通过T1计数时,单片机每读取一个脉冲至少需要3个机器周期的时间来完成。
本系统采用的晶振为12MHz,所以一个机器周期Tcy=12/f=1us。
若要使单片机准确读取外部脉冲,则脉冲的输入周期不能超过3us。
如此可计算(转盘齿数为10),系统能测量的转速需低于:
Vmax=60s/(3us*10)=6000000r/min。
③此外,光电开关的反应速度也会对转速测量值的大小产生影响。
若转速过快,则光电开关来不及处理,这样会造成测速不准,甚至测不出数值。
3.针对存在的问题,可以采取以下方法改进:
①采用时钟频率更高、定时/计数器位数更多的单片机来处理脉冲,现某些高速单片机可达到40MHz的处理速度,可以大大提高测速范围。
②应用反应速度更快的传感器来做光电开关。
现在高速光电开关的响应速度可达到0.1ms,每分钟可进行30万次检测操作,这样就能检出高速转动的微小物体。
综上所述,在测速过程中,虽然由于硬件的缘故,未能实现对高速的测量,但本装置结构简单、实用,在降低测速器成本,提高测速稳定性及可靠性等方面有一定价值,而且可以达到一般工业测速的测量标准,具有广泛的前景。
附录A元器件清单
表1元器件清单表
序号
器件类型
器件参数
数量
备注
1
单片机
STC89C52
1
2
电阻
10KΩ
8
3
电容
30pf
2
4
电解电容
220u
1
5
四角开关
5
6
6
晶振
CRYSTAL
1
7
排阻
RESPACK-8
1
8
共阳数码管
SM410562
1
9
电机
MOTOR
2
10
NPN三极管
D882
6
11
PNP三极管
B772P
2
附录B源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#definecount1
#definePI3.14
sbitwela2=P2^0;
sbitwela1=P2^1;
sbitkey1=P1^5;
sbitkey2=P1^6;
sbitkey3=P1^7;
sbitENA=P2^2;
sbitENB=P2^3;
unsignedcharzkb1=0;
unsignedchart=0;
unsignedcharzkb2=0;
ucharspeed=0;
uchardatt;
bitkeychange=1;
ucharcodetab[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voidDisplay(uchardat);
voidKeyboard(void);
//*********延时函数*********//
voiddelay(uintxms){
uinti,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
voidinit(){
TMOD=0x51;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-count)/256;
TL1=(65536-count)%256;
ET1=1;
IT1=1;
TR1=1;
}
//*******中断函数+脉宽调制********//
voidtimer0()interrupt1{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(tENA=1;
else
ENA=0;
if(tENB=1;
else
ENB=0;
t++;
if(t>=100){
t=0;
}
}
voidtimer1()interrupt3{
TR1=0;
TH1=(65536-count)/256;
TL1=(65536-count)%256;
speed++;
if(speed>=10)
speed=10;
TR1=1;
}
//***********主程序***********//
voidmain(){
zkb1=50;
zkb2=50;
datt=zkb1;
init();
while
(1){
Keyboard();
Display(datt);
}
}
//--------------显示函数----------------
voidDisplay(uchardat){
wela2=0;
wela1=1;
P0=~tab[dat%10];
delay(3);
P0=0xff;
wela1=0;
wela2=1;
P0=~tab[dat/10];
delay(5);
P0=0xff;
}
voidKeyboard(void){
if(keychange==1){
if(key1==0){
delay(10);
if(key1==0){
zkb1=zkb1+10;
zkb2=zkb2+10;
if(zkb1>=100)
zkb1=90;
if(zkb2>=100)
zkb2=90;
while(!
key1);
}
}
if(key2==0){
delay(10);
if(key2==0){
zkb1=zkb1-10;
zkb2=zkb2-10;
if(zkb1<=0)
zkb1=0;
if(zkb2<=0)
zkb2=0;
while(!
key2);
}
}
datt=zkb1;
}
else{
datt=speed;
}
if(key3==0){
delay(10);
if(key3==0){
keychange=~keychange;
while(!
key3);
}
}
}
附录C实物图