Лазерная сигнализация

Схема
  

Лазерные светодиоды распологаяются на стенах комнаты, противоположно им устанавливаются фотоприемники.
Это позволяет определить местонахождение человека в комноте, и отобразить его на матрице светодиодов.


 
Текст программы микроконтроллера
.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.cseg
.org 0
 
.def tmp = r16                        ;временная
.def str = r17                        ;результат проверки фототранзисторов
.def tmp2 = r18                       ;сдвиговая последовательность
.def vd = r19                         ;временная                      
.def n = r20                          ;временная
 
         rjmp RESET
RESET:   ldi tmp,HIGH(RAMEND)         ;определение начала стека
         out SPH,tmp                 ;в ОЗУ
         ldi tmp,LOW(RAMEND)        
         out SPL,tmp
         ser tmp                     ;установить tmp (= $ff)
         out PORTC,tmp                ;установить на всех линиях порта C ВЫСОКИЕ уровни
         out PORTB,tmp                ;установить на всех линиях порта B ВЫСОКИЕ уровни
         out DDRA,tmp                 ;линии порта A - выходы на индикатор
         out DDRD,tmp                 ;линии порта D - выходы на лазерные светодиоды
         out PINB,tmp                 ;эта операция только для отладчика AVR Studio
         out PINC,tmp           
         ldi tmp,15                  ;инициализация сторожевого таймера:
         out WDTCR,tmp                ;при отсутствии команды сброса (wdr)
                                      ;в течение 2 с произойдет переход на прерывание RESET
         clr tmp                     ;очистить регистр tmp (= 0)
         out DDRC,tmp                 ;линии порта C - фототранзисторы
         out PORTA,tmp                ;очистить индикатор
        
         ldi tmp2,0b00000001         ;начальные настройки
         ldi n,1
        
Scan:    wdr                         ;cброс сторожевого таймера 
         ;rcall Wait                 ;задержка
         ;rcall Wait                 ;задержка
         out PORTD,tmp2              ;включение лазерного светодиода
         rcall Foto                  ;проверка фототранзистора
         cpi tmp2,0b10000000         ;проверка достижения мах
         breq m1                     ;если достигнут, переход на m1
             
         lsl tmp2                     ;сдвиг tmp2 влево
         inc n
 
         sbis PINB,PB0               ;если кнопка Stop нажата
    rjmp Stop                        ;перейти на метку Stop
rjmp Scan                             ;переход на метку Scan
m1:
         ;clr tmp
         ;out PORTA,tmp
         ldi tmp2,0b00000001         ;tmp (=1)
         ldi n,1
         clr str
rjmp Scan                             ;переход на метку Scan
 
;=====================================================
;остановка
;=====================================================
Stop:   
         wdr                         ;cброс сторожевого таймера
rjmp Stop                             ;на метку Stop
 
;=====================================================
;проверка фототранзистора
;=====================================================
Foto:    wdr                         ;cброс сторожевого таймера
        
         cpi n,1
         breq x1
         cpi n,2
         breq x2
         cpi n,3
         breq x3
         cpi n,4
         breq x4
         cpi n,5
         breq x5
         cpi n,6
         breq x6
         cpi n,7
         breq x7
         cpi n,8
         breq x8
 
x1:      sbic PINC,PC0              
         add str,tmp2
         rjmp ex
x2:      sbic PINC,PC1              
         add str,tmp2
         rjmp ex
x3:      sbic PINC,PC2              
         add str,tmp2
         rjmp ex
x4:      sbic PINC,PC3              
         add str,tmp2               ;строки в младшую тетраду
         rjmp ex           
x5:      sbic PINC,PC4              
         add str,tmp2
         rjmp ex
x6:      sbic PINC,PC5              
         add str,tmp2
         rjmp ex
x7:      sbic PINC,PC6              
         add str,tmp2
         rjmp ex
x8:      sbic PINC,PC7              
          add str,tmp2
         rjmp ex                                  
ex: 
         rcall ind               ;вывод на индикатор        
ret
 
;=====================================================
;вывод на индикатор (матрица светодиодов)
;=====================================================
ind:
         cpi str,0b11100111
         breq w1
         cpi str,0b11010111
         breq w2
         cpi str,0b10110111
         breq w3
         cpi str,0b01110111
         breq w4
         cpi str,0b11101011
         breq x5
         cpi str,0b11011011
         breq w6
         cpi str,0b10111011
         breq w7
         cpi str,0b01111011
         breq w8
         cpi str,0b11101101
         breq w9
         cpi str,0b11011101
         breq w10
         cpi str,0b10111101
         breq w11
         cpi str,0b01111101
         breq w12
         cpi str,0b11101110
         breq w13
         cpi str,0b11011110
         breq w14
         cpi str,0b10111110
         breq w15
         cpi str,0b01111110
         breq w16
         rjmp ex1
 
w1:      ldi vd,0b11101000
         out PORTA,vd                ;вывод на vd1
         rjmp ex1
w2:      ldi vd,0b11100100
         out PORTA,vd                ;вывод на vd2
         rjmp ex1
w3:      ldi vd,0b11100010
         out PORTA,vd                ;вывод на vd3
         rjmp ex1
w4:      ldi vd,0b11100001
         out PORTA,vd                ;вывод на vd4
         rjmp ex1
w5:      ldi vd,0b11011000
         out PORTA,vd                ;вывод на vd5
         rjmp ex1
w6:      ldi vd,0b11010100
         out PORTA,vd                ;вывод на vd6
         rjmp ex1
w7:      ldi vd,0b11010010
         out PORTA,vd                ;вывод на vd7
         rjmp ex1
w8:      ldi vd,0b11010001
         out PORTA,vd                ;вывод на vd8
         rjmp ex1
w9:      ldi vd,0b10111000
         out PORTA,vd                ;вывод на vd9
         rjmp ex1
w10: ldi vd,0b10110100
         out PORTA,vd                ;вывод на vd10
         rjmp ex1
w11: ldi vd,0b10110010
         out PORTA,vd                ;вывод на vd11
         rjmp ex1
w12: ldi vd,0b10110001
         out PORTA,vd                ;вывод на vd12
         rjmp ex1
w13: ldi vd,0b01111000
         out PORTA,vd                ;вывод на vd13
         rjmp ex1
w14: ldi vd,0b01110100
         out PORTA,vd                ;вывод на vd14
         rjmp ex1
w15: ldi vd,0b01110010
         out PORTA,vd                ;вывод на vd15
         rjmp ex1
w16: ldi vd,0b01110001
         out PORTA,vd                ;вывод на vd16
         rjmp ex1
ex1:
ret
 
;=====================================================
;Подпрограмма задержки
;=====================================================
Wait:  ldi YL,low(1000)
       ldi YH,high(1000)
d05:   wdr                            ;cброс сторожевого таймера
       sbiw YL,1
       brne d05
ret
 
Скачать файлы проекта для AVR Studio 4 (7,23 КБ)