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

📄 温度计.txt

📁 温度计最大转化时间750微秒,显示温度-55到+125度,显示精度为0.1度显示采用4LE共阳显示测温值。
💻 TXT
📖 第 1 页 / 共 2 页
字号:
          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                       ;
;**************************************
;DECIMAL DATA IS TRANSISTERED HEX DATA
;INPUT: A=DECIMAL DATA
;OUTPUT:A
;USED REGISTER: R1,R2,A
;**************************************
DECHEX:   MOV   R1,    A
          SWAP  A
          ANL   A,     #0FH
          RL    A
          MOV   R2,    A
          RL    A
          RL    A
          ADD   A,     R2
          MOV   R2,    A
          MOV   A,     #0FH
          ANL   A,     R1
          ADD   A,     R2
          RET
;*************************************
; Calculate CRC-8 Values, Uses The
;CCITT-8 Polynomial,Expressed As
; X^8+X^5+X^4+1
;*************************************
CRC8CAL: PUSH    ACC               ;
         MOV     R7,#08H           ; Number Bits Byte
CRC8LOOP1:
         XRL     A,B               ; Calculate CRC
         RRC     A                 ; MOVe T0 Carry
         MOV     A,B               ; Get The Last CRC Value
         JNC     CRC8LOOP2         ; Skip If Data==0
         XRL     A,#18H            ; Update The CRC Value
CRC8LOOP2:
         RRC     A                 ; Position The New CRC
         MOV     B,A               ; Store The New CRC
         POP     ACC               ; Get The Remaining Bits
         RR      A                 ; Possition The Next Bit
         PUSH    ACC               ; Save The Remaining Bits
         DJNZ    R7,CRC8LOOP1      ; Repeat For 9 Bits
         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   ;
           MOV     TMSETVL,TMROMVL  ;
           MOV     TMSETVH,TMROMVH  ;
READ_OUT:  RET                      ;
;****************************************
; TIMER0 INTERRUPT SUBROUTE
; GERANATE AN INTERRUPT PER 10ms
;****************************************
TIMER0:   PUSH   PSW                  ; PROTECT PSW,ACC REGISTER
          PUSH   ACC                  ;
          MOV    TL0,   #0B1H         ;
          MOV    TH0,   #0E0H         ;
          INC    T10MS                ;
          MOV    A,T10MS              ;
          CJNE   A,#05H,TMREND        ;
          MOV    T10MS,#00H           ;
          SETB   TIME1SOK             ;

          LCALL  GET_TEMPER           ;调用读温度子程序
          LCALL  CONVTEMP             ;温度BCD码计算处理子程序
          LCALL  DISPBCD              ;显示区BCD码温度值刷新子程序
          LCALL  DISPLAY              ;
TMREND:   POP    ACC                  ;
          POP    PSW                  ;
          RETI                        ;
;*****************************************
;显示子程序
;*****************************************
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     P1.4             ;开小位显示
           ACALL   DL1ms            ;显示1ms
           SETB    P1.4             ;

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

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

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

           DJNZ    R1,DPLP          ;250次没完循环
           DJNZ    R0,DP11          ;4个100次没完循环
           RET
;*******************************************           
DLDISP:    MOV     A,BUF1           ;取小位数
           MOVC    A,@A+DPTR        ;查小位数的7段代码
           MOV     P0,A             ;送出小位的7段代码
           CLR     P1.4            ;开小位显示
           ACALL   DL1ms1           ;显示1ms
           SETB    P1.4             ;

           MOV     A,BUF2           ;取个位数
           MOVC    A,@A+DPTR        ;查个位数的7段代码
           MOV     P0,A             ;送出个位的7段代码
           CLR     P0.5             ;
           CLR     P1.5             ;开个位显示
           ACALL   DL1ms1           ;显示1ms
           SETB    P1.5             ;

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

           MOV     A,BUF4           ;取百位数
           MOVC    A,@A+DPTR        ;查百位数的7段代码
           MOV     P0,A             ;送出百位的7段代码
           CLR     P1.7             ;开百位显示
           ACALL   DL1ms1           ;显示1ms
           SETB    P1.7             ;
           RET                      ;       
;**************************************
;10毫秒延时程序
;**************************************
DL10MS:   LCALL   DLDISP             ;
          RET                        ;
;****************************************
;0.2MS延时(按12MHZ算)
;****************************************
DL1MS:     MOV     R7,#200
           DJNZ    R7,$
           RET
;****************************************
;0.2MS延时(按12MHZ算)
;****************************************
DL1MS1:    MOV     R7,#100
           DJNZ    R7,$
           RET           
;****************************************
;7段数码管0~9数字的共阳显示代码
;****************************************
NUMTAB:
;         DB     0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
          DB     22H,0FAH,31H,25H,0ACH,64H,60H,2FH,20H,24H,0FFH,0FDH ;

;               "0"  "1"  "2"  "3"  "4" "5" "6" "7"  "8" "9" "不亮" "-"
;****************************************
          END


参考链接:http://www.picavr.com/news/2008-01/1682.htm

⌨️ 快捷键说明

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