?? 測轉速.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 + -