一。上图所示是测速器的电路图,由六位数码管和测速接口组成。
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. 来源:阴雨