📄 测转速.asm
字号:
; 测转速,信号从AT90S8515的ICP引脚输入,最大值为为999999转/分
.include"8515def.inc"
rjmp reset
.def temp = r16 ;暂存器
.def aa = r17
.def cnt = r18
.def mc16l = r19 ;mc16l和mc16h存放脉冲个数
.def mc16h = r20
.def mp8u = r21 ;mp8u=30,因为是每2秒采样
.def res1 = r21 ;res1、res2和res3存放结果的十六进制
.def res2 = r22
.def res3 = r23
.def count = r24
.def cnt1d = r25 ;cnt1、dcnt2d和cnt3d存放结果的十进制
.def cnt2d = r26
.def cnt3d = r27
.def dt = r28
.def dt1 = r29
.org 0x003 ;icp触发中断向量
icpt1:
rjmp captr
.org 0x008
rjmp interru
.cseg
.org 0x010
captr: ;icp触发中断子程序
brts down
ldi temp, 0b00000101
out tccr0, temp ;开timer0
ldi temp, 0b00001010
out timsk, temp ;致timer0中断和捕捉中断
ldi temp, 0b10000000
out tccr1b,temp
set
reti
down: ;下降沿开始计数
set
inc mc16l
brne b
inc mc16h
cpse mc16h, dt1 ;溢出处理
rjmp b
ldi mc16h, 00
ldi mc16l, 00
rjmp over
b:
ldi temp, 0b00001010 ;致timer0中断和捕捉中断
out timsk, temp
ldi temp, 0b10000000
out tccr1b,temp
reti
interru: ;timer0溢出中断子程序
dec cnt
breq over
ldi temp, 0b00001010
out timsk, temp
reti
over:
rcall conver ;conver:计算结果子程序
rcall htd3 ;htd3:
rcall sys
reti
reset:
ldi temp, low(ramend)
out spl, temp
ldi temp, high(ramend) ;设置堆栈
out spl+1, temp
ldi temp, $ff ;初始化数码管状态
out ddrb, temp ;B口:数码管数据输出
out ddrd, temp ;D口:pd0-pd5为数码管片选
ldi temp, $00
out portb, temp ;共阴极,数码管全灭
out portd, temp
ldi cnt1d, 00
ldi cnt2d, 00
ldi cnt3d, 00
sei
rcall sys
loop: ;在数码管显出十进制数
mov aa, cnt1d
andi aa, $0f ;显示个位
rcall a
cbi portd, 00
nop
sbi portd, 00
mov aa, cnt1d
andi aa, $f0 ;显示十位
swap aa
rcall a
cbi portd, 01
nop
sbi portd, 01
mov aa, cnt2d
andi aa, $0f ;显示百位
rcall a
cbi portd, 02
nop
sbi portd, 02
mov aa, cnt2d
andi aa, $f0 ;显示千位
swap aa
rcall a
cbi portd, 03
nop
sbi portd, 03
mov aa, cnt3d
andi aa, $0f ;显示万位
rcall a
cbi portd, 04
nop
sbi portd, 04
mov aa, cnt3d
andi aa, $f0 ;显示十万位
swap aa
rcall a
cbi portd, 05
nop
sbi portd, 05
sbrc dt, 0
ret
rjmp loop
sys: ;初始化
clc
clt
ldi dt1, $81
ldi dt, 00
ldi mc16l, 00
ldi mc16h, 00
ldi cnt, 62
ldi mp8u, 30
ldi temp, 247
out tcnt0, temp
ldi temp, 00
out tccr1a,temp
out tccr0, temp
ldi temp, 0b00001010
out timsk, temp
ldi temp, 0b11000000
out tccr1b,temp
ret
htd3: ;16转10子程序
sbr dt, 1
ldi count, 24
clr cnt1d
clr cnt2d
clr cnt3d
loopd:
rol res1
rol res2
rol res3
rol cnt1d
rol cnt2d
rol cnt3d
dec count
brne c
rjmp loop
c:
rcall adjn
rjmp loopd
a:
ldi zh, high(zk*2)
ldi zl, low(zk*2)
add zl, aa
lpm
out portb, r0
ret
adjn:
push count
mov count, cnt1d
rcall adjd1
mov cnt1d, count
mov count, cnt2d
rcall adjd1
mov cnt2d, count
mov count, cnt3d
rcall adjd1
mov cnt3d, count
pop count
ret
adjd1:
ldi temp, 3
add temp, count
sbrc temp, 3
mov count, temp
ldi temp, $30
add temp, count
sbrc temp, 7
mov count, temp
ret
conver: ;计算结果子程序
clr res3
clr res2
ldi cnt, 8
lsr mp8u
m16_1:
brcc m16_2
add res2, mc16l
adc res3, mc16h
m16_2:
ror res3
ror res2
ror res1
dec cnt
brne m16_1
ret
.equ zk=0x0200
.org zk ;字形表
.db 0x03f,0x006,0x05b,0x04f
.db 0x066,0x06d,0x07d,0x007
.db 0x07f,0x06f,0x077,0x07c
.db 0x039,0x05e,0x071
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -