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

📄 receiver.a51

📁 一个生物状态监测仪的简单实现
💻 A51
字号:
 INCLUDE REG_51.PDF



BUZZER	EQU	P3.1

D0	EQU	P1.1
D1	EQU	P1.0
D2	EQU	P3.7
D3	EQU	P3.0

VT		EQU	P3.5

; ***LCD CONTROL***
LCD_RS    EQU    P1.7     ;LCD REGISTER SELECT LINE
LCD_E     EQU    P1.6    ;LCD ENABLE LINE
LCD_DB4   EQU    P1.5     ;PORT 1 IS USED FOR DATA
LCD_DB5   EQU    P1.4     ;USED FOR DATA
LCD_DB6   EQU    P1.3    ;FOR DATA
LCD_DB7   EQU    P1.2    ;FOR DATA

; ***CURSOR CONTROL INSTRUCTIONS***

OFFCUR    EQU    0CH
BLINKCUR  EQU    0DH

; ***DISPLAY CONTROL INSTRUCTIONS***

CLRDSP    EQU    01H
ONDSP     EQU    0CH

; ***SYSTEM INSTRUCTIONS***

CONFIG    EQU    28H      ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD
ENTRYMODE EQU    6        ; INCREMENT CURSOR DON'T SHIFT DISPLAY 


DSEG            ; This is internal data memory
ORG     20H     ; Bit adressable memory
TEMPM:		DS	1
FLAGS     DATA   20H
D10	BIT    FLAGS.0
D11   BIT    FLAGS.1
D12   BIT    FLAGS.2
D13   BIT    FLAGS.3
FLAAGS:	DS		1
STATUS	BIT	FLAAGS.2
STATUS1	BIT	FLAAGS.3
VALUE_2:	DS	1
VALUE_3:	DS	1
BEATS:	DS	1
VALU_1:	DS	1
VALU_2:	DS	1

CSEG     AT      0        ; RESET VECTOR
;---------==========----------==========---------=========---------
;              PROCESSOR INTERRUPT AND RESET VECTORS
;---------==========----------==========---------=========---------
 
		ORG     00H    		; Reset
;---------==========----------==========---------=========---------
			MOV SP,#60H
   		CLR BUZZER

   		CALL RESETLCD4
			CALL INITLCD4
			CALL TITLES
			CALL DELAYS

TGH:		CALL READ
			MOV A,FLAGS
			CJNE A,#0DH,TGH
			CALL MDELAY
			
			CALL READ
			CALL MDELAY
			
			CALL READ
			MOV VALUE_2,FLAGS
			CALL MDELAY
				
			CALL READ
			MOV VALUE_3,FLAGS
			CALL MDELAY
			
			CALL READ
			MOV A,FLAGS
			CJNE A,#0EH,TGH
			CALL MDELAY
			
			CALL READ
			MOV VALU_1,FLAGS
			CALL MDELAY
			
			CALL READ
			MOV VALU_2,FLAGS
			CALL MDELAY
			
			CALL READ
			
			
			CALL DISP_TEMP
			MOV A,VALUE_2
			ADD A,#30H
			MOV R4,A
			CALL WRLCDDATA
			CALL MDELAY
			
			MOV A,VALUE_3
			ADD A,#30H
			MOV R4,A
			CALL WRLCDDATA
			CALL MDELAY	
			
			CALL HEART_DISP
			MOV A,VALU_1
			ADD A,#30H
			MOV R4,A
			CALL WRLCDDATA
			CALL MDELAY
			
			MOV A,VALU_2
			CJNE A,#0DH,RTY132
			MOV A,#00H
			MOV VALU_2,A
RTY132:	
			ADD A,#30H
			MOV R4,A
			CALL WRLCDDATA
			CALL MDELAY
			
			
			MOV A,VALUE_2
			SWAP A
			ORL A,VALUE_3
			MOV TEMPM,A
			
			MOV A,VALU_1
			SWAP A
			ORL A,VALU_2
			MOV BEATS,A
			CALL DELAY

			
			CJNE A,#00H,RTY131
			CLR STATUS
			AJMP RTY25
RTY131:	
			MOV A,BEATS
			CLR C
			SUBB A,#80H	
			JNC DOWNS				;JMP IF ABNORMAL
			MOV A,BEATS
			CLR C
			SUBB A,#65H
			JC DOWNS					;JMP IF ABNORMAL
			CLR STATUS
			AJMP RTY25
DOWNS:	SETB STATUS

RTY25:	MOV A,TEMPM
			CLR C
			SUBB A,#40H	
			JNC DOWNSS				;JMP IF ABNORMAL
			MOV A,TEMPM
			CLR C
			SUBB A,#27H
			JC DOWNSS				;JMP IF ABNORMAL
			CLR STATUS1			
			AJMP RTY22
DOWNSS:	SETB STATUS1

RTY22:	JB STATUS,ON_BUZZ
			JB STATUS1,ON_BUZZ
			CLR BUZZER
			AJMP TOPPS
ON_BUZZ: SETB BUZZER
			AJMP TOPPS
			
TOPPS:	
			CALL DELAYS

			
			AJMP TGH
			
;##########################################################
READ:	SETB VT
		JNB VT,$
		MOV FLAGS,#00H
	   SETB D0
		JNB D0,OP1
		SETB D10
OP1:	SETB D1
		JNB D1,OP2
		SETB D11
OP2:	SETB D2
		JNB D2,OP3
		SETB D12
OP3:	SETB D3
		JNB D3,OP4
		SETB D13
OP4:	JB VT,$
		RET		
;##########################################################
;		DISPLAY ROUTINES
;##########################################################
TITLES:
	MOV DPTR,#MSAG
	CALL LCD_MSG
	RET
MSAG:
	DB 1H,81H,'* BIOMEDICAL *',0C1H,'MONITORING SYS',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~		
DISP_TEMP:
	MOV DPTR,#MSAG1
	CALL LCD_MSG
	RET
MSAG1:
	DB 1H,80H,'Temperature:+',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~		
HEART_DISP:
	MOV DPTR,#MSAG2
	CALL LCD_MSG
	RET
MSAG2:
	DB 0C1H,'Heart Beat:',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
DELAYSS:
	   MOV R0,#0BH
RV3: 	MOV R1,#0FFH
RV1:	MOV R2,#0FFH
RV2:	DJNZ R2,RV2
		DJNZ R1,RV1  
		DJNZ R0,RV3  
  		RET
;**************************************************
HEX2BCD: 
		MOV R3,#00D
      MOV R4,#00D
      MOV R5,#00D
      MOV R6,#00D
      MOV R7,#00D
      
		  MOV B,#10D
        MOV A,R2
        DIV AB
        MOV   R3,B              ;   
        MOV   B,#10             ; R7,R6,R5,R4,R3
        DIV   AB
        MOV   R4,B
        MOV   R5,A
        CJNE R1,#0H,HIGH_BYTE   ; CHECK FOR HIGH BYTE
        SJMP ENDD
 
HIGH_BYTE:
			MOV   A,#6
        	ADD   A,R3
			MOV   B,#10
			DIV   AB
        	MOV   R3,B
			ADD   A,#5
        	ADD   A,R4
			MOV   B,#10
			DIV   AB
        	MOV   R4,B
			ADD   A,#2
        	ADD   A,R5
			MOV   B,#10
			DIV   AB
        	MOV   R5,B
        	CJNE R6,#00D,ADD_IT
        	SJMP CONTINUE
ADD_IT:
        	ADD A,R6
CONTINUE:
       	 MOV R6,A
       	 DJNZ R1,HIGH_BYTE
       	 MOV B, #10D
      	 MOV A,R6
       	 DIV AB
       	 MOV R6,B
       	 MOV R7,A
ENDD:  	 RET
; **********************************************************	
; **********************************************************		
;**********************************************************
; INITIALIZE THE LCD 4-BIT MODE                                                                                   
;**********************************************************
INITLCD4:
         CLR         LCD_RS     ; LCD REGISTER SELECT LINE
         CLR         LCD_E      ; ENABLE LINE
         MOV         R4, #CONFIG; FUNCTION SET - DATA BITS,
                                ; LINES, FONTS
         CALL       WRLCDCOM4
         MOV         R4, #ONDSP ; DISPLAY ON
         CALL       WRLCDCOM4
         MOV         R4, #ENTRYMODE ; SET ENTRY MODE
         CALL       WRLCDCOM4  ; INCREMENT CURSOR RIGHT, NO SHIFT
         MOV         R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR
         CALL       WRLCDCOM4
         RET


; **********************************************************
; SOFTWARE VERSION OF THE POWER ON RESET
; **********************************************************
RESETLCD4:
         CLR         LCD_RS     ; LCD REGISTER SELECT LINE
         CLR         LCD_E      ; ENABLE LINE
         CLR         LCD_DB7    ; SET BIT PATTERN FOR...
         CLR         LCD_DB6    ; ... POWER-ON-RESET
         SETB        LCD_DB5
         SETB        LCD_DB4
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #4      ; DELAY 4 MILLISECONDS
         CALL       MDELAY
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         CLR         LCD_DB4    ; SPECIFY 4-BIT OPERATION
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         MOV         R4, #CONFIG; FUNCTION SET
         CALL       WRLCDCOM4
         MOV         R4, #08H   ; DISPLAY OFF
         CALL       WRLCDCOM4
         MOV         R4, #1     ; CLEAR DISPLAY, HOME CURSOR
         CALL       WRLCDCOM4
         MOV         R4,#ENTRYMODE  ; SET ENTRY MODE
         ACALL       WRLCDCOM4
 	   JMP INITLCD4

; **********************************************************
; SUB WRITES A COMMAND WORD TO THE LCD
; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDCOM4:
         CLR         LCD_E
         CLR         LCD_RS     ; SELECT SEND COMMAND
         PUSH        ACC        ; SAVE ACCUMULATOR
         MOV         A, R4      ; PUT DATA BYTE IN ACC
         MOV         C, ACC.4   ; LOAD HIGH NIBBLE ON DATA BUS
         MOV         LCD_DB4, C ; ONE BIT AT A TIME USING...
         MOV         C, ACC.5   ; BIT MOVE OPERATOINS
         MOV         LCD_DB5, C
         MOV         C, ACC.6
         MOV         LCD_DB6, C
         MOV         C, ACC.7
         MOV         LCD_DB7, C
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         MOV         C, ACC.0   ; SIMILARLY, LOAD LOW NIBBLE
         MOV         LCD_DB4, C
         MOV         C, ACC.1
         MOV         LCD_DB5, C
         MOV         C, ACC.2
         MOV         LCD_DB6, C
         MOV         C, ACC.3
         MOV         LCD_DB7, C
         CLR         LCD_E
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         CALL MADELAY
         POP         ACC
         RET
; **********************************************************
; SUB TO WRITE A DATA WORD TO THE LCD
; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDDATA:
         CLR         LCD_E
         SETB        LCD_RS     ; SELECT SEND DATA
             PUSH        ACC        ; SAVE ACCUMULATOR
         MOV         A, R4      ; PUT DATA BYTE IN ACC
         MOV         C, ACC.4   ; LOAD HIGH NIBBLE ON DATA BUS
         MOV         LCD_DB4, C ; ONE BIT AT A TIME USING...
         MOV         C, ACC.5   ; BIT MOVE OPERATOINS
         MOV         LCD_DB5, C
         MOV         C, ACC.6
         MOV         LCD_DB6, C
         MOV         C, ACC.7
         MOV         LCD_DB7, C
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         MOV         C, ACC.0   ; SIMILARLY, LOAD LOW NIBBLE
         MOV         LCD_DB4, C
         MOV         C, ACC.1
         MOV         LCD_DB5, C
         MOV         C, ACC.2
         MOV         LCD_DB6, C
         MOV         C, ACC.3
         MOV         LCD_DB7, C
         CLR         LCD_E
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         NOP
         NOP
         POP         ACC
         RET

; **********************************************************
; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND
; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A
; NULL (0).
; **********************************************************
LCD_MSG:
	CALL MDELAY
	CLR A			; Clear Index 
	MOVC A,@A+DPTR		; Get byte pointed by Dptr 
	INC DPTR			; Point to the next byte 
	JZ LCD_Msg9		; Return if found the zero (end of stringz) 
   CJNE A,#001H,Lcd_Msg1	; Check if is a Clear Command 
	MOV R4,A
	CALL WRLCDCOM4       	;If yes, write it as command to LCD 
	JMP   LCD_MSG          	;Go get next byte from stringz 
                              
Lcd_Msg1: CJNE A,#0FFH,FLL	;Check for displaying full character
	MOV R4,A
	CALL WRLCDDATA
	JMP LCD_MSG
 FLL:	CJNE  A,#080h,$+3      	; Data or Address?  If => 80h then is address. 
	JC    Lcd_Msg_Data     	; Carry will be set if A < 80h (Data) 
	MOV R4,A
	CALL  WRLCDCOM4         ; Carry not set if A=>80, it is address 
	JMP Lcd_Msg          	; Go get next byte from stringz 
                             
Lcd_Msg_Data:                   ; 
	MOV R4,A
	CALL WRLCDDATA        	; It was data, write it to Lcd 
	JMP  Lcd_Msg          		; Go get next byte from stringz 
Lcd_Msg9: 
	
	RET                    	; Return to Caller 



; **********************************************************
; 1 MILLISECOND DELAY ROUTINE
; **********************************************************

MDELAY:
         PUSH        ACC
         MOV         A,#30H
MD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MD_OLP
         NOP
         POP         ACC
         RET
MADELAY:
         PUSH        ACC
         MOV         A,#036H
MAD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MAD_OLP
         NOP
         POP         ACC
         RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;**********************************************************
DELAY:
		MOV R1,#0FFH
REP2:	MOV R2,#0FFH
REP1:	NOP
	DJNZ R2,REP1
	DJNZ R1,REP2
	RET
;**********************************************************		
DELAYS:                       ;One second delay routine
     	MOV R0,#05H
RS3: 	MOV R1,#0FFH
RA1:	MOV R2,#0FFH
RS2:	NOP
		DJNZ R2,RS2
		DJNZ R1,RA1  
		DJNZ R0,RS3  
  		RET
  
  END

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -