⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 测转速.asm

📁 测转速,信号从AT90S8515的ICP引脚输入,最大值为为999999转/分
💻 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 + -