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

📄 18b20.asm

📁 18B20测温用LCD显示程序 液晶型号SMS0501E2
💻 ASM
字号:
;18B20测温程序晶振11.0592MHZ   ,最高到127C,#7FFH
;液晶型号SMS0501E2,5位带背光

        ORG 0000H
        DQ EQU P3.7   ;DQ引脚由P2.5控制
       DAT EQU P2.2  ;定义数据引脚
       A_BIT   EQU  20H     ;存放个位数变量
       B_BIT   EQU  21H     ;存放十位数变量
       C_BIT   EQU  22H     ;存放百位
       FUS     EQU  39H     ;负数标志位            27H.1
       FLAG    EQU  38H     ;DS18B20是否存在标志   27H.0
       ZHENSHU EQU  29H  ; 整数部分存放地址
       XIAOSHU EQU  23H  ; 小数部分存放地址
       CLKPIN  BIT     P1.0    ;用户自定义CLK对应引脚
DIPIN   BIT     P1.1    ;用户自定义DI对应引脚
LCDBUF  EQU     41H     ;用户自定义LCD缓冲区首地址
LCDBUFEND       EQU     46H;LCDBUF+(N-1)   ;用户自定义LCD缓冲区末地址(N表示几位显示缓冲区)
                COL   EQU 2FH.7;数码COL位
               
                SJ1   EQU 41H;数码1位数据
                SJ2   EQU 42H;数码2位数据
                SJ3   EQU 43H;数码3位数据
                SJ4   EQU 44H;数码4位数据
                SJ5   EQU 45H;数码5位数据
       LJMP SATA
       ORG 0040H
SATA:  CLR P1.2
MOV P2,#0FFH                        ;
MAIN:  ACALL   RE_TEMP      ;调用读取温度子程序
       ACALL   TURN         ;数据转化子程序
       ACALL   DISPLAY      ;运算程序
       LCALL   XIANSHI      ;显示子程序
       JMP     MAIN         ;循环                            主程序
RE_TEMP:              ;初始化及读取温度值
       SETB   DQ
       ACALL  RESET_1820    ;调用复位子程序
       JB     FLAG, ST      ;判断DS1820是否存在?
       RET
ST:                       ;DS18B20存在
       MOV    A,#0CCH       ;跳过ROM匹配
       ACALL  WRITE_1820    ;调用写入数据子程序
       ;ACALL READ_1820
       ;MOV   A,#04EH
       ;ACALL WRITE_1820
       ;MOV   A,#0AAH
       ;ACALL WRITE_1820
       ;MOV A,#0BBH
       ;ACALL WRITE_1820
       ;MOV    A,#0CCH       ;跳过ROM匹配
       ;ACALL  WRITE_1820    ;调用写入数据子程序
       MOV    A,#44H        ;发出温度转换命令
       ACALL  WRITE_1820    ;调用写入数据子程序
       ACALL  RESET_1820    ;准备读温度前先复位
       MOV    A,#0CCH       ;跳过ROM匹配
       ACALL  WRITE_1820    ;调用写入数据子程序
       MOV    A,#0BEH       ;发出读温度命令
       ACALL  WRITE_1820    ;调用写入数据子程序
       ACALL  READ_1820     ;调用读取数据子程序              设置传感器
       RET                                                   ;读取温度数据

  RESET_1820:  ;复位(有具体的时序要求)
       SETB  DQ
       NOP
       CLR   DQ
 ;――――――――――――;主机发出复位低脉冲
      LCALL YASS3
      LCALL YASS3
 ;――――――――――――;然后拉高数据线
       SETB  DQ
       NOP
       NOP
       NOP
 ;――――――――――――;等待DS18B20回应
       MOV   R0,#040H     ;最长58.3us
   T2: JNB   DQ ,T3
       DJNZ  R0, T2
       JMP   T4
 ;――――――――――――;标志位FLAG=1,表示DS1820存在
   T3: SETB  FLAG
       JMP   T5
 ;――――――――――――;标志位FLAG=0,表示DS1820不存在
   T4: CLR   FLAG
       JMP   T7
  ;――――――――――――;时序要求延时一段时间
   T5: LCALL YASS3
 ;――――――――――――
   T7: SETB   DQ
       RET;                                                   复位子程序

  WRITE_1820: ;写入DS18B20(有具体的时序要求)
       MOV   R2,#8           ;一共8位数据
       CLR   C               ;C=0
    WR1:
       CLR   DQ              ;总线低位,开始写入
       MOV   R3,#20           ;
       DJNZ  R3,$            ;保持16微秒以上
       RRC   A  ;把字节DATA分成8个BIT环移给C
       MOV   DQ,  C          ;写入一个BIT
       MOV   R3,#100         ;47US
       DJNZ  R3,$            ;等待
       SETB  DQ              ;重新释放总线
       MOV   R3,#7           ;
       DJNZ  R3,$
       DJNZ  R2,WR1          ;写入下一个BIT
       SETB  DQ
       RET ;                写入子程序

   READ_1820:          ;将温度高位和低位读出
       MOV   R4,#9           ;读出两个字节的数据
       MOV   R1,#30H   ;低位存入30H,高位存入31h
   RE0:
       MOV   R2,#8           ;数据一共有8位
   RE1:
       CLR   C
       SETB  DQ
       NOP
       CLR   DQ              ;读前总线保持为低
       NOP
       NOP
       NOP
       SETB  DQ              ;开始读总线释放
       MOV   R3,#20
   RE2:
       DJNZ  R3,RE2         ;延时18微妙
      MOV   C, DQ           ;从总线读到一个BIT
      MOV   R3,#100
  RE3: DJNZ  R3,RE3          ;等待50微妙
     RRC   A               ;把读得的位值环移给A
      DJNZ  R2,RE1          ;读下一个BIT
     MOV   @R1,A
      INC   R1
      DJNZ  R4,RE0
     RET;                                                   读取子程序
TURN:MOV A,31H        ;数据分离把整数部分取出放到ZHENGSHU内
     SWAP A
     ANL A,#0F0H
     MOV 40H,A
     MOV A,30H
     ANL A,#0FH
     MOV XIAOSHU,A   ;把小数部分放到XIAOSHU中
     MOV A,30H
     SWAP A
     ANL A,#0FH
     ADD A,40H
     MOV ZHENSHU,A
     JB ZHENSHU.7,FUSHU
     CLR FUS
     RET
FUSHU:MOV A,XIAOSHU
      CPL A
      ANL A,#0FH
      MOV XIAOSHU,A
      MOV A,ZHENSHU
      CPL A
      SETB FUS
      MOV ZHENSHU,A

      RET;         数据转化子程序
SBCDM:   MOV  24H,#062H   ;确定乘数
         MOV  R0,#XIAOSHU   ;计算数据小数
         MOV  A,@R0
         MOV  R1,A	;将被乘数暂存到R1
         MOV  R7,#03H
         CLR  A
         MOV  @R0,A
LOOP0:   MOV	R0,#23H	;指向乘积
         XCHD	A,@R0	;交换底四位
         MOV	R4,A
         MOV	A,@R0	;高四位右移四次
         SWAP   A
         MOV	@R0,A
         INC	R0	;指向乘积
         MOV	A,R4	;取回低四位
         XCHD	A,@R0
         MOV	R2,A	;暂存乘数
         MOV	A,@R0	;乘数高四位右移四次
         SWAP   A
         MOV	@R0,A	;乘数高四位移入低四位
         MOV	A,R2	;判断乘数低四位是否为0
         JZ     LOOP3
         DEC    R0	;指向乘积
         MOV	A,@R0
         MOV	R3,#00h
LOOP1:   CLR	C
         ADD	A,R1
         DA	A
         JNC	LOOP2
         INC	R3
LOOP2:   DJNZ	R2,LOOP1
         MOV	@R0,A
         MOV	A,R3
LOOP3:   DJNZ	R7,LOOP0
         RET
DISPLAY:   ;将29H中的十六进制数成10进制
      MOV   DPTR,#TABLE  ;指定查表启始地址
      MOV A,XIAOSHU    ;小数部分转换为十进制数
      MOV B,#10
      DIV AB
      SWAP A
      ORL A,B
      MOV XIAOSHU,A
      CALL SBCDM
      MOV A,23H
      MOVC A,@A+DPTR
      MOV SJ4,A
      MOV A,24H
      SWAP A
      ANL A,#0FH
      MOVC A,@A+DPTR
      MOV SJ5,A
      MOV   A,29H
      MOV   B,#100           ;10进制/10=10进制
      DIV   AB
      MOV   C_BIT, A        ;百位位在A
      MOV A,#10
      XCH A,B
      DIV AB
      MOV B_BIT,A
      MOV   A_BIT, B        ;个位在B
      MOV A,A_BIT
           ANL A,#0FH
           MOVC A,@A+DPTR
           SUBB A,#040H
           MOV SJ3,A        ;送个位数数据

           MOV A,B_BIT
           MOVC A,@A+DPTR
           MOV SJ2,A        ; 送十位数数据
           JB FUS,FUBIAO
           MOV A,C_BIT
           MOVC A,@A+DPTR
           MOV SJ1,A         ; 送百位数数据
           CJNE A,#041H,QINGBAI
           MOV SJ1,#0ffH
           RET
FUBIAO:    MOV   SJ1,#0FEH
QINGBAI:   RET
;*******************************************显示程序
XIANSHI: 
        MOV     R1,#LCDBUF
TSR_PA: MOV     A,@R1
        CALL    TRANSBYTE
        INC     R1
        CJNE    R1,#LCDBUFEND,TSR_PA
        RET
TRANSBYTE:
        MOV     R0,#8
TSB_PA: RRC     A
        CALL    TRANSBIT
        DJNZ    R0,TSB_PA
        RRC     A
        RET
TRANSBIT:
        MOV     DIPIN,C     ;先送数据到数据口线DI
        SETB    CLKPIN      ;再使时钟口线发一个负脉冲
        CLR     CLKPIN
        SETB    CLKPIN
        RET
YANSS:     MOV R0,#02FH
 YS2:         MOV R1,#0FFH
YS1:          MOV R2,#0FFH
          DJNZ R2,$
          DJNZ R1,YS1
          DJNZ R0,YS2
          RET

DELAY:MOV   R7,#200
      DJNZ  R7,$  ;
      RET                                             ;      延时子程序
YASS: MOV 23H,#01H       ;1.9us
      DJNZ 23H,$
      RET
YASS1:MOV 23H,#01DH      ;14.6us
      DJNZ 23H,$
      RET
YASS2:MOV 23H,#3FH       ;29.6us
      DJNZ 23H,$
      RET
YASS3:MOV 23H,#02H       ;233.2us
YAS1: MOV 24H,#0FFH
       DJNZ 24H,$
       DJNZ 23H,YAS1
       RET
DLY5:   NOP
	NOP
	NOP
	NOP
	RET
TABLE:DB 041H,077H,0C2H,052H,074H,058H ;0,1,2,3,4,5,
      DB 048H,073H,040H,050H,060H,04CH ;6,7,8,9,A,B,
      DB 0C9H,046H,0C8H,0E8H           ;C,D,E,F
            END    ;    程序结束

⌨️ 快捷键说明

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