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

📄 temp.asm

📁 基于C51搭建的温度控制系统的程序
💻 ASM
字号:
weixuan	  EQU 8FFFH
shi       EQU 31H
gew       EQU 32H
keys      equ 33H ;定义键值寄存器
y_t       EQU 34h ;实际测得的温度值
x_t       EQU 35h ;设定的温度值
bus       equ 3eh ;2
T2SC      EQU 40H ;2 
n_tep     equ 4bh ;7
C100US    equ 4ch ;2
T100US	  EQU 156     ;100微秒的初值
T2S       EQU 18432
T1S       EQU 9216
T0S       equ 4608
T0D       EQU 13824
TS        equ 2304
TSD       equ 16128 
keystate   bit 00h;定义键状态寄存位,有键时为1,无键时为0
mark1      bit 01h
mark2      bit 02h
mark3      bit 03h
sclk       bit p1.2
dio        bit p1.3
cs_1549    bit p1.4 
OUT        BIT P1.6

           ORG 0000H
           LJMP MAIN
           ORG 000BH         ;定时器0的入口地址
           LJMP T0INT
           ORG 001BH
           LJMP T1INT        ;定时器1的入口地址                   
           ORG 0030H
MAIN: 
          mov   sp,55h
 	  mov   shi,#0
          mov   gew ,#0
	  CLR   keystate
          clr   mark1
	  clr   mark2
	  clr   mark3
	  mov   x_t,#00h
	  mov   y_t,#00h
	  MOV   bus,#0
          MOV   TMOD,#22H	 ;定时器0工作于方式2,定时器1工作于方式2
          MOV   TH0,#T100US		 ;载入初值
          MOV   TL0,#T100US
	  MOV   T2SC,#LOW(T2S)
	  MOV   T2SC+1,#HIGH(T2S)
          MOV   TH1,#T100US		 ;载入初值
          MOV   TL1,#T100US
	  MOV   IE,#10001010B

          MOV   DPTR, #0A000H   ;初始化
	  mov   r7,#5
	  mov   r6,#00h
ss0:      mov   a,r6
	  ACALL F_BUSY
          lcall chabiao0
	  MOVX  @DPTR,A
	  inc   r6
          djnz  r7,ss0

	  MOV   DPTR, #0A002H  ;显示提示信息1
	  mov   r7,#4
	  mov   r6,#00h
ss1:      mov   a,r6
	  ACALL F_BUSY
          lcall chabiao1
	  MOVX  @DPTR,A
	  inc   r6
          djnz  r7,ss1

 
   
	  ACALL F_BUSY
	  MOV   DPTR, #0A000H
	  mov   a,#0c0h   ;显示位置 
	  MOVX  @DPTR,A     

	  MOV  DPTR, #0A002H   ;显示提示信息2
	  mov   r7,#4
	  mov   r6,#04h
ss2:      mov   a,r6
	  ACALL F_BUSY
          lcall chabiao1
	  MOVX  @DPTR,A
	  inc   r6
          djnz  r7,ss2 
	  
	  SETB  TR0
start:   
          ACALL F_BUSY
	  MOV   DPTR, #0A000H
	  mov   a,#89h   ;显示位置 
	  MOVX  @DPTR,A

	  MOV  DPTR, #0A002H
	  ACALL F_BUSY
	  MOV  A,#0dfh   ;送数据
	  MOVX @DPTR,A

	  ACALL F_BUSY
	  MOV  A,#43h   ;送数据
	  MOVX @DPTR,A  

	  ACALL F_BUSY
	  MOV  A,#20h   ;送数据
	  MOVX @DPTR,A 

	  ACALL F_BUSY
	  MOV  A,#20h   ;送数据
	  MOVX @DPTR,A    

	  ACALL F_BUSY
	  MOV   DPTR, #0A000H
	  mov   a,#0c4h   ;显示位置 
	  MOVX  @DPTR,A
	  
	  MOV  DPTR, #0A002H
	  ACALL F_BUSY
          mov a,shi
          lcall chabiao
	  MOVX @DPTR,A          
 
	  ACALL F_BUSY
          mov a,gew
          lcall chabiao
	  MOVX @DPTR,A
        
	  ACALL F_BUSY
	  MOV  A,#0dfh   ;送数据
	  MOVX @DPTR,A

	  ACALL F_BUSY
	  MOV  A,#43h   ;送数据
	  MOVX @DPTR,A  

	  lcall key
	  lcall dokey
start_end:ljmp start
;查表子程序
chabiao0:
        PUSH  DPH
        PUSH  DPL
        mov dptr,#TABLE0
        movc a,@a+dptr
        POP   DPL
        POP   DPH
        RET
chabiao1:
        PUSH  DPH
        PUSH  DPL
        mov dptr,#TABLE1
        movc a,@a+dptr
        POP   DPL
        POP   DPH
        RET
chabiao:PUSH  DPH
        PUSH  DPL
        mov dptr,#TABLE
        movc a,@a+dptr
        POP   DPL
        POP   DPH
        RET
;定义查找表
TABLE0: db 01h,38h,0ch,06h,80h 
TABLE1: db 43h,55h,52h,3ah,50h,52h,45h,3ah
TABLE:  db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
PWTAB:  DB 10H, 27H ;10000
        DB 0E8H,03H ;1000
        DB 64H, 00H ;100
        DB 0AH, 00H ;10 
;判断忙信号
F_BUSY:
        PUSH  DPH
        PUSH  DPL
	push  acc
WAIT:  
        MOV   DPTR, #0A001H
	movx   a,@DPTR
        JB    ACC.7,WAIT
	pop   acc
        POP   DPL
        POP   DPH
        RET 
;延迟程序 
DELAY: 	MOV 	R7,#100
DE:  	MOV     R6,#200 
D2:     DJNZ    R6,D2
        DJNZ	R7,DE
        RET 
;ad
atod:
        mov r1,#00h
	mov r2,#00h
        lcall  a_d
	lcall delay1
	mov r1,#00h
	mov r2,#00h
	lcall a_d
	lcall trans

	mov a,n_tep-4
	mov n_tep-5,a
	mov n_tep-4,#2eh

	mov a,n_tep-1
	mov b,#100
	mul ab
        mov bus,a
	mov a,n_tep-2
	mov b,#10
	mul ab
	add a,bus
	add a,n_tep-3
	mov y_t,a
atod_end:ret
a_d:    mov r3,#10
again:	clr sclk
        clr cs_1549
        mov c,dio
	mov a,r2
	rlc a
	mov r2,a
	mov a,r1
	rlc a
	mov r1,a
	setb sclk
	clr sclk
        djnz r3,again
	setb cs_1549
	ret
delay1:
        mov r4,#8
non:    nop
        djnz r4,non
        ret
trans:
      PUSH  DPH
      PUSH  DPL
      mov  a,r1
      MOV  R3,a
BBCD: MOV  R0,#n_tep
      MOV  R7,#04H
      MOV  DPTR,#PWTAB
      MOV  R6,#00H
BBC1: MOV  A,R6
      MOVC A,@A+DPTR
      MOV  R4,A
      INC  R6
      MOV  A,R6
      MOVC  A,@A+DPTR
      MOV  R5,A
      INC  R6
      MOV  @R0,#00H
BBC2: CLR  C
      MOV  A,R2
      SUBB A,R4
      MOV  R2,A
      MOV  A,R3
      SUBB A,R5
      MOV  R3,A
      JC   BBC3
      INC  @R0
      lJMP BBC2
BBC3: MOV  A,R2
      ADD  A,R4
      MOV  R2,A
      MOV  A,R3
      ADDC A,R5
      MOV  R3,A
      DEC  R0
      DJNZ R7,BBC1
      MOV  A,R2
      MOV  @R0,A  
      POP   DPL
      POP   DPH
      ret 
xian:
          PUSH DPH
          PUSH DPL

	  ACALL F_BUSY
	  MOV   DPTR, #0A000H
	  mov   a,#84h   ;显示位置 
	  MOVX  @DPTR,A

	  MOV  DPTR, #0A002H
	  ACALL F_BUSY
          mov  a,n_tep-1
	  lcall chabiao
          MOVX @DPTR,A

	  ACALL F_BUSY     
	  mov a,n_tep-2
	  lcall chabiao
	  MOVX @DPTR,A

	  ACALL F_BUSY
	  mov a,n_tep-3
	  lcall chabiao
	  MOVX @DPTR,A

	  ACALL F_BUSY
	  mov a,n_tep-4
	  MOVX @DPTR,A

	  ACALL F_BUSY
	  mov a,n_tep-5
	  lcall chabiao
	  MOVX @DPTR,A        

  	  POP DPL
          POP DPH	
ret  
kongzhi:
         clr TR1 
         PUSH DPH
         PUSH DPL     
         mov a,shi
	 mov b,#10
 	 mul ab
	 add a,gew
         mov x_t,a  
;	 mov a,x_t
	 clr c
	 subb a,y_t
	 mov  bus,a
	 jc  nok
         jz  nok
	 clr c
	 subb a,#10
	 jc   k1
	 jz   k1
	 MOV  C100US,#LOW(T2S)
	 MOV  C100US+1,#HIGH(T2S)
	 SETB OUT
	 jmp  kongzhi_end

k1:      clr c
         mov a,bus
	 subb a,#5 
	 jc   k2
	 jz   k2
         MOV  C100US,#LOW(T1S)
	 MOV  C100US+1,#HIGH(T1S)
	 SETB OUT
	 setb TR1
	 setb mark1
         jmp  kongzhi_end

k2:      clr  c
	 mov  a,bus
	 subb a,#2
	 jc   k3
         jz   k3
	 MOV  C100US,#LOW(T0S)
	 MOV  C100US+1,#HIGH(T0S)
	 SETB OUT
	 setb TR1
	 setb mark2
         jmp  kongzhi_end

k3:      clr  c
	 mov  a,bus
	 subb a,#1
	 jc   nok
         jz   nok
	 MOV  C100US,#LOW(TS)
	 MOV  C100US+1,#HIGH(TS)
	 SETB OUT
	 setb TR1
	 setb mark3
         jmp  kongzhi_end
nok:     clr  out 
kongzhi_end:
          POP DPL
          POP DPH
          ret
;中断0处理子程序
T0INT:	
	clr  TR0
        PUSH PSW
	PUSH ACC
        PUSH DPH
        PUSH DPL
        MOV A,T2SC
	JNZ GOON0
	DEC T2SC+1
GOON0:       
        DEC T2SC
	MOV A,T2SC+1
	ORL A,T2SC
	JNZ EXIT0
	LCALL atod
	lcall xian
	lcall kongzhi
	MOV T2SC+1,#HIGH(T2S)
	MOV T2SC,#LOW(T2S)
;退出中断0
EXIT0:
	SETB TR0
        POP DPL
        POP DPH	
        POP ACC
	POP PSW
	RETI
;中断1处理子程序
T1INT:	
        PUSH PSW
	PUSH ACC
        PUSH DPH
        PUSH DPL  
        MOV A,C100US
	JNZ GOON1
	DEC C100US+1
GOON1:       
        DEC C100US
	MOV A,C100US+1
	ORL A,C100US
	JNZ EXIT

	jnb  mark1,mm1
        MOV  C100US,#LOW(T1S)
	MOV  C100US+1,#HIGH(T1S)
	jmp  next
mm1:    jnb  mark2,mm2 
        MOV  C100US,#LOW(T0D)
	MOV  C100US+1,#HIGH(T0D)
        jmp  next
mm2:    jnb  mark3,next
        MOV  C100US,#LOW(TSD)
	MOV  C100US+1,#HIGH(TSD)
next:   clr  out
;退出中断1
EXIT:
        POP DPL
        POP DPH		
        POP ACC
	POP PSW
	RETI            
;键盘子程序:
KEY:  lcall  keytest
      jnb    keystate,keyend
      lcall  delay
      lcall  delay	
      lcall  keytest
      jnb    keystate,keyend
;读取键盘的值
                MOV    a,#01h
		mov    dptr,#weixuan
		movx   @dptr,a
		movx   a,@dptr
		anl    a,#0fh
key0: cjne   a,#01h,key1
		mov    keys,#00h
		setb   keystate
		ajmp   keyend
key1: cjne   a,#02h,key2
		mov    keys,#01h
		setb   keystate
		ajmp   keyend
key2: cjne   a,#04h,keynext1
		mov    keys,#02h
		setb   keystate
		ajmp   keyend
keynext1:clr   keystate		
keyend:  ret			
;键盘测试程序,返回结果在keystate中
keytest:
        mov   a,#0ffh
        MOV   dptr,#weixuan
	MOVX  @dptr,a
	MOVX  a,@dptr
	anl   a,#0fh
	jz    keytest0
	setb  keystate
	jmp   keytest1
keytest0: clr   keystate
keytest1: ret
;键盘处理子程序
dokey:   jnb      keystate,keyend1
         mov	  a,keys
key_0:   cjne     a,#00h,key_1
         ajmp     key00
key_1:   cjne	  a,#01h,key_2
	 ajmp     key11
key_2:	 cjne	  a,#02h,keyend1
	 ajmp     key22
;执行相应的动作
key00:   lcall    jin_start
         ajmp     keyend1
key11:   lcall    shi_add1
         ajmp     keyend1
key22:   lcall    ge_add1
         ajmp     keyend1
keyend1: ret
;判断键盘是否弹起
keyup:
scan:    lcall  keytest
         lcall  delay
         jb    keystate,scan
ret       
;键盘响
xiang:   clr  p1.6
         lcall delay
         lcall delay 
	 setb p1.6       
ret 
;开始进行温度控制   
jin_start:
         lcall keyup
	 lcall xiang
	 dec shi
	 mov a,shi
	 cjne a,#0,start_end1
	 mov shi,#9
start_end1:
         ret                
;十位值设定
shi_add1:
         lcall keyup
	 lcall xiang
         inc shi
	 mov a,shi
	 cjne a,#10,shi_add1_end
	 mov shi,#0
shi_add1_end:ret
;个位值设定
ge_add1:
         lcall keyup
	 lcall xiang
         inc gew
	 mov a,gew
	 cjne a,#10,ge_add1_end
	 mov gew,#0
ge_add1_end:ret    
END

⌨️ 快捷键说明

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