测量转速,使用霍尔传感器,被测轴安装有12只磁钢,即转轴每转一周,产生12个脉冲,要求将转速值(转/分)显示在数码管上。
程序如下:
DISPBUFEQU5AH ;显示缓冲区从5AH开始
SecCounEQU59H
SpCounEQU57H;速度计时器单元57H和58H,高位在前(57H单元中)
CountEQU56H;显示时的计数器
SpCalcbit00h;要求计算速度的标志
HiddenEQU16;消隐码
ORG0000H
AJMPSTART
ORG1BH
JMPTIMER1;定时中断1入口
ORG30H
START:MOVSP,#5FH;设置堆栈
MOVP1,#0FFH
MOVP0,#0FFH
MOVP2,#0FFH;初始化,所有显示器、LED灭
MOVTMOD,#00010101B;定时器T1工作于方式1,定时器0工作方式1MOVTH1,#HIGH(65536-4000)
MOVTL1,#LOW(65536-4000)
SETBTR1
SETBET1;开定时器1中断
SETBEA
LOOP:JNBSpCalc,LOOP;如果未要求计算,转本身循环
;标号: MULD 功能:双字节二进制无符号数乘法
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
MOVR2,SpCoun
MOVR3,SpCoun+1
MOVR6,#0
MOVR7,#5;测得的数值是每秒计数值,转为每分转速(每一转测12次,故乘5而非60)
CALLMULD
;标号: HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
MOVA,R4
MOVR6,A
MOVA,R5
MOVR7,A;将乘得的结果送R6R准备转换,这里结果不可能超过2字节
CALLHB2
CBCD:
MOVDISPBUF,R3;最高位
MOVA,R4;
ANLA,#0F0H;去掉低4位
SWAPA;将高4位切换到低4位
MOVDISPBUF+1,A
MOVA,R4
ANLA,#0FH
MOVDISPBUF+2,A
MOVA,R5
ANLA,#0F0H
SWAPA
MOVDISPBUF+3,A
MOVA,R5
ANLA,#0FH
MOVDISPBUF+4,A
CLRSpCalc;清计算标志
JMPLOOP
;主程序到此结束
TIMER1:PUSHACC;ACC入栈
PUSHPSW;PSW入栈
SETBRS0;工作区1
JNBTR0,SETTR0;如果T0未运行,则开启T0
JMPGO1
SETTR0:
SETBTR0
GO1:
INCSecCoun;秒计数器加1
MOVA,SecCoun
CJNEA,#251,Go2;如果未到1s则转
CLRTR0;1s到了,则停止T0的运行
MOVSpCoun,TH0
MOVSpCoun+1,TL0;读取计数值
CLRA
MOVTH0,A
MOVTL0,A;清计数器
SETBSpCalc;要求主程序计算速度
MOVSecCoun,#0;清秒计数器
Go2:
INCCOUNT ;用于显示的计数器
MOVA,COUNT
CLRC
SUBBA,#6
JZN1
JMPN2
N1:MOVCOUNT,#0
N2:MOVA,#DISPBUF
ADDA,COUNT
MOVR0,A;指向当前要显示的显示缓冲区
MOVA,@R0;取第一个待显示数
MOVDPTR,#DISPTAB;字形表首地址
MOVCA,@A+DPTR ;取字形码
MOVP0,A;将字形码送P0位(段口)
MOVA,COUNT
MOVDPTR,#BitTab;字位表首地址
MOVCA,@A+DPTR
ORLP2,#11111100B
ANLP2,A
MOVTH1,#HIGH(65536-4000)
MOVTL1,#LOW(65536-4000)
POPPSW
POPACC
RETI
BitTab:DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
……其他数学运算程序(略)
相关文章