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

📄 wendu.asm

📁 基于单片机AT89C2051的DS18B20温度采集程序
💻 ASM
字号:
;;;2051 as keybd and disp, 164, clock etc
;;;;;;*****************************************************************
			ORG  0000H;            ;
			     JMP start
			ORG  0003H;            ;
			     reti
			ORG  000BH             ;
			     AJMP INTTMR0   ;
			ORG  0013H
			     reti              ;
			ORG  001BH             ;
			     reti       ;
			ORG  0023H             ;
			     RETI
;**************************************
start:
		MOV R1,#78h       ;
	        MOV  R0,#02H       ;
		CLR A             ; 
CR:             INC R0            ;
		MOV @R0,A         ;
                djnz r1,cr
               	setb p3.5
MAIN:   MOV SP,#70H
	nop
	nop
MS:	MOV 31H,#30
	nop
	nop
	mov 40h,#50h
ss:	nop
	aCALL DISP1
	NOP
	aCALL DELAY
	djnz 40h, ss
       MOV TMOD,#51H;;;?01010001
       MOV 30H, #20
       MOV IE, #82H
       MOV TH0,#3cH
       MOV TL0,#0b0H
       MOV TH1,#00H
       MOV TL1,#00H
       SETB TR0
;;      SETB TR1
S2:     NOP
	NOP
	acall keybd
	aCALL KEY1
	nop
	nop
        ACALL DISP
	nop
	AJMP S2
	NOP
DELAY:  MOV R7,#0aH; time delay
TM:     MOV R6,#0FFH
TM6:    DJNZ R6,TM6
	DJNZ R7,TM
	NOP
	NOP
	RET
	NOP
KEYBD:  clr p3.5
	mov p1,#0ffh
	mov a,#0fh
	mov p1,a
	MOV A,P1
	ANL A,#0FH
	XRL A,#0FH
	JZ KEYRET
	aCALL DELAY
	MOV R2,#0EFH
KEYB2:  MOV A,R2
	MOV P1,A
	MOV A,P1
	MOV R1,A
	ANL A,#0FH
	MOV R3,A
	CJNE A,#0FH,KEYB3
	MOV A,R2
	RL  A
	MOV R2,A
	XRL A,#0FEH
	JNZ KEYB2
	ajmp keyret
KEYB3:  MOV A,R2;  
	anl a,#0f0h
	ORL A,R3;  
	CPL A
	MOV 26H,A; 
	MOV R4,#00H
	MOV DPTR,#KEYTAB
KEYB4:  CLR A
	movc a,@a+dptr
	CJNE A,26H,NEQ
	AJMP EQQ
NEQ:    INC R4
	INC DPTR
	AJMP KEYB4
EQQ:    aCALL DELAY
	MOV A,#0FFH ; 
	MOV P1,A
	MOV A, #0FH
	MOV P1,A
	MOV A,P1
	ANL A,#0FH
	CJNE A,#0FH,EQQ; 
	MOV A,R4; A IS KEY
	MOV 38H,A
	nop
	nop
KEYRET: RET
	nop
	nop
	nop
	nop
KEYTAB: DB 14h,24h,44h,84h,18h,28h,48h,88h,82h,42h,22h,12h,81h,41h,21h,11h
	DB 00H;keytable
	NOP;
	NOP;
;***********************************************************
;	led=>  /   abcdefgh
led_asc:
                db 11111100B;0
                db 01100000B;1
                db 11011010B;2
                db 11110010B;3
                db 01100110B;4
                db 10110110B;5
                db 10111110B;6
                db 11100000B;7
                db 11111110B;8
                db 11110110B;9
                DB   11101110B;a=>A
                DB   00111110B;B=>B
                DB   10011100B;C=>C
                DB   01111010B;D=>D
                DB   10011110B;E=>E
                DB   10001110B;F=>F
                DB   01101110B;H=>10H
                DB   00011100B;L=>11H
                DB   11101100B;N=>12H
                db   00101010b;n=>13h
                db   11111100b;O=>14h
                dB   00111010B;o=>15H
                DB   11001110B;P=>16H
                DB   11100110B;Q=>17H
                DB   00001010B;r=>18H
                DB   10110110B;S=>19H
                DB   01111100B;U=>1AH
                DB   00111000B;u=>1BH
                DB   00000000B;BLACK=>1CH
                DB   11111111B;8.=>1DH
		db   00000010b;-=>1Eh
		db   00011110b;t=>1Fh
                db 11111101B;0.=>20h
                db 01100001B;1.
                db 11011011B;2.
                db 11110011B;3.
                db 01100111B;4.
                db 10110111B;5.
                db 10111111B;6.
                db 11100001B;7.
                db 11111111B;8.
                db 11110111B;9.=>29h
		db 01110110b;y=>2ah ;2001.5.9
		db 'li jie by 2001.6.1'
	;********************
p1_off:		
		;mov a,p1
		;orl a,#7fh
		mov a,#7fh 
		mov p1,a
		ret

	sbuf_out:
		mov sbuf,a
		nop
		nop
		nop
		nop
		ret
;**********************************
DISP:
		setb p3.5
		mov a,#0
		acall p1_off
		acall sbuf_out
		mov dptr,#led_asc
		mov r0,#3eh
	        mov r5,#11011111b; old 01111110b,led0=p1.5
		mov r6,#06
led_bit:
		mov a,@r0
		movc a,@a+dptr
		acall sbuf_out
		mov a,r5
		mov p1,a
;***************************
		mov a,#64h; old 020h
ler1:		dec a
		jnz ler1
;*****************************
		mov a,r5
		rr a
		mov r5,a
		call p1_off
		dec r0
		djnz r6,led_bit
		ret
DISP1:  MOV 39H,#01H 
	MOV 3AH,#02H
	MOV 3BH,#03H
	MOV 3CH,#04H
	MOV 3DH,#05H
	mov 3eh,#06h
	aCALL DISP
	RET
INTTMR0: 
	PUSH PSW; clockint
	PUSH ACC
	setb rs1
	MOV TH0,#3cH
	MOV TL0,#0b0H
        CLR TF0
	DJNZ 30H,RETURN
	MOV  30H,#20
 	MOV  B,32H
	clr c
	mov  a,#01h
	ADD  A,B; second
	DA   A
	MOV  32H,A
	CJNE A,#60h,RETURN11
	MOV  32H,#00H 
	MOV  A,#01H
	ADD  A,33H; minute
	DA  A
	MOV 33H,A
	CJNE A,#60h,RETURN11
	MOV  33H,#00H
	MOV  A,#01H
	ADD  A,34H; hour
	DA  A
	MOV 34H,A
	CJNE A,#24h,RETURN11
	mov 34h,#00h
RETURN11: 
	ACALL NEWBUF
RETURN:	clr  rs1
	POP  ACC
	POP  PSW
	RETI
key1:	MOV A,38H
	MOV DPTR,#JMPTBL
	RL A
	JMP @A+DPTR
JMPTBL: AJMP TSK0
	AJMP TSK0
	AJMP TSK0
	AJMP TSK0
	AJMP TSK0             
	AJMP TSK0
	AJMP TSK0
	AJMP TSK0
	AJMP TSK0
	AJMP TSK0
	AJMP TSK1;;;A
	AJMP TSK2;; B
	AJMP TSK3;;; C
	AJMP TSK4;D
	AJMP TSK5;E
	AJMP TSK6;;;;F
	NOP
	NOP
	NOP

TSK0:   mov a,#1ch
	mov 39h,a
        mov a,#10H
	mov 3ah,a
        mov a,#0EH
	mov 3bh,a
        mov a,#11H
	mov 3ch,a
        mov a,#11H
	mov 3dh,a
        mov a,#14H
	mov 3eh,A
	acall disp
	ret
	NOP
	NOP
TSK1:   SETB EA
	SETB tr0
	ret
	NOP
	NOP
	NOP
	NOP
	NOP
TSK2:   clr tr0
	ret
	NOP
	NOP
TSK3:   
	ACALL NEWBUF
	ret
	NOP
	NOP
	NOP
TSK4:   CLR TR0
        CLR EA
        MOV A,#1CH
        MOV 3AH,A
        MOV 3BH,A
        MOV 3CH,A
        ACALL DS1820
        MOV R4,#0c8H
  DDD:  ACALL DISP
	acall delay
        DJNZ R4,DDD
        ACALL TEMPER_DISP
	ret
	NOP
	NOP
	NOP
TSK5:   CLR TR0
        CLR EA
        ACALL TIMER
        ACALL DISP
        ret
	NOP
	NOP
	NOP
TSK6:   ret
	NOP
	NOP
	NOP
TIMER:
        MOV A,38H
        MOV 39H,A
        MOV 3AH,A
        MOV 3BH,A
        MOV 3CH,A
        MOV 3DH,A
        MOV 3EH,A
        SETB EA
        SETB TR0
        RET
        NOP
        NOP
        NOP
        NOP
;温度传感器ds1820 的汇编程序


;晶振:12M

DS1820:
      TEMPER_L EQU 36H
      TEMPER_H EQU 35H
      TEMPER_NUM EQU 60H
      FLAG1 BIT 00H
      DQ BIT P3.3;;;;;;;2051第7脚
      a_bit equ 3eh
      b_bit equ 3dh
aaa:
      LCALL GET_TEMPER
      LCALL TEMPER_COV
      setb p1.5
      NOP
      ret
;------------------读出转换后的温度值
GET_TEMPER:
      SETB DQ ; 定时入口
   BCD:
      LCALL INIT_1820
      JB FLAG1,S22
      clr dq
      mov 3dh,#09
      mov 3eh,#09
      lcall disp
      LJMP BCD ; 若DS18B20不存在则返回
      ret
   S22:
      LCALL DELAY2
      lcall disp
      MOV A,#0CCH ; 跳过ROM匹配------0CC
      LCALL WRITE_1820
      MOV A,#44H ; 发出温度转换命令
      LCALL WRITE_1820
      NOP
      LCALL DELAY1
      LCALL DELAY1
      lcall disp
   CBA:
      LCALL INIT_1820
      JB FLAG1,ABC
      LJMP CBA
   ABC:
      LCALL DELAY2
      MOV A,#0CCH ; 跳过ROM匹配
      
      LCALL WRITE_1820
      MOV A,#0BEH ; 发出读温度命令
      
      LCALL WRITE_1820
     
      LCALL READ_18200 ;READ_1820
      nop
      nop
      RET
;-------------------写DS18B20的程序
WRITE_1820:
      MOV R2,#8
      CLR C
   WR1:
      CLR DQ
      MOV R3,#6;
      DJNZ R3,$
      RRC A
      MOV DQ,C
      MOV R3,#23;
      DJNZ R3,$
      SETB DQ
      NOP
      DJNZ R2,WR1
      SETB DQ
      RET
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
      MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
      MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
  RE00:
      MOV R2,#8
  RE01:
     CLR C
     SETB DQ
     NOP
     NOP
     CLR DQ
     NOP
     NOP
     NOP
     SETB DQ
     MOV R3,#7;
     DJNZ R3,$
     MOV C,DQ
     MOV R3,#23;
     DJNZ R3,$
     RRC A
     DJNZ R2,RE01
     MOV @R1,A
     DEC R1
     DJNZ R4,RE00
     RET
;-------------------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:

       MOV A, 36H          ;对整数进行处理
       SWAP A
       ANL A,#0FH
       MOV 36H, A 
       MOV A,35H
       MOV B,#16
       MUL AB
       ADD A,36H       ;化为十进制数
       MOV B,#100         
       DIV AB
       MOV R5,B
       MOV 3cH,A    ;百位放3cH单元中
       MOV A,R5
       MOV B,#10
       DIV AB
       MOV 3dH,A      ;十位放3dH单元中
       MOV 3eH,B      ;个位放3eH单元中
       RET
;-------------------DS18B20初始化程序
INIT_1820:
     SETB DQ
     NOP
     CLR DQ
     MOV R1,#6H
   TSR1:
     mov r0,#107
     DJNZ R0,$
     DJNZ R1,TSR1 ; 延时
     SETB DQ
     nop 
     nop
     nop
     MOV R0,#25H ;96US-25H
   TSR2:
     JNB DQ,TSR3
     DJNZ R0,TSR2
     LJMP TSR4 ; 延时
   TSR3:
     SETB FLAG1 ; 置标志位,表示DS1820存在
     mov 39h,#1fh;;;; T
     acall disp
     LJMP TSR5
   TSR4:
     CLR FLAG1 ; 清标志位,表示DS1820不存在
     LJMP TSR7
   TSR5:
     MOV R0,#117 ;200US
   TSR6:
     DJNZ R0,TSR6 ; 延时
   TSR7:
     SETB DQ
     RET
;------------------延时子程序
DELAY1:  MOV R7,#00H
   MIN:  DJNZ R7,YS500
         RET
YS500:   LCALL YS500US
         LJMP MIN
YS500US: MOV R6,#00H
         DJNZ R6,$
         RET
DELAY2:  MOV R7,#20H
         DJNZ R7,$
         RET
temper_disp:
      mov a,36h
      mov b,#10
      div ab
      mov b_bit,a
      mov a_bit,b
      mov a,temper_L
	clr c
	rrc a
      MOV R3,A
      MOV R1,#0
      MOV R2,#0
      ACALL CONV1
      MOV A,R7
      anl a,#0fh
      mov a_bit,a
      mov a,r7
      anl a,#0f0h
      swap a
      mov b_bit,a
      acall disp
      ret
INTR0: 
       reti
;;;;   MOV TH0,#7DH
;;;;   MOV TL0,#0C9H
       DJNZ 20H,RETUNT
       CLR TR1
       MOV 20H,#0AH
       MOV R2,TH1
       MOV R3,TL1
       MOV R1,#00H
       ACALL CONV1
       ACALL DISP
       MOV TH1,#00H
       MOV TL1,#00H
RETUNT:
;;;;;;;SETB TR1
       RETI
CONV1:	MOV B,#24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定点整数二翻十
	CLR A	;;;;;;;;;;;;R1 R2 R3 BINARY
	MOV R5,A;;;;;;;;;;;;R5 R6 R7 DECIMAL
	MOV R6,A
	MOV R7,A
CV1:	CLR C
	ACALL LR0
	MOV A,R7
	ADDC A,R7
	DA A
	MOV R7,A
	MOV A,R6
	ADDC A,R6
	DA A
	MOV R6,A
	MOV A,R5
	ADDC A,R5
	DA A
	MOV R5,A
	DJNZ B,CV1
	RET
LR0:    XCH A,R3
	RLC A
	XCH A,R3
	XCH A,R2	
	RLC A
	XCH A,R2
	XCH A,R1
	RLC A
	XCH A,R1
	RET
NEWBUF:
	MOV A,32H
	MOV R5,A
	ANL A,#0FH
	MOV 3eH,A
	MOV A,R5
	ANL A,#0F0H
	SWAP A
	MOV 3dH,A
      	MOV A,33H
	MOV R5,A
	ANL A,#0FH
	MOV 3cH,A
	MOV A,R5
	ANL A,#0F0H
	SWAP A
	MOV 3bH,A
	MOV A,34H
	MOV R5,A
	ANL A,#0FH
	MOV 3aH,A
	MOV A,R5
	ANL A,#0F0H
	SWAP A
	MOV 39H,A
	RET

        END



⌨️ 快捷键说明

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