基于单片机AT89S51制作的测速表电路图

2013-10-29 13:57:00
  •   一。上图所示是测速器的电路图,由六位数码管和测速接口组成。  1.测速的方法决定了测速信号的硬件连接,测速实际上就是测频,因此,频率测量的一些原则同样适用于测速。  2.通常,可以用计数法、测脉宽法和等精度法来进行测试。所谓计数法,就是给定一个闸门时间,在闸

一。上图所示是测速器的电路图,由六位数码管和测速接口组成。

1.测速的方法决定了测速信号的硬件连接,测速实际上就是测频,因此,频率测量的一些原则同样适用于测速。

2.通常,可以用计数法、测脉宽法和等精度法来进行测试。所谓计数法,就是给定一个闸门时间,在闸门时间内计数输入的脉冲个数;测脉宽法是利用待测信号的脉宽来控制计数门,对一个高精度的高频计数信号进行计数。由于闸门与被测信号不能同步,因此,这两种方法都存在±1误差的问题,第一种方法适用于信号频率高时使用,第二种方法则在信号频率低时使用。等精度法则对高、低频信号都有很好的适应性。这里为简化讨论,仅采用计数法来进行测试。

二。软件编程

测量转速,使用霍尔传感器,被测轴安装有12只磁钢,即转轴每转一周,产生12个脉冲,要求将转速值(转/分)显示在数码管上。

程序如下:

dispbuf equ 5ah ;显示缓冲区从5ah开始[page]

seccoun equ 59h

spcoun equ 57h ;速度计时器单元57h和58h,高位在前(57h单元中)

count equ 56h ;显示时的计数器

spcalc bit 00h ;要求计算速度的标志

hidden equ 16 ;消隐码

g 0000h

ajmp start

g 1bh

jmp timer1 ;定时中断1入口

g 30h

start: mov sp,#5fh ;设置堆栈

mov p1,#0ffh

mov p0,#0ffh

mov p2,#0ffh ;初始化,所有显示器、led灭

mov tmod,#00010101b ;定时器t1工作于方式1,定时器0工作方式1 mov th1,#high(65536-4000)

mov tl1,#low(65536-4000)

setb tr1

setb et1 ;开定时器1中断

setb ea

loop: jnb spcalc,loop ;如果未要求计算,转本身循环

标号: muld功能:双字节二进制无符号数乘法

入口条件:被乘数在r2、r3中,乘数在r6、r7中。

出口信息:乘积在r2、r3、r4、r5中。

影响资源:psw、a、b、r2~r7

堆栈需求: 2字节

mov r2,spcoun

mov r3,spcoun+1

mov r6,#0

mov r7,#5 ;测得的数值是每秒计数值,转为每分转速(每一转测12次,故乘5而非60)

call muld

标号: hb2 功能:双字节十六进制整数转换成双字节bcd码整数

入口条件:待转换的双字节十六进制整数在r6、r7中。

出口信息:转换后的三字节bcd码整数在r3、r4、r5中。

影响资源:psw、a、r2~r7 堆栈需求: 2字节

mov a,r4

mov r6,a

mov a,r5

mov r7,a ;将乘得的结果送r6r准备转换,这里结果不可能超过2字节

call hb2

cbcd:

mov dispbuf,r3 ;最高位

mov a,r4 ;

anl a,#0f0h ;去掉低4位

swap a ;将高4位切换到低4位

mov dispbuf+1,a

mov a,r4

anl a,#0fh

mov dispbuf+2,a

mov a,r5

anl a,#0f0h

swap a

mov dispbuf+3,a

mov a,r5

anl a,#0fh

mov dispbuf+4,a

clr spcalc ;清计算标志

jmp loop

主程序到此结束

timer1: push acc;acc入栈

push psw ;psw入栈

setb rs0 ;工作区1

jnb tr0,settr0 ;如果t0未运行,则开启t0

jmp go1

settr0:

setb tr0

go1:

inc seccoun ;秒计数器加1

mov a,seccoun

cjne a,#251,go2 ;如果未到1s则转

clr tr0 ;1s到了,则停止t0的运行

mov spcoun,th0

mov spcoun+1,tl0 ;读取计数值

clr a

mov th0,a

mov tl0,a ;清计数器

setb spcalc ;要求主程序计算速度

mov seccoun,#0 ;清秒计数器

go2:

inc count ;用于显示的计数器

mov a,count

clr c

subb a,#6

jz n1

jmp n2

n1: mov count,#0

n2: mov a,#dispbuf

add a,count

mov r0,a ;指向当前要显示的显示缓冲区

mov a,@r0 ;取第一个待显示数

mov dptr,#disptab ;字形表首地址

movc a,@a+dptr ;取字形码

mov p0,a ;将字形码送p0位(段口)

mov a,count

mov dptr,#bittab ;字位表首地址

movc a,@a+dptr

l p2,#11111100b

anl p2,a

mov th1,#high(65536-4000)

mov tl1,#low(65536-4000)

pop psw

pop acc

reti

bittab: db 7fh,0bfh,0dfh,0efh,0f7h,0fbh disptab:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh,0ffh

三。程序分析

主程序在对定时器、计数器、堆栈等进行初始化后即判断标志spcalc是否为1,如果为1,说明要求对数据进行计算处理,首先将spcalc标志清零,以保证下次能正常判断,然后进入数据处理程序,由于这里的闸门时间为1s,而显示要求为转/分,因此,要将测到的数据进行转换,转换的方法是将测得的数据乘以60,但由于转轴上安装有12只磁钢,每旋转一周可以得到12个脉冲,因此,要将测得的数据除以12,所以综合起来,将测得的数据乘以5即可得到每分钟的转速。计算得到的结果是二进制的整数,要将数据送往显示缓冲区需要将该数转化为bcd码。运算得到的是压缩bcd码,需要将其转换为非压缩bcd码,从标号cbcd开始的一段程序即作了这样的处理。需要说明的是,这里多位二进制乘法和多位二进制到bcd码的转换都是用了现成的成熟子程序,因此,首先将二进制数转换为压结合实际bcd码,然后再转换成非压缩bcd码。定时器t1用作4ms定时发生器,在定时中断程序中进行数码管的动态扫描,同时产生1s的闸门信号。1s闸门信号的产生是通过一个计数器count,每次中断时间为4ms,每计250次即为1s,到了1s后,即清除计数器count,然后关闭作为计数器用的t0,读出th0、tl0中的数值,分别送入spcoun和spcoun+1单元,将t0中的值清空,置spcalc标志为1,要求主程序进行速度值的计算。这里还有一个细节,用作1s闸门信号产生的count每次中断都会加1,而t0却有一个周期是被关闭的,因此,计数值是251而不是250. 来源:阴雨