|
程序如下:
; CPU: MEGA48
.equ fosc = 8 ; FOSC=8.0 MHz
.equ t1_all = 125000 ; T1定时的总时间(us)
.equ t1_940us = 940 ; time for pre_Vpp
.equ t1_20us = 20 ; time for emitting
.equ t1_120us = 120 ; time for after_Vpp
.equ t1_end = (t1_all-t1_940us-t1_20us-t1_120us)*fosc
.equ t1_940init= t1_940us*8+16
.equ t1_20init = t1_20us*8-4
.equ t1_120init= t1_120us*8-3
.equ t1_status = 0x0100 ; t1定时的状态
.equ t1_count = 0X0101 ; t1定时5ms的次数
.equ timer1_cnt=25 ; 定时1s的次数
.equ t1_125init = t1_all/timer1_cnt*8-2 ; 初始值
;.def timer1_count=R19
.INCLUDE "m48def.inc"
.ORG $000 ;精确定时产生秒号
STRT25: RJMP RST25
.ORG $00b ;T1 Capture
RJMP T1_OVFB ;4000133=62*65536-63099=62*$10000-$F67B/故TCC=$F67B
.ORG $01b
RST25: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
RCALL T1_initial
LDI R16,0b00001001 ;不分頻
;STS TCCR1A, $00 ; COM1A1/COM1A0/COM1B1/COM1B0/-/-/WGM11/WGM10 (默认值:00H)
STS TCCR1B,R16 ; ICNC1/ICES1/-/WGM13/WGM12/CS12/CS11/CS10
;WGM13, WGM12, WGM11, WGM10 = 0100 -> CTC模式(MAX=OCR0A)
CS12,CS11,CS10 = 001 -> Fosc/1 (无分频,000->T/C停止) ;
SEI ;
HH1B: RJMP HH1B ;等待中断
;************** T/C1 初始化子程序 *******************
T1_initial:
LDI R16, $03
OUT DDRC, R16
LDI R16, $00
OUT PORTC,R16
LDI R16, timer1_cnt ;62次中断定出秒号
MOV R6,R16
LDI R16,$00 ;000->T/C停止
STS TCCR1B,R16 ;
LDI R16,$02 ;
STS TIMSK1,R16 ;允许T/C1的A匹配中断:
LDI R16,$00
STS TCNT1H,R16
STS TCNT1L,R16
LDI R16,HIGH(t1_940init)
STS OCR1AH,R16 ;写入OCR1A高8位
;对于扩展的I/O 空间段0x60 - 0xFF 只能使用ST/STS/STD 和LD/LDS/LDD 指令。
LDI R16,LOW(t1_940init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
LDI R16, $10
STS t1_status, R16 ;T/C1的起始状态: 10
LDI R16, 0b00000010 ;Vpp=1, Vemit=0
OUT PORTC,R16
RET
;*************** 中断服务程序区 ***************************
T1_OVFB:
LDS R16, t1_status
CPI R16, $10
BRNE STATUS_11
STATUS_10:
SBI PORTC, 0
LDI R16,HIGH(t1_20init)
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_20init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
LDI R16, $11
STS t1_status, R16 ;T/C1新的状态:11
RETI
STATUS_11:
CPI R16, $11
BRNE STATUS_01
CBI PORTC, 0
LDI R16,HIGH(t1_120init)
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_120init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
LDI R16, $01
STS t1_status, R16 ;T/C1新的状态:01
RETI
STATUS_01:
CPI R16, $01
BRNE STATUS_00
CBI PORTC, 1
LDI R16,HIGH(t1_125init)
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_125init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
LDI R16, $00
STS t1_status, R16 ;T/C1新的状态:01
RETI
STATUS_00:
LDS R16, t1_count
INC R16
STS t1_count,R16
CPI R16, timer1_cnt
BRNE STATUS_00_NOEND
LDI R16, $00 ; 25*5ms = 125ms
STS t1_count,R16
SBI PORTC, 0
LDI R16,HIGH(t1_940init)
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_940init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
LDI R16, $10
STS t1_status, R16 ;T/C1新的状态:00
RETI
STATUS_00_NOEND:
LDI R16,HIGH(t1_125init)
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_125init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
LDI R16, $00
STS t1_status, R16 ;T/C1新的状态:00
RETI |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|