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

📄 cewen.asm

📁 ds18b20四位动态显示
💻 ASM
字号:
;*************************************************
;单片机内存分配申明!
;*************************************************
TEMPER_L  EQU   40H     ;用于保存读出温度的低8位
TEMPER_H  EQU   41H     ;用于保存读出温度的高8位
FLAG1     EQU   38H     ;是否检测到DS18B20标志位
TEMPL     EQU   30H     ;用于保存读出温度的低8位
TEMPH     EQU   31H     ;用于保存读出温度的高8位
TEMPHC    EQU   32H     ;温度转换寄存器高8位
TEMPLC    EQU   33H     ;温度转换寄存器低8位
BUF1      EQU   34H     ;显示缓冲寄存器小数位
BUF2      EQU   35H     ;显示缓冲寄存器个数位
BUF3      EQU   36H     ;显示缓冲寄存器十数位
BUF4      EQU   37H     ;显示缓冲寄存器百数位
TEMPDIN   BIT   P1.7    ;数据脚定义
;**********************************************
          ORG     0000H             ;主程序入口地址
          LJMP    MAIN              ;转主程序
          ORG    0100H              
MAIN:
          MOV    SP,#60H
NEXT1:
          LCALL  GET_TEMPER         ;调读温度子程序
          JB     FLAG1,OK           ;判断DS18B20是否存在
	  LCALL  ERR                ;不存在就给出出错提示8888
	  AJMP   NEXT1

OK:       LCALL   CONVTEMP         ;温度BCD码计算处理子程序
          LCALL   DISPBCD          ;显示区BCD码温度值刷新子程序
	  LCALL   DISPLAY          ;显示子程序
	  LCALL   WARNING          ;比较温度看是否超限
	  AJMP    NEXT1
;***************************************
; 读出转换后的温度值
;***************************************
GET_TEMPER:
           SETB    TEMPDIN        ;释放总线 
           LCALL   INIT_1820      ;先复位DS18B20
           JB      FLAG1,TSS2	  ;判断DS1820是否存在?若DS18B20不存在则返回
           LCALL   ERR            ;出错提示
TSS2:
           CLR     P3.7           ;DS18B20已经被检测到!!
           MOV     A,#0CCH        ;跳过ROM匹配
           LCALL   WRITE_1820
           MOV     A,#44H         ;发出温度转换命令
           LCALL   WRITE_1820
;*****************************************
;通过调延时一段时间,等待AD转换结束
;这里用系统默认的12位,延时750us
;*****************************************
           MOV     R3,#5
DELAY:     LCALL   DISPLAY 
           DJNZ    R3,DELAY          
;*****************************************
           LCALL   INIT_1820       ;准备读温度前先复位

           MOV     A,#0CCH         ;跳过ROM匹配
           LCALL   WRITE_1820

           MOV     A,#0BEH         ;发出读温度命令
           LCALL   WRITE_1820

           LCALL   READ_18200      ;将读出的温度数据保存到40H/41H
           RET
;*******************************************
;写DS18B20的子程序(有具体的时序要求)
;*******************************************
WRITE_1820:
           MOV     R2,#8          ;一共8位数据
           CLR     C              
WR1:
           CLR     TEMPDIN        
           MOV     R3,#6
           DJNZ    R3,$
           RRC     A
           MOV     TEMPDIN,C      
           MOV     R3,#23
           DJNZ    R3,$
           SETB    TEMPDIN        
           NOP
           DJNZ    R2,WR1         
           SETB    TEMPDIN        
           RET
;*************************************
; 这是DS18B20复位初始化子程序
;*************************************
INIT_1820:
           SETB    TEMPDIN
           NOP
           CLR     TEMPDIN        ;主机发出延时537微秒的复位低脉冲
           MOV     R1,#3
TSR1:      MOV     R0,#107
           DJNZ    R0,$
           DJNZ    R1,TSR1
           SETB    TEMPDIN        ;然后拉高数据线
           NOP
           NOP
           NOP
           MOV     R0,#25H
TSR2:
           JNB     TEMPDIN,TSR3   ;等待DS18B20回应
           DJNZ    R0,TSR2
           LJMP    TSR4           ;延时
TSR3:
           SETB    FLAG1          ;置标志位,表示DS1820存在
           LJMP    TSR5
TSR4:
           CLR     FLAG1          ;清标志位,表示DS1820不存在
           LCALL   ERR
           LJMP    TSR7
TSR5:      MOV     R0,#117
TSR6:      DJNZ    R0,TSR6        ;时序要求延时一段时间
TSR7:      SETB    TEMPDIN        ;
           RET

;*************************************
;处理温度BCD码子程序
;*************************************
CONVTEMP: MOV     A,TEMPH          
          ANL     A,#80H           ;
          JZ      TEMPC1           ; 判断温度是否在零下?

          CLR     C                ; 温度值补码 变成原码
          MOV     A,TEMPL          
          CPL     A
          ADD     A,#01H           
          MOV     TEMPL,A          
          MOV     A, TEMPH          
          CPL     A                
          ADDC    A,#00H           
          MOV     TEMPH,A          ; TEMPHC  HI=符号位
          MOV     TEMPHC,#0BH      ; 置"-"标志
          SJMP    TEMPC11          
TEMPC1:   MOV     TEMPHC,#0AH      ; 置"+"标志
;**************************************
TEMPC11:  MOV     A,TEMPHC         ; 计算小数位温度BCD值
          SWAP    A
          MOV     TEMPHC,A         
          MOV     A,TEMPL          ;
          ANL     A,#0FH           ; 乘0.0625
          MOV     DPTR,#TEMPDOTTAB 
          MOVC    A,@A+DPTR        
          MOV     TEMPLC,A         ; TEMPLC LOW= 小数部分 BCD
;**************************************
          MOV     A,TEMPL          ; 计算整数位温度BCD值
          ANL     A,#0F0H          
          SWAP    A                
          MOV     TEMPL,A          
          MOV     A,TEMPH          
          ANL     A,#0FH           
          SWAP    A                
          ORL     A,TEMPL          
          MOV     TEMPER_L ,A      
          LCALL   HEX2BCD1         ; 调用单字节十六进制转BCD子程序
;************************************
          MOV     TEMPL,A          
          ANL     A,#0F0H          
          SWAP    A                
          ORL     A,TEMPHC         ; TEMPHC LOW = 十位数 BCD
          MOV     TEMPHC,A         
          MOV     A,TEMPL          
          ANL     A,#0FH           
          SWAP    A                ; TEMPLC HI = 个位数 BCD
          ORL     A,TEMPLC         
          MOV     TEMPLC,A         
          MOV     A,R7             
          JZ      TEMPOUT          
          ANL     A,#0FH           
          SWAP    A                
          MOV     R7,A             
          MOV     A,TEMPHC         ; TEMPHC HI = 百位数 BCD
          ANL     A,#0FH           
          ORL     A,R7             
          MOV     TEMPHC,A         
TEMPOUT:  RET                      
;**************************************
;小数部分分码表
;**************************************
TEMPDOTTAB: DB  00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
            DB  06H,07H,08H,08H,09H,09H ;
;**************************************
;显示区 BCD 码温度值刷新子程序
;**************************************
DISPBCD: MOV      A,TEMPLC         ; 温度数据移入显示寄存器
         ANL      A,#0FH           
         MOV      BUF1,A           ; 显示小数
         MOV      A,TEMPLC         
         SWAP     A                
         ANL      A,#0FH           
         MOV      BUF2,A           ; 显示个位
         MOV      A,TEMPHC         
         ANL      A,#0FH           
         MOV      BUF3,A           ; 显示十位
         MOV      A,TEMPHC         
         SWAP     A                
         ANL      A,#0FH           
         MOV      BUF4,A           ; 显示百位
         MOV      A,TEMPHC         
         ANL      A,#0F0H          
         CJNE     A,#10H,DISPBCD0  ; 百位数=0?
         SJMP     DISPOUT          
DISPBCD0:
         MOV      A, TEMPHC        
         ANL      A, #0FH          
         JNZ      DISPOUT          ; 十位数是0?
         MOV      A,TEMPHC         
         SWAP     A                
         ANL      A,#0FH           
         MOV      BUF4,0AH         ; 符号位不显示
         MOV      BUF3,A           ; 十位数显示符号
DISPOUT: RET                                        
;*************************************
;单字节十六进制转BCD
;*************************************
HEX2BCD1:MOV     B,#64H            ; 十六进制 ->BCD
         DIV     AB                ; B=A%100
         MOV     R7,A              ; R7=百位数
         MOV     A,#0AH            
         XCH     A,B               
         DIV     AB                ; B=A%B
         SWAP    A                 
         ORL     A,B               
         RET                       
;**************************************
;进行8位循环校验
;*************************************
CRC8CAL: PUSH    ACC               
         MOV     R7,#08H           
CRC8LOOP1:
         XRL     A,B             
         RRC     A               
         MOV     A,B               
         JNC     CRC8LOOP2        
         XRL     A,#18H          
CRC8LOOP2:
         RRC     A                
         MOV     B,A              
         POP     ACC               
         RR      A                
         PUSH    ACC              
         DJNZ    R7,CRC8LOOP1      
         POP     ACC              
         RET                       
;******************************************
;读DS18B20的程序,从DS18B20中读出9个字节数据
;开始的两个字节为温度数据
;******************************************
READ_18200:
           MOV     R4,#9            ; 将温度高位和低位从DS18B20中读出
           MOV     R1,#TEMPER_L     ; 低位存入40H(TEMPER_L),高位存入41H(TEMPER_H)
           MOV     B, #00H          ;
;************************************
RE00:
           MOV     R2,#8            ; 数据一共有8位
RE01:
           CLR     C
           SETB    TEMPDIN          
           NOP
           NOP
           CLR     TEMPDIN          
           NOP
           NOP
           NOP
           SETB    TEMPDIN          
           MOV     R3,#9
RE10:
           DJNZ    R3,RE10          
           MOV     C,TEMPDIN        
           MOV     R3,#23
RE20:
           DJNZ    R3,RE20          
           RRC     A
           DJNZ    R2,RE01          
;************************************
           MOV     @R1,A            
           INC     R1              
           LCALL   CRC8CAL          
           DJNZ    R4,RE00          
           MOV     A,B              
           JNZ     READ_OUT         
           MOV     TEMPL,TEMPER_L   
           MOV     TEMPH,TEMPER_H   
READ_OUT:  RET                      
;*****************************************
;显示子程序
;*****************************************
DISPLAY:
           MOV     DPTR,#NUMTAB     ;指定查表启始地址
           MOV     R0,#6
DP11:      MOV     R1,#40           ;显示1000次

DPLP:      MOV     A,BUF1           ;取小位数
           MOVC    A,@A+DPTR        ;查小位数的7段代码
           MOV     P0,A             ;送出小位的7段代码
           CLR     P2.3             ;开小位显示
           SETB    P0.7             ;把小数点去掉
           ACALL   DL1ms            ;显示1ms
           SETB    P2.3             

           MOV     A,BUF2           ;取个位数
           MOVC    A,@A+DPTR        ;查个位数的7段代码
           MOV     P0,A             ;送出个位的7段代码
           CLR     P2.2             ;开个位显示
           CLR     P0.7             ;小数点要显示出来
           ACALL   DL1ms            ;显示1ms
           SETB    P2.2             ;

           MOV     A,BUF3           ;取十位数
           MOVC    A,@A+DPTR        ;查十位数的7段代码
           MOV     P0,A             ;送出十位的7段代码
           CLR     P2.1             ;开十位显示
	   SETB    P0.7
           ACALL   DL1ms            ;显示1ms
           SETB    P2.1             ;

           MOV     A,BUF4           ;取百位数
           MOVC    A,@A+DPTR        ;查百位数的7段代码
           MOV     P0,A             ;送出百位的7段代码
           CLR     P2.0             ;开百位显示
          SETB    P0.7
           ACALL   DL1ms            ;显示1ms
           SETB    P2.0             ;

           DJNZ    R1,DPLP          
           DJNZ    R0,DP11          
           RET
;*******************************************           

WARNING:  MOV  A,TEMPL     ; 比较当前温度与下限温度值
          CJNE A,#20,TEST0 ;=20?
          AJMP CLR36      ;相等 c为0
TEST0:    JC SET36        ;<20 c为1
TEST1: 	  MOV A,TEMPH
          CJNE A,#60,SET36 ;=60?
          JNC SET36       ;>60 为0
          AJMP CLR36      ;其它为1

CLR36:    CLR P3.6
          AJMP OUT
SET36:    SETB P3.6
          AJMP OUT
OUT:      RET
;******************************************
;DS1820不存在就出错提示8888
;******************************************     
ERR:     MOV BUF1,#08H
         MOV BUF2,#08H
         MOV BUF3,#08H
	 MOV BUF4,#08H
	 LCALL DISPLAY
	 RET     

;****************************************
DL1MS:    MOV     R7,#100
          DJNZ   R7,$
          RET           
;****************************************
;7段数码管0~9数字的共阳显示代码
;****************************************
NUMTAB:
           DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
;            "0"  "1"  "2"  "3"  "4" "5" "6" "7"  "8" "9" "不亮" "-"
;****************************************
          END参

⌨️ 快捷键说明

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