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

📄 温度显示 .asm

📁 lyd-sy-5100单片机开发板的示例程序 分为C语言版本和ASM汇编版本。其他牌子的板子也可以使用其C语言版本。
💻 ASM
字号:
; 端口定义
TEMPER_L   EQU 36H
TEMPER_H   EQU 35H
TEMPER_NUM EQU 60H
BUF1    BIT    20H
BUF     EQU    38H
RS	EQU	P2.1
RW	EQU	P2.2
EP	EQU	P2.0
FLAG1   BIT 00H
DQ      BIT P3.5
SST:    SETB BUF1 
AAA:    MOV SP,#70H
        LCALL	LCD_INIT		; 初始化LCD
        LCALL DISPLAY
SS:      LCALL GET_TEMPER
        LCALL TEMPER_COV
        LCALL TEMPERATURE
	JNB BUF1, SS
	CLR BUF1
        LJMP AAA
        NOP                   
;------------------------读出转换后的温度值
GET_TEMPER:
     SETB DQ             ;定时入口
BCD: LCALL INIT_1820
     JB FLAG1,S22
     LJMP BCD             ;若DS18B20不存在则返回

S22: LCALL DELAY1
     MOV A,#0CCH           ;跳过ROM匹配---------------0CC
     LCALL WRITE_1820
     MOV A,#44H            ;发出温度转换命令
     LCALL WRITE_1820
     NOP
     LCALL DELAY
     LCALL DELAY
CBA: LCALL INIT_1820
     JB FLAG1,ABC
     LJMP CBA
ABC: LCALL DELAY1
     MOV A,#0CCH          ;跳过ROM匹配
     LCALL WRITE_1820
     MOV A,#0BEH          ;发出读温度命令
     LCALL WRITE_1820
     LCALL READ_18200     ;读1820
;------------------------------读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
     MOV R2,#8H  
RE1:
     CLR C 
     SETB DQ
     NOP 
     NOP
     CLR DQ
     NOP
     NOP
     SETB DQ
     MOV R3,#7
     DJNZ R3,$
     MOV C,DQ
     MOV R3,#23
     DJNZ R3,$
     RRC A
     DJNZ R2,RE1
     RET    
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的程序,从DS18B2中读出两个字节的温度数据
READ_18200:
     MOV R4,#2          ;将温度高位和底位从DS18B20中读出
     MOV R1,#36H        ;底位存入36H(TEMPER——L),高位存入35H(TEMPER——H)N
RE00:
     MOV R2,#8
RE01:
     CLR C
     SETB DQ
     NOP
     NOP
     CLR DQ
     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
;---------------------------------将从SD18B20中读出的温度数据进行转换
TEMPER_COV:
     MOV A,#0F0H
     ANL A,TEMPER_L             ;舍去温度低位中小数点后的四位温度数值
     SWAP A
     MOV TEMPER_NUM,A
     MOV A,TEMPER_L
     JNB ACC.3,TEMPER_COV1      ;四舍五入去温度值
     INC TEMPER_NUM

TEMPER_COV1:
     MOV A,TEMPER_H
     ANL A,#07H
     SWAP A
     ORL A,TEMPER_NUM
     MOV TEMPER_NUM,A            ;保存变换后的温度数据
     LCALL BIN_BCD
RET
  ;-----------------------将16进制的温度数据转换成压缩BCD码
BIN_BCD:
     MOV DPTR,#TEMP_TAB
     MOV A,TEMPER_NUM
     MOVC A,@A+DPTR
     MOV TEMPER_NUM,A
RET

TEMP_TAB:
      DB 00H,01H,02H,03H,04H,05H,06H,07H
      DB 08H,09H,10H,11H,12H,13H,14H,15H
      DB 16H,17H,18H,19H,20H,21H,22H,23H
      DB 24H,25H,26H,27H,28H,29H,30H,31H
      DB 32H,33H,34H,35H,36H,37H,38H,39H
      DB 40H,41H,42H,43H,44H,45H,46H,47H
      DB 48H,49H,50H,51H,52H,53H,54H,55H
      DB 56H,57H,58H,59H,60H,61H,62H,63H
      DB 64H,65H,66H,67H,68H,69H,70H,71H
      DB 72H,73H,74H,75H,76H,77H,78H,79H
      DB 80H,81H,82H,83H,84H,85H,86H,87H
      DB 88H,89H,90H,91H,92H,93H,94H,95H
      DB 96H,97H,98H,99H
;-----------------------DS18B20初始化程序
INIT_1820:
      SETB DQ
      NOP
      CLR DQ
      MOV R0,#80H
TSR1:
      DJNZ R0,TSR1          ;延时
      SETB DQ
      MOV R0,#25H           ;96US-25H
TSR2:
      DJNZ R0,TSR2
      JNB DQ,TSR3
      LJMP TSR4              ;延时
TSR3:
      SETB FLAG1              ;置标志位,表示DS18B20存在
      LJMP TSR5
TSR4:  
      CLR FLAG1           ;置标志位,表示DS18B20 不存在
      LJMP TSR7
TSR5: 
      MOV R0,#06BH         ;200US
TSR6:
      DJNZ R0,TSR6         ;延时
TSR7:
      SETB DQ
      RET
      ;----------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
      JB FLAG1,RE_CONFIG   ;若DS18B20存在,转RE——CONFIG1
 
 RE_CONFIG1:
      MOV A,0CCH            ;发SKIP ROM命令
      LCALL WRITE_1820
      MOV A,#4EH
      LCALL WRITE_1820        ; 发写暂存存储命令
      MOV A,#00H
      LCALL WRITE_1820        ;TH(报警上限)中写入00H
      MOV A,#00H
      LCALL WRITE_1820        ; TL(报警下限)中写入00H
      MOV A,#7FH              
      LCALL WRITE_1820        ;选择12位温度分辨率   
      RET
  ;-------------------------------延时子程序
DELAY:   MOV R7,#00H
MIN:     DJNZ R7,YS500
         RET
YS500:   LCALL YS500US
YS500US: MOV R6,#00H
         DJNZ R6,$
         RET
DELAY1:  MOV R7,#20H
         DJNZ R7,$
         RET

;------------------------调液晶显示

	
   
DISPLAY:  
	  MOV	A,#15
	  LCALL	DELAY_MS		;显示字符串函数

MAIN_LOOP:	                         ;在第一行显示“TEMPERATURE”
	MOV	A,#00H
	LCALL	SET_LCD_POS		; 设置LCD光标到第一行的第5个字符
        MOV A ,#0FFH
        LCALL DELAY_MS
	MOV	DPTR,#TAB_WORD	        ;TEMPERRATURE"字串表格地址
	LCALL	DISPLAY_STRING1		; 显示字符串
        MOV A ,#0FFH
        LCALL DELAY_MS                  	
        RET
TEMPERATURE:
	MOV	A,#4CH			;第二行显示温度值
	LCALL	SET_LCD_POS		;设置第二行第一个字符位置
	MOV A ,#0FFH
        LCALL DELAY_MS
	MOV	DPTR,#TAB_LJD
	LCALL	DISPLAY_STRING
        RET
                                      

 ;传入参数:DPTR(字符串表格地址)
    ;返回值:无
DISPLAY_STRING:	
        MOV A,TEMPER_NUM
        MOV R0,#37H
        LCALL H_ASC
        MOV R0,#37h
	MOV A,@R0
	LCALL	LCD_WRITE_DATA		; 
        INC R0
        MOV	A, #100			; 
	LCALL	DELAY_MS
        MOV A,@R0
	LCALL	LCD_WRITE_DATA		; 写数据到LCD				        ; 指向表格的下一字符
        MOV	A, #100			; 
	LCALL	DELAY_MS
	MOV A,#60H
        LCALL	LCD_WRITE_DATA
        MOV	A, #100			; 
	LCALL	DELAY_MS
        MOV A,#43H
        LCALL	LCD_WRITE_DATA
        MOV	A, #100			; 
	LCALL	DELAY_MS
END_DISPLAY_STRING:
	RET
DISPLAY_STRING1:	
	CLR	A
	MOVC	A,@A+DPTR		; 
	JZ	END_DISPLAY_STRING1	; 如果遇到00H表示表格结束
	LCALL	LCD_WRITE_DATA		; 写数据到LCD
	INC	DPTR			; 指向表格的下一字符
	MOV	A, #100			; 
	LCALL	DELAY_MS		; 
	SJMP	DISPLAY_STRING1		; 循环直到字符串结束
END_DISPLAY_STRING1:
	RET	
	
   ; 初始化LCD
LCD_INIT:

   ; 设置显示格式---
	MOV	A,#38H			; 38H --- 16*2行显示,5*7点阵,8位数据接口
	LCALL	LCD_WRITE_COMMAND
	MOV	A,#1
	LCALL	DELAY_MS
 ;开显示
	LCALL	LCD_TURN_ON
 ;读写后指针加1
	MOV	A,#06H			; 06H --- 读写后指针加1
	LCALL	LCD_WRITE_COMMAND
	MOV	A,#1
	LCALL	DELAY_MS
 ; 清除LCD屏幕
	LCALL	LCD_CLEAR
	RET


 ;开显示
LCD_TURN_ON:
	MOV	A,#0CH			; 0CH --- 开显示,无光标
	LCALL	LCD_WRITE_COMMAND
	MOV	A,#1
	LCALL	DELAY_MS
	RET
	
 ; 关显示
LCD_TURN_OFF:
	MOV	A,#08H			; 08H --- 关显示
	LCALL	LCD_WRITE_COMMAND
	MOV	A,#1
	LCALL	DELAY_MS
	RET

; 清除LCD屏幕
LCD_CLEAR:
	MOV	A,#01H			; 01H清屏指令			
	LCALL	LCD_WRITE_COMMAND
	MOV	A,#1
	LCALL	DELAY_MS
	RET

;设置LCD当前光标的位置

SET_LCD_POS:
	ORL	A,#80H		; 
	LCALL	LCD_WRITE_COMMAND
	RET

; 写入控制指令到LCD
; 传入参数: ACC(要写入的命令)
; 返回值: 无
LCD_WRITE_COMMAND:
	;LCALL	CHECK_LCD_BUSY
	CLR	RS
	CLR	RW
	CLR	EP
	NOP
	NOP
	MOV	P0,A			; 写入数据到LCD端口
	NOP
	NOP
	NOP
	NOP
	SETB	EP
	NOP
	NOP
	NOP
	NOP
	CLR	EP
	RET
	
  ; 写入显示数据到LCD
  ; 传入参数: ACC(要写入的数据)
  ; 返回值: 无
LCD_WRITE_DATA:                 
	SETB	RS
	CLR	RW
	CLR	EP
	NOP
	NOP
	MOV	P0,A			; 写入数据到LCD端口
	NOP
	;NOP
	;NOP
	;NOP
	SETB	EP
	NOP
	NOP
	NOP
	NOP
	CLR	EP
	RET
	
; 延时子程序
; 传入参数: ACC(延时时间,单位毫秒)
; 返回值: 无
DELAY_MS:
	MOV	R7,A
DELAY_LOOP1:
	MOV	R6,#0FFH
DELAY_LOOP2:
	NOP
	NOP
	DJNZ	R6,DELAY_LOOP2
	DJNZ	R7,DELAY_LOOP1
	RET
		

TAB_LJD:
	DB	""
	DB	00			; 字符结束标志
	
TAB_WORD:
	DB	"Temperature:"
	DB	00			; 字符结束标志
;********************************************************************
;将一字节的十六进制数转换为两个ASCII码
;********************************************************************
H_ASC:            
	       MOV    B, A              
               ANL    A, #0F0H
               SWAP   A
               CJNE   A, #9, PD_G
XY9:           ADD    A, #30H
TURN_LOW:      MOV    @R0, A
               INC    R0
               AJMP   LOW_BIT
PD_G:          JC     XY9
               ADD    A, #37H
               AJMP   TURN_LOW
LOW_BIT:       MOV    A, B
               ANL    A, #0FH
               CJNE   A, #9, PD_G1
XY_9:          ADD    A, #30H
TURN_LOW1:     MOV    @R0, A
               RET
PD_G1:         JC     XY_9
               ADD    A, #37H
               AJMP   TURN_LOW1

END     

⌨️ 快捷键说明

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