Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Противопожарная система


Автор: CNN91 7.12.2011, 20:30
Помогите пожалуйста с написанием программы для обработки сигнала, поступающего на мк8051 с двух датчиков (датчик задымленности и датчик температуры).

Автор: UniBomb 8.12.2011, 08:48
CNN91, ты хочешь, что бы за тебя написали бесплатно или за вознаграждение?

Автор: Mazzi 8.12.2011, 12:18
А что у тебя не получается? Выложи свой код.

Автор: CNN91 8.12.2011, 19:47
  DQ       BIT P3.7 ; 1 wire line
   swpH     equ  0d2H
   swpL     equ  0ffH
   WDLSB    DATA 30H ;
   WDMSB    DATA 31H ;
;***************************************************************
   ORG 0000H
   LJMP MAIN
   ORG 000BH
   LJMP TMR0   ; Timer0 isr

;********************************************************
; Timer0 Interrupt Service Routine
TMR0:    MOV   TH0,#swpH 
         MOV   TL0,#swpL
         JB    21H,DSL
         MOV   P0,42H
         ORL   P0,#00100000B
         SJMP  EXIT
DSL:  
         MOV   P0,43H
         ORL   P0,#00010000B
EXIT: 
         CPL   21H
         RETI

; Main program
MAIN:    
TOINIT: 
         CLR   EA
         MOV   TMOD,#01H
         MOV   TH0,#swpH
         MOV   TL0,#swpL
         SETB  EA
         SETB  ET0
         SETB  TR0

;***********************************************************       
;
         MOV   R2,#2
         MOV   R0,#42H ;
OVER:
         MOV   @R0,#00H; 
         INC   R0
         DJNZ  R2,OVER
   
LOOP: 
         LCALL DSWD ;      
         SJMP  LOOP

;**********************************************************
; Read a temperature from the DS18B20
DSWD:
         LCALL RSTSNR      ; Init of the DS18B20 
         JNB   F0,KEND     
         MOV   R0,#0CCH
         LCALL SEND_BYTE    
         MOV   R0,#44H     
         LCALL SEND_BYTE   ; Send a Convert Command   
         SETB  EA
         MOV   48H,#1      
SS2: 
         MOV   49H,#255
SS1:
         MOV   4AH,#255
SS0: 
         DJNZ  4AH,SS0
         DJNZ  49H,SS1
         DJNZ  48H,SS2
         CLR   EA
         LCALL RSTSNR
         JNB   F0,KEND
         MOV   R0,#0CCH       
         LCALL SEND_BYTE
         MOV   R0,#0BEH         
         LCALL SEND_BYTE      ; Send Read Scratchpad command 
         LCALL READ_BYTE      ; Read the low byte from scratchpad 
         MOV   WDLSB,A        ; Save the temperature (low byte)
         LCALL READ_BYTE      ; Read the high byte from scratchpad
         MOV   WDMSB,A        ; Save the temperature (high byte)
         LCALL TRANS12
KEND:    
         SETB  EA
         RET
;**********************************************************
;
TRANS12:
         MOV   A,30H
         ANL   A,#0F0H
         MOV   3AH,A
         MOV   A,31H
         ANL   A,#0FH
         ORL   A,3AH
         SWAP  A
         MOV   B,#10
         DIV   AB
         ;MOV 42H,A
         MOV   43H,B ;
         MOV   b,#10
         DIV   ab
         MOV   42H,B
         MOV   41H,A
         RET
;*************************************************
; Send a byte to the 1 wire line
SEND_BYTE: ;
         MOV   A,R0
         MOV   R5,#8
SEN3:    CLR   C
         RRC   A
         JC    SEN1
         LCALL WRITE_0
         SJMP  SEN2
SEN1:    LCALL WRITE_1
SEN2:    DJNZ  R5,SEN3 ; 
         RET
;*************************************************
; Read a byte from the 1 wire line
READ_BYTE: 
         MOV   R5,#8
READ1:   LCALL READ
         RRC   A
         DJNZ  R5,READ1 ; 
         MOV   R0,A
         RET
;*************************************************
; Reset 1 wire line
RSTSNR:  SETB  DQ
         NOP
         NOP
         CLR   DQ
         MOV   R6,#250 ;
         DJNZ  R6,$
         MOV   R6,#50
         DJNZ  R6,$
         SETB  DQ ;
         MOV   R6,#15
         DJNZ  R6,$
         CALL  CHCK ;
         MOV   R6,#60
         DJNZ  R6,$
         SETB  DQ
         RET


;*************************************************
; low level subroutines
CHCK:    MOV   C,DQ
         JC    RST0
         SETB  F0 ;
         SJMP  CHCK0
RST0:    CLR   F0 ;
CHCK0:   RET

;*************************************************
WRITE_0: 
         CLR   DQ
         MOV   R6,#30
         DJNZ  R6,$
         SETB  DQ
         RET
;*************************************************
WRITE_1: 
         CLR   DQ 
         NOP
         NOP
         NOP
         NOP
         NOP
         SETB  DQ
         MOV   R6,#30
         DJNZ  R6,$
         RET

;*************************************************
READ:    SETB  DQ ;
         NOP
         NOP
         CLR   DQ
         NOP
         NOP
         SETB  DQ ;
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         MOV   C,DQ
         MOV   R6,#23
         DJNZ  R6,$
         RET

;**********************************************
DELAY10: MOV   R4,#20
D2:      MOV   R5,#30
         DJNZ  R5,$
         DJNZ  R4,D2
         RET

         end


Здесь как я понимаю только с датчика температуры принимаюстя значения и выводятся на дисплей. В этом коде я немного разбираюсь, позже добавлю сравнение температуры. А вот что сделать с датчиком дыма??? Насколько я понимаю он будет посылать на контроллер какой-то единичный импульс а вот как его обработать я не понимаю. 

Автор: daemonaz 25.4.2012, 15:08
Датчик дыма по умолчанию в нормально разомкнутом состоянии, срабатывает на дым и удерживеатся в замкнутом состоянии до момента сброса питания, если используете 1 Wire -шину, то к датчику дыма подключается схема с DS2408, и удаленно им управляешь а также считываешь оттуда состояния входов DS240x.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)