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

📄 abc.asm

📁 温度测量系统设计: 温度最小分辨率为0.5度; 显示范围为零下10度至零上50度; 用LED显示当前温度值; 可通过键盘设定温度上、下限
💻 ASM
字号:
  TEMPDATA EQU 30H
  TEMPSTORE EQU 32H
  COMNUM EQU 38H
  HLIMIT EQU 40H
  LLIMIT EQU 48H
  FLAG BIT PSW.5
  
  DQ BIT P2.4
  WARNING BIT P2.3

  SDATA_5950 EQU P0.0 ;串行数据输入
  SDATA_5951 EQU P0.1
  SDATA_5952 EQU P0.2
  SDATA_5953 EQU P0.3

  SCLK_595 EQU P2.2 ;移位时钟脉冲

  RCK_5950 EQU P0.4 ;输出锁存器控制脉冲
  RCK_5951 EQU P0.5
  RCK_5952 EQU P0.6
  RCK_5953 EQU P0.7

 

  ORG  0000H
  AJMP  MAIN
  ORG  0003H
  CLR  EA
  MOV  R7,#1
  LCALL  LIMIT
  RETI
  ORG  0013H
  CLR  EA
  MOV  R7,#0
  LCALL  LIMIT
  RETI

  ORG  0030H
MAIN:
  SETB  EX0
  SETB  EX1
  SETB  IT0
  SETB  IT1
  MOV  R0,#HLIMIT
  MOV  @R0,#0
  INC  R0
  MOV  @R0,#5
  INC  R0
  MOV  @R0,#0
  INC  R0
  MOV  @R0,#0
  MOV  R0,#LLIMIT
  MOV  @R0,#1
  INC  R0
  MOV  @R0,#1
  INC  R0
  MOV  @R0,#0
  INC  R0
  MOV  @R0,#0
START:
  CLR  EA
 
  LCALL  TEMPER
  LCALL  DATASTORE
  LCALL  DISPLAY
  LCALL  COMPARE
  SETB  EA
  AJMP  START

TEMPER:
  LCALL  RESET
  JNB  FLAG,TEMPER
  MOV  A,#0CCH
  LCALL  WR1820
  MOV  A,#44H
  LCALL  WR1820
  LCALL  DELAY2S
  LCALL  RESET
  JNB  FLAG,TEMPER
  MOV  A,#0CCH
  LCALL  WR1820
  MOV  A,#0BEH
  LCALL  WR1820
  LCALL  RD1820
  RET

RESET:
  CLR  DQ
  MOV  R7,#250
  DJNZ  R7,$
  SETB  DQ
  MOV  R7,#30
  DJNZ  R7,$
  CLR  FLAG
  JB  DQ,RESETBACK
  SETB  FLAG
  MOV  R7,#210
  DJNZ  R7,$
  SETB  DQ
RESETBACK:
  RET

RD1820:
  MOV  R1,#2
  MOV  R0,#TEMPDATA
RDBYTE:
  MOV  R2,#8
RDBIT:
  CLR  DQ
  NOP
  NOP
  SETB  DQ
  NOP
  MOV  C,DQ
  RRC  A
  MOV  R7,#30
  DJNZ  R7,$
  DJNZ  R2,RDBIT
  MOV  @R0,A
  INC  R0
  DJNZ  R1,RDBYTE
  SETB  DQ
  RET

WR1820:
  MOV  R0,#8
  RRC  A
WRBIT:
  SETB  DQ
  NOP
  NOP
  CLR  DQ
  NOP
  NOP
  MOV  DQ,C
  RRC  A
  MOV  R7,#30
  DJNZ  R7,$
  DJNZ  R0,WRBIT
  SETB  DQ
  RET


 
DATASTORE:                  
  MOV  B,#10                
  MOV  R0,#TEMPDATA+1
  MOV  R1,#TEMPSTORE
  MOV  A,@R0
  JB  ACC.7,NEG            
  MOV  @R1,#0
  MOV  A,TEMPDATA
  XCHD  A,@R0
  SWAP  A                 
  AJMP  STORENEXT
NEG:
  MOV  @R1,#1
  MOV  A,TEMPDATA
  CLR  C
  SUBB  A,#1
  MOV  R7,A
  MOV  A,@R0
  SUBB  A,#0
  MOV  @R0,A
  MOV  A,R7
  XCHD  A,@R0
  SWAP  A
  XRL  A,#0FFH              
STORENEXT:
  DIV  AB
  INC  R1
  MOV  @R1,A                
  INC  R1
  MOV  @R1,B             
  INC  R1
  MOV  A,TEMPDATA
  JB  ACC.3,POINT           
  MOV  @R1,#0
  AJMP  STOREBACK
POINT:
  MOV  @R1,#1
STOREBACK:
  RET


;=============================================================
;================     显示子程序	  ========================
;=============================================================


DISPLAY:

 MOV  R0,#TEMPSTORE
 MOV  A,@R0
; LCALL  OUT_5950                 ;将数据送到输出锁存器
  JZ ZERO
  MOV A,#40H
  AJMP NZERO
ZERO:
  MOV A,#00H
NZERO:
  LCALL OUT_5950
;MOV R0,#TEMPSTORE
;MOV A,@R0
;ACALL TABLE2
;LCALL OUT_5950


 INC R0
 MOV  A,@R0
 LCALL  OUT_5951                 ;将数据送到输出锁存器


 INC R0
 MOV  A,@R0
 LCALL  OUT_5952                 ;将数据送到输出锁存器

 
 INC R0
 MOV  A,@R0
 LCALL  OUT_5953                 ;将数据送到输出锁存器	

 RET

;===================================================================
;===============           输出第一位            ===================
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5950:
LCALL WR_5950
CLR RCK_5950
NOP
NOP
SETB RCK_5950 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5950
RET

;-----------------------------------
;移位寄存器接收数据子程序
;-----------------------------------

WR_5950: 
 MOV R4,#08H 
; ACALL TABLE2     
WR_LOOP0: 
 RLC A
 MOV SDATA_5950,C
 SETB SCLK_595 ;上升沿发生移位
 NOP
 NOP
 CLR SCLK_595
 DJNZ R4,WR_LOOP0
 RET


;===================================================================
;================           输出第二位            ==================
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5951:
LCALL  WR_5951
CLR RCK_5951
NOP
NOP
SETB RCK_5951 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5951
RET

;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
WR_5951:
 MOV R4,#08H 
 ACALL TABLE1     
WR_LOOP1: 
 RLC A
 MOV SDATA_5951,C
 SETB SCLK_595 ;上升沿发生移位
 NOP
 NOP
 CLR SCLK_595
 DJNZ R4,WR_LOOP1
 RET


;===================================================================
;===================           输出第三位            ===============
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5952:
LCALL WR_5952
CLR RCK_5952
NOP
NOP
SETB RCK_5952 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5952
RET

;-----------------------------------
;移位寄存器接收数据子程序
;-----------------------------------
WR_5952:
 MOV R4,#08H 
 ACALL TABLE1
 SETB ACC.7      
WR_LOOP2: 
 RLC A
 MOV SDATA_5952,C
 SETB SCLK_595 ;上升沿发生移位
 NOP
 NOP
 CLR SCLK_595
 DJNZ R4,WR_LOOP2
 RET


;===================================================================
;==================           输出第四位       =====================
;===================================================================
;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
OUT_5953:
LCALL WR_5953
CLR RCK_5953
NOP
NOP
SETB RCK_5953 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_5953
RET

;-----------------------------
;输出锁存器输出数据子程序
;-----------------------------
WR_5953:
 MOV R4,#08H
 JZ   DISZERO
 MOV  A,#6DH       
WR_LOOP3: 
 RLC A
 MOV SDATA_5953,C
 SETB SCLK_595 ;上升沿发生移位
 NOP
 NOP
 CLR SCLK_595
 DJNZ R4,WR_LOOP3
 RET

DISZERO:
  MOV  A,#3FH
  LJMP 	WR_LOOP3


;=========================================================
;=================       比较子程序       ================     
;=========================================================
COMPARE:
  MOV  R7,#3
  MOV  R0,#HLIMIT
  MOV  R1,#TEMPSTORE
  MOV  COMNUM,@R1
  MOV  A,@R1
  JNZ  COMN
  MOV  A,@R0
  CJNE  A,COMNUM,WARN
COMPH:
  INC  R0
  INC  R1
  MOV  A,@R0
  MOV  COMNUM,@R1
  CJNE  A,COMNUM,WOSP1
  DJNZ  R7,COMPH
  AJMP  COMPNEXT
WOSP1:
  JC  WARN
COMPNEXT:
  MOV  R0,#LLIMIT
  MOV  R1,#TEMPSTORE
  MOV  A,@R0
  MOV  COMNUM,@R1
  CJNE  A,COMNUM,SAFE
  MOV  R7,#3
COMPL:
  INC  R0
  INC  R1
  MOV  A,@R0
  MOV  COMNUM,@R1
  CJNE  A,COMNUM,WOSP2
  DJNZ  R7,COMPL
  AJMP  SAFE
WOSP2:
  JNC  WARN
  AJMP  SAFE

COMN:
  MOV  A,@R0
  CJNE  A,COMNUM,COMNNEXT
  MOV  R7,#3
COMNH:
  INC  R0
  INC  R1
  MOV  A,@R0
  MOV  COMNUM,@R1
  CJNE  A,COMNUM,WOSN1
  DJNZ  R7,COMNH
  AJMP  COMNNEXT
WOSN1:
  JNC  WARN
COMNNEXT:
  MOV  R0,#LLIMIT
  MOV  R1,#TEMPSTORE
  MOV  COMNUM,@R1
  MOV  A,@R0
  CJNE  A,COMNUM,WARN
  MOV  R7,#3
COMNL:
  INC  R0
  INC  R1
  MOV  A,@R0
  MOV  COMNUM,@R1
  CJNE  A,COMNUM,WOSN2
  DJNZ  R7,COMNL
  AJMP  SAFE
WOSN2:
  JNC  SAFE
WARN:
  SETB  WARNING
  AJMP  COMBACK
SAFE:
  CLR  WARNING
COMBACK:
  RET


;===================================================
;            上下限设置子程序          
;===================================================

LIMIT:
  CLR  WARNING
  MOV  R0,#0EEH	          
KEY:					  
  ;MOV  P1,#0FFH			  
  SETB P3.4
  SETB P3.5
  SETB P3.6
  SETB P3.7
  MOV  A,P3				  
  CPL  A				  
  ANL  A,#0F0H			  
  JZ  KEY				  
  LCALL  DELAY20ms		  
  MOV  A,P3				  
  CPL  A				 
  ANL  A,#0F0H
  JZ  KEY
  SWAP A
  MOV  B,A				  

KEY1:
  MOV  A,P3
  CPL  A
  ANL  A,#0F0H
  JNZ  KEY1
  LCALL  DELAY20ms
  MOV  A,B		          
  JB  ACC.0,INCNUM		  
  JB  ACC.1,NEXTNUM
  JB  ACC.2,OK
  AJMP  KEY

INCNUM:
  MOV  A,R7            
  JZ  SETLOW1
  MOV  R1,#HLIMIT
  AJMP  NEXTEN
SETLOW1:
  MOV  R1,#LLIMIT
NEXTEN:
  MOV  A,R0
  JNB  ACC.0,SIGN
  JNB  ACC.1,NUM1
  JNB  ACC.2,NUM2
  JNB  ACC.3,NUM3
  AJMP  KEY


SIGN:
  MOV  A,@R1
  ;CPL  ACC.0
  ;MOV  @R1,A
  JZ NEXT
  MOV A,#00H
  MOV @R1,A
  AJMP NEXT1
NEXT:
  MOV A,#40H
  MOV @R1,#01H
NEXT1:
  LCALL  OUT_5950
  NOP
  NOP
  AJMP  KEY


NUM1:
  INC  R1
CHANGE:
  CJNE  @R1,#9,INCNEXT1
  MOV  @R1,#0
  AJMP  SETSHOW1
INCNEXT1:
  INC  @R1
SETSHOW1:
  MOV  A,@R1
  LCALL  OUT_5951
  NOP
  NOP
  AJMP  KEY


NUM2:
  INC  R1
  INC  R1
  CJNE  @R1,#9,INCNEXT2
  MOV  @R1,#0
  AJMP  SETSHOW2
INCNEXT2:
  INC  @R1
SETSHOW2:
  MOV  A,@R1
  LCALL  OUT_5952
  NOP
  NOP
  AJMP  KEY


NUM3:
  INC  R1
  INC  R1
  INC  R1
  MOV  A,@R1
  CPL  ACC.0
  MOV  @R1,A
  LCALL  OUT_5953
  NOP
  NOP
  AJMP  KEYBACK
KEYBACK:
  AJMP  KEY

NEXTNUM:
  MOV  A,R0
  RL  A
  MOV  R0,A
  AJMP  KEY

OK:
 
  SETB  EA
  RET



TABLE1:  MOV   DPTR,#TAB            
        MOVC  A,@A+DPTR
        RET
TAB:DB      3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB      7FH,6FH,77H,7CH,39H,5EH,79H,71H
        

DELAY2s:
  MOV  R4,#5
  MOV  R5,#0
  
DLP:
 
  DJNZ  R5,$
  DJNZ  R4,DLP
  RET

DELAY20ms:
  MOV  R5,#100
DLOOP:
  MOV  R6,#100
  DJNZ  R6,$
  DJNZ  R5,DLOOP
  RET


DELAY200ms:
      MOV  R5,#36
      MOV R4,#50
      
DLOP:
      
      DJNZ R4,$
      DJNZ R5,DLOP
      RET

END

⌨️ 快捷键说明

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