基于51单片机的光电编码器测速报告汇总Word格式文档下载.docx
《基于51单片机的光电编码器测速报告汇总Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机的光电编码器测速报告汇总Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
P0和P2口控制1602液晶显示转速;
利用P1^1和P1^2来实现液晶显示每秒钟和每分钟转速的功能;
利用复位按键功能来实现复位操作。
调节蓝白滑动变阻器来调节液晶亮度。
2.1方案一
51单片机的定时/计数器工作在模式2时是一个可以自动重装载的8位定时/计数器。
工作时高八位和低八位装入相同的初值,当低八位装满时,高八位的值自动装入到第八位中,从而可以省去用户软件中重装初值常数的语句,可产生相当精确的定时时间。
由于只有八位参与计数,所以其计数周期最大为256微妙。
采用初值装入0x38,每个200微妙进入一次中断,5000次中断为100毫秒,即实现周期为1秒的脉冲计数。
光电编码器的A相接在单片机的外部中断,光电编码器的B相接在单片机的P1^0。
A相发出的脉冲每触发一次中断就就计数一个脉冲,并且再对P1^0的高低电平进行检测,如果为高电平则为反转,如果是低电平则为正转。
反向器中的两个作为放大作用。
再接两个三极管作为开关作用,组成一个直流电机的驱动电路。
P1^1和P1^2分别控制液晶显示每分钟的转速和每秒钟的转速。
P2口控制1602液晶的数据口,P0的三个引脚控制1602液晶的数据/命令选择端、读/写选择端、使能端来显示速度。
2.2方案二
51单片机的定时/计数器工作在模式0时是一个16位位定时/计数器。
工作时高八位和低八位各装入初值,当低八位装满时,高八位加1。
由于是16位参与计数,所以其计数周期最大为65536微妙。
采用初值高八位装入0xfc,初值低八位装入0x18,每个1000微妙进入一次中断,1000次中断为1秒,即形成周期为1秒的脉冲计数。
本方案在方案1的基础上外接一个74LS74的芯片。
光电编码器的A相接在单片机的P3^4的引脚,利用单片机的计数器1进行脉冲计数,同时接在74LS74的时钟信号接口。
光电编码器的B相接在74LS74的D接口。
Q端接在P3^2引脚,Q非端接在P3^3引脚。
利用两个外部中断来判断正反转。
2.3系统采用方案
1)总体设计
图1为设计总体框架图,通过该图大致的介绍了一下整个光电编码器测速系统的各个主要部分。
图1系统总体框架
2)总体工作原理
由于定时器工作模式2是八位,可装入的值太小,每进行一个周期的脉冲统计需要进入5000次定时器中断,由于进入中断的次数太多,所以很容易出现在低八位装满本应触发而程序还在中断子程序中运行,而无法触发中断的情况,所以不采用工作模式2。
工作模式0只需要进入定时中断1000次就可以进行一个周期的脉冲统计,所以选择功能模式0。
方案一中用,用纯软件计数虽然电路简单,但是计数速度慢,难以满足实时性要求,而且容易出错。
我们可以用单片机内部的计数器来实现加减计数。
单片机片内有两个16位定时计数器都可以用来脉冲计数,用两个外部中断来检测正反转,避免了每一个脉冲都要进行高低电平检测的步骤。
控制按键,液晶和复位方面的设计在方案一和方案二中一样。
综上考虑,最终方案确定为方案二。
三、硬件设计
3.1单片机最小系统
单片机要正常工作,首先要产生片内时钟信号。
在单片机内部的振荡器的输入端XTAL1和输出端XTAL2之间接一个石英晶振就可以够成一个自激振荡器。
再在两端之间串联接个电容并且在两个电容之间接地以便于稳定频率还对振荡频率有微调作用。
电容通常选30PF左右,振荡脉冲频率范围为0~24MHZ。
该电路中选用12MHZ晶振。
时钟电路图如下:
图2时钟电路图
单片机在启动时与其他微处理器一样,要让CPU及系统各部件处于确定的初始状态,并从初始开始工作。
这就需要复位操作。
复位电路有两种方式:
上电自动复位和按键自动复位。
上电自动复位只是在开始接通电源瞬间复位,接下来想要再次复位就需要断电重启,不方便。
按键自动复位不仅可以在开始接通电源瞬间复位还可以通过按下按键复位随时复位。
所以选择按键复位方式。
复位电路如下:
图3复位电路图
3.2液晶显示模块
该可调直流电机最大速度为每分钟1200转,采用1602液晶显示。
控制1602液晶亮度的是蓝白滑动变阻器。
1602液晶有16个管脚。
编号为1,2管脚为电源正负极管脚,15,16为背光源正负极管脚;
7~14为dataI/O管脚与单片机的P0口相连,负责液晶与芯片之间的信息传送;
4,5,6分别为数据/命令选择端、读/写选择端、使能端,与单片机的,P2^0、P2^1、P2^2相连,负责控制液晶与芯片之间数据命令的读写操作;
3为液晶显示偏压信号端,用于调整液晶显示对比度。
1602液晶显示原理图如下:
图4液晶显示系统图
3.3系统电源
为了方便控制系统的上电与断电,系统电源中连接了一个蓝白自锁开关。
此开关两边各有三个引脚,不同的连接方式,开关的控制方法就不同。
电源的正负极各接在此开关的两边。
为了方便观察电源是否接上,在电路中的VCC与GND之间接一个发光二极管并且加一个限流电阻防止发光二极管烧坏,电源通电时发光二极管亮,断电时,则暗。
再接四个排针便两边的两个排针用于外部电源给系统上电,中间的两个排针是用于单片机烧录程序。
如图所示:
图5系统电源图
3.4光电编码器电路
这是一张光电编码器部分的电路原理图。
图上的74LS74芯片上就是两个D触发器。
A相接在P3^4的引脚用于计数器0采集脉冲。
A相同时接在CLK端,B相接在D端,Q接在P3.2引脚,外部中断0检测和Q非接在P3.3外部中断1来检测。
另外A相和B相各需接一个上拉电阻,阻值为1K。
这样输出的脉冲就可以直接接在单片机上,进行检测了。
另外74LS74芯片的SET引脚,CLR引脚,VCC引脚都接电源,GND引脚接地。
整个电路就连接完成了。
图6光电编码器电路
3.5整体电路
这是采用网络标号的画出的以一张整体电路图。
它将整张可调直流电机的电路原理图分为七个部分:
电源模块,P0口上拉电阻,1602液晶模块,51单片机,复位晶振电路,控制按键和光电编码器电路。
整张原理看起来美观,明了并且根据标号很容易找到与之对应的引脚。
图7整体电路图
四、软件设计
4.1keil软件介绍
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种Keil软件图标是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。
掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
4.2系统程序流程
1)主程序流程
图8为光电编码器测速系统的主程序流程图。
通过该图可以直观的了解到整个调控程序的大致走向为先扫描每秒钟速度和每分钟速度的控制按键,确定了是显示速度的方式之后,再执行液晶显示程序,显示出速度。
接着又重新回到控制按键扫描的程序中,如此不断重复循环。
图8主程序流程图
2)中断程序流程
图9为光电编码器测速系统的中断程序流程图。
脉冲计数周期主要是由单片机内部精确到毫秒的定时器每次以间隔相同的时间进入中断,中断1000次才形成一个周期。
一个周期的时间到了,就进行一次脉冲计算。
一个周期时间没到就进入主程序。
从而控制每个周期的方波高电平和低电平各自持续的时间,即控制了方波的占空比。
通过该图也可以清晰明了的知道,该中断程序主要涉及的就是方波的调控。
先是判断高电平是否未达到调控的时间,如果未达到则让gdp+1,即让继续高电平保持。
如果gdp为100则说明主程序已经把方波调控到一直保持高电平,就让gdp为0,就可以一直输出高电平了。
如果高电平达到了调控的时间,就让控制电机的两个引脚都为低电平并让ddp+1,即让继续低电平保持。
如果低电平未达到了调控的时间,就进入主程序继续保持低电平等待下一次中断。
如果低电平达到了调控的时间,就让ddp=gdp=0,即重新开始下一个方波。
图9定时器中断程序流程图
五、仿真与实现
5.1proteus软件介绍
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持KEIL,IAR和MPLAB等多种编译器。
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。
前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。
这在相当程度上替代了传统的单片机实验教学的功能,例:
元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
使用Proteus软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;
在单片机课程设计和全国大学生电子设计。
实践证明,在使用Proteus进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。
因此,Proteus有较高的推广利用价值。
由于该设计的光电编码器测速在仿真软件中无法仿真,只能仿真液晶显示部分,所以仿真原理图忽略。
5.2仿真过程
图10为使用keil软件编写程序时的调试过程图。
我用的是C语言来编写。
第一次编写完程序后,然后编译一下,出现的对话框中显示有几个错误,点击错误提示,主程序会出现光标只向错误的地方,根据这个错误提示,然后进行更改,再编译一下,程序还是显示有错误,再重复上次的操作,进过了几次修改后,就如图所示没有错误提示了。
编写程序就是这样,需要不断修改,程序才能准确。
程序编写好,还要编译成HEX文件。
只有HEX文件才能烧录到到单片机上。
图10keil软件仿真图
5.3实物制作与调试
图11为实物图的背面,图12为实物图的正面。
原理图和洞洞板图画好,程序写好后就可以开始焊接了。
在刚开始焊好后,烧录程序进去,但液晶却不能显示,于是我就在protues中仿真了液晶显示部分,仿真中能实现正确显示,再检查一下有没有焊接错误,也没有发现任何错误,我就想如果我能正确控制1602液晶的引脚,它就应该能够显示,于是我在出现中令P2=0xaa,en=1,rw=0,rs=1,然后用万用电表检查液晶上的液晶是否是如我所设定的那样,电平引脚和我设置的一样。
我再令P2=0x55,en=0,rw=1,rs=0,结果我发现rs液引脚为高电平,而我设置的为低电平。
我用万用电表检查,发现rs引出的那根导线与电源短路了,可是我根本看不出来哪里短路了,我就先把rs引出的那根导线焊开分成两段,再检查其中有一段是短路的,接着再焊开成两段,继续检查,最后找到了短路的地方,原来是两个焊盘本身就是连在一起。
我就把其中一个焊盘用电烙铁焊掉,用走线连接,一上电,液晶立刻就显示正常。
图11实物图背面
图12实物图正面
5.4使用说明
如图12所示:
此光电编码器测速系统包含的元器件有:
STC89C52单片机一块,光电编码器,一块74LS74芯片,40个脚IC插座一个,14个脚IC插座一个排阻一个,一个16脚的排母,1602液晶一块,一个3M红色LED灯,六个排针,三个四脚轻触开关,四个个电阻,一个电解电容,两个瓷片电容,,一个六角自锁开关,一个晶振和一个103蓝白滑动变阻器。
整个光电编码器测速系统布置在一块20×
10大小的洞洞板上。
1602液晶用于显示所测的转速,单片机下方的两个按键为控制按键,从左往右第一个为显示每秒转速控制键,第二个为显示每分钟的转速。
控制按键右边为一块74LS74芯片,四个排针(用于接光电编码器)和两个1K电阻组成组成光电编码器测速电路部分。
单片机右边蓝白滑动变阻器,通过调节蓝白滑动变阻器来调节液晶亮度。
那个按键为复位按键,每按一次系统就复位一次,回到初始状态。
复位按键下方的蓝白自锁开关为电源开关,当排针接好电源后,按下蓝白自锁开关则系统上电,按起蓝白自锁开关则系统断电。
蓝白自锁开关上方的红色发光二极管为电源指示灯,当系统接通电源时,指示灯亮,当系统断开电源时,指示灯暗。
蓝白自锁开关下方的四个排针从上至下依次接5V的VCC,RXD,TXD,GND。
使用前应先上电。
接上电源后由于开关断开系统还未上电,按下蓝白自锁开关后,电源接通。
通上电时,首先单片机连接电源时,先是1602液晶第一行显示welcometouse的字样,第二行显示real_speed:
0000。
可以按显示每秒速度的按键,也可以按每分钟显示的速度,转动主轴,液晶上就会显示与所按下的控制键相对应得转速。
如果是正转,液晶第二行就会显示real_speed:
xxxx,如果为反转,液晶上就会显示real_speed:
-xxxx。
如果不按控制键液晶第二行就显示real_speed:
六、总结
6.1设计总结
我的课题是基于51单片机的光电编码器测速。
当我选择了这个课题的时候,我就先开始想在平常生活中光电编码器是怎样的,可以怎样测速,需要一些什么器件。
在确定了自己要设计一个怎样的测速系统之后就开始列出做这个测速系统所需要的元器件。
这个光电编码器测速系统是基于给定的显示系统上设计的,所以在设计电路原理图之前,我先要掌握给定的显示系统原理图的连接方式和连接原理。
这一些都弄明白之后,我再考虑如何在现有的基础上进行外围设计使之达到预想的功能。
经过一番斟酌,确定我的外围硬件只需添加两个轻触开关,一些电阻,一块74LS74芯片就可以实现光电编码器测速的功能。
由于我的希望焊得尽量紧凑。
所以为了以后方便焊接,减少焊接错误,需要在洞洞板软件中的画出洞洞板图,设计线路的时候要尽量减少飞线的使用,画完之后和给出的图进行对照,确定我没有连接错误之后,修正洞洞板图,使线路没有断路并且更加笔直,接点处没有连线出头,修正完后保存洞洞板图。
硬件设想好了,接下来,我就要给我所要设计的光电编码器测速系统进行软件设计,使之实现智能化。
进过了几次调试之后,在keil软件中我的程序显示0error。
就开始画DXP原理图,采用网络标号的形式更加方便,只需要把系统分成各个小模块,在元器件的接口上标明该接口所连接单片机的对应的引脚,再分区放置标明模块。
图的大体结构画完之后再和给出的图进行对照,确定我没有连接错误之后,修正DXP原理图,使线路没有断路并且更加笔直。
DXP原理图画完后,整个电路设计就算完成了。
我的设计过程与思路大体就是这样子。
6.2经验总结
我觉得一个课题设计中的心得体会是非常重要的一部分,这是一个经验的积累与总结。
通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
们安排了这次单片机课程设计,给了我们学以致用的做好的实践。
对于这次课程设计,我们花费了比较多的心思,既是对课程理论内容的一次复习和巩固,还让我们丰富了更多与该专业相关的其他知识,比如软件应用等,在摸索中学习,在摸索中成长,在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设而应该让人一看就能明白你的思路,这样也能为资料的保存和交流提供了方便;
我觉得在设计课程过程中遇到问题是很正常,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计又出错了。
此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;
也要有编程语言的汇编语言或C语言。
要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。
七、参考文献
[1]杨长兴、刘卫国.C++程序设计:
中国铁道部出版社
[2]李朝青.单片机原理及接口技术(第三版):
北京航空航天大学出版社
[3]康华光.电子技术基础(第五版):
高等教育出版社
[4]刘坤、赵红波、张宪栋.51单片机C语言运用(第二版):
人民邮电出版社
[5]阎石数字电子计数基础(第五版):
附录
源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbiten=P0^2;
//使能位
sbitrw=P0^1;
//读/写选择位
sbitrs=P0^0;
//数据/命令选择位
sbitfensu=P1^1;
//分速键
sbitmiaosu=P1^2;
//秒速键
floatw;
floata=0;
uchark=2;
//实际正反转标志位
ucharreal_gw,real_sw,real_bw,real_qw,expc_gw,expc_sw,expc_bw;
//设置速度与实际速度的各个四位
ucharnum1,num2;
floatreal;
uintt;
//定时器1中断次数
ucharcodetable1[]="
welcometouse"
;
//显示设定速度
ucharcodetable2[]="
real_speed:
0000"
//显示实际速度
voiddelay(ucharz)
{
ucharx,y;
for(x=100;
x>
0;
x--)
for(y=z;
y>
y--);
}
voidwrite_com(ucharcom)//写命令函数
{
rw=0;
rs=0;
en=0;
P2=com;
delay(5);
en=1;
}
voidwrite_date(uchardate)//写数据函数
rw=0;
rs=1;
P2=date;
voiddisplay(ucharadd,ucharexpc_date)//显示速度
write_com(0x80+add);
//写命令指针指向要写数据的地址
write_date(expc_date);
//写数据
delay(10);
//延时显示
voidinit()
TCON=0X0F;
TMOD=0X15;
EX1=1;
EX0=1;
EA=1;
//开总中断
ET1=1;
//开启T1中断
TR1=1;
//允许T1中断
IP=0X08;
//设置定时器1为优先级
TH0=0;
TL0=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
write_com(0x38);
//显示模式
write_com(0X0c);
//不显示光标
write_com(0X06);
//显示光标移动位置
write_com(0X01);
//清屏
write_com(0X80);
//显示welcometouse
for(num1=0;
num1<
16;
num1++)
{
write_date(table1[num1]);
delay(20);
write_com(0X80+0X40);
//显示real_speed0000
for(num2=0;
num2<
num