|
红外报警的原理是参照该网站范例,不过,由于我现在用的是汇编,所以只能自己按照的思路编程了!但现在却不能报警!查了几天也没有查出个结果来,搞得很是郁闷!
报警原理:正常情况下,蜂鸣器不响,红色LED不亮,绿色LED亮,当有障碍物时,绿色LED熄灭,红色LED亮起,同时蜂鸣器响十次。之后恢复正常情况。如此循环!
.include"tn2313def.inc"
.list
;*
;************************Register definition***************************
.def temp = r16
.def next_temp = r17
.def save_temp = r18
.def delay_temp = r19
.def move_temp = r20
.def loop_counter = r21
.def comp_temp = r22
.def timer0_temp = r15
.def timer0_counter = r14
;*
;************************I/O ports definition**************************
.equ LED_RED = 0X00 ; PD0
.equ LED_GREEN = 0X01 ; PD1
.equ LED_RED_DDR = DDRD
.equ LED_RED_PORT = PORTD
.equ LED_GREEN_DDR = DDRD
.equ LED_GREEN_PORT = PORTD
.equ IR_RECEIVER = 0X02 ; PD2
.equ IR_TRANSMITTER = 0X04 ; PD4
.equ IR_RECEIVER_DDR = DDRD
.equ IR_RECEIVER_PORT = PORTD
.equ IR_TRANSMITTER_DDR = DDRD
.equ IR_TRANSMITTER_PORT = PORTD
.equ BUZZER = 0X05 ; PD5
.equ BUZZER_DDR = DDRD
.equ BUZZER_PORT = PORTD
.equ INT_INPUT = 0X06 ; PD6
.equ INT0_DDR = DDRD
.equ INT0_PORT = PORTD
;*
;************************program code*******************************************
.org $0000
rjmp reset ; reset port
reti ; external interrupt request 0
reti ; external interrupt request 1
reti ; Timer/counter 1 capture event
reti ; Timer/counter 1 compare match A
reti ; Timer/counter 1 overflow
rjmp timer0_ovf ; Timer/counter 0 overflow
reti ; Usart0, Rx complete
reti ; Usart0 data regrister empty
reti ; Usart0 Tx complete
reti ; analog comparator
reti ; Pin charge interrupt
reti ; Timer/counter 1 compare match B
reti ; Timer/counter 0 compare match A
reti ; Timer/counter 0 compare match B
reti ; USI start condition
reti ; USI overflow
reti ; EEPROM ready
reti ; Watchdog Timer overflow
.org $0014
reset:
ldi temp, low(ramend) ;set stack address
out spl, temp
ser temp
out ddrb, temp
clr temp
out portb, temp ; set pb port as output low level
clr save_temp
ldi move_temp, $ac ; modulate signal code
clt
sbi LED_RED_DDR, LED_RED
cbi LED_RED_PORT, LED_RED ; close the red led
sbi LED_GREEN_DDR, LED_GREEN
sbi LED_GREEN_PORT, LED_GREEN ; open the green led
sbi BUZZER_DDR, BUZZER
cbi BUZZER_PORT, BUZZER ; close the buzzer
cbi IR_RECEIVER_DDR, IR_RECEIVER
sbi IR_RECEIVER_PORT, IR_RECEIVER ; set input high level
sbi IR_TRANSMITTER_DDR, IR_TRANSMITTER
sbi IR_TRANSMITTER_PORT, IR_TRANSMITTER ; set output high level
;*
;*****************************timer 0 set program ******************************
ldi temp, $02
out tccr0b, temp ; one/eight frequency
ldi temp, 244
mov timer0_temp, temp
out tcnt0, timer0_temp ; tcnt0 = 244
ldi temp, $02
out timsk, temp ; toie0 = 1
ldi temp, 43
mov timer0_counter, temp ; timer 0 number
clr r0
clr comp_temp
ldi loop_counter, 9
cbi INT0_DDR, INT_INPUT
sbi INT0_PORT, INT_INPUT
sei ; open the interrupt
;*
;***************************** main program ************************************
ir_receiver_check:
cpi comp_temp, 2
breq ir_receiver_end
brtc ir_receiver_check
clt ; clear sign bit
sbi INT0_PORT, INT_INPUT
sbis pind, INT_INPUT
rjmp ir_receiver_check
ldi delay_temp, $0c ; delay about 850us
rcall delay_time
sbi INT0_PORT, INT_INPUT
sbis pind, INT_INPUT
rjmp set_one_sign
sec
rol save_temp
rjmp move_sign
set_one_sign:
clc
rol save_temp
move_sign:
cpi save_temp, $ac
brne ir_receiver_check
ldi temp, 10
loop_start:
cbi LED_GREEN_PORT, LED_GREEN
sbi LED_RED_PORT, LED_RED
sbi BUZZER_PORT, BUZZER
ldi delay_temp, $48
rcall delay_time
cbi BUZZER_PORT, BUZZER
ldi delay_temp, $48
rcall delay_time
dec temp
brne loop_start
rjmp ir_receiver_check
ir_receiver_end:
clr save_temp
cpi comp_temp, 2
breq ir_receiver_end
rjmp ir_receiver_check
;*
;*****************************delay 500ms program ******************************
delay_time:
push delay_temp
delay2ms_next:
push delay_temp
delay2ms_three:
push delay_temp
delay2ms_four:
push delay_temp
delay2ms_five:
dec delay_temp
brne delay2ms_five
pop delay_temp
dec delay_temp
brne delay2ms_four
pop delay_temp
dec delay_temp
brne delay2ms_three
pop delay_temp
dec delay_temp
brne delay2ms_next
pop delay_temp
ret
;*
;***************************** Timer 0 interrupt program ***********************
timer0_ovf:
in temp, sreg
out tcnt0, timer0_temp ; resume counter initial value
cpi comp_temp, 0
breq carrier_wave_tran ; crrier wave transmitter
rjmp modulate_stop_tran
carrier_wave_tran:
inc r0
sbrs r0, 0
rjmp high_level_timer0
cbi IR_TRANSMITTER_PORT, IR_TRANSMITTER
rjmp next_start
high_level_timer0:
sbi IR_TRANSMITTER_PORT, IR_TRANSMITTER
next_start:
dec timer0_counter
brne end_timer0_reti
set ; set sign bit
lsl move_temp
brcc zero_tran_prepare
cbi IR_TRANSMITTER_PORT, IR_TRANSMITTER
ldi comp_temp, 1
ldi temp, 129 ; timer about 560*3us
mov timer0_counter, temp
dec loop_counter
breq stop_tran_prepare
rjmp end_timer0_reti
zero_tran_prepare:
cbi IR_TRANSMITTER_PORT, IR_TRANSMITTER
ldi comp_temp, 1
ldi temp, 43 ; timer about 560us
mov timer0_counter, temp
dec loop_counter
breq stop_tran_prepare
rjmp end_timer0_reti
stop_tran_prepare:
sbi IR_TRANSMITTER_PORT, IR_TRANSMITTER
ldi move_temp, $ac ; resume modulate code
ldi comp_temp, 2
ldi loop_counter, 9 ; resume counter initial value
ldi temp, 154
mov timer0_counter, temp ;timer about 2ms
rjmp end_timer0_reti
modulate_stop_tran:
dec timer0_counter
brne end_timer0_reti
clr comp_temp
ldi temp, 43
mov timer0_counter, temp
end_timer0_reti:
out sreg, next_temp
reti |
|