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

📄 18b20application.txt

📁 用汇编语言写的18B20写的温度测量和显示程序,采用LCD显示.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;********************************************************
;************************显视温度************************
;********************************************************
COUNT DATA    30H     ;地址计数常数
WENDU   DATA    32H     ;实际温度地址
WENDUD DATA    33H     ;温度低位地址
WENDUG DATA    34H     ;温度高位地址
SDWDG DATA    35H     ;设定高温度地址
SDWDD DATA    36H     ;设定低温度地址 
;----------------------------------------------------------------
RS      EQU    P2.0 ;
RW      EQU    P2.1 ;
E       EQU    P2.2 ;
PSB     EQU    P2.3 ;
RST     EQU    P2.5 ;
SHUJU   EQU    P3.3 ;
K1      EQU    P1.4 ;按键1,设定温度值减1
K2      EQU    P1.5 ;按键2,设定温度值加1
K3      EQU    P1.6 ;按键3,确定修改和确定退出
;============================================================
   ORG 0000H
   JMP MAIN
   ORG 0040H
;============================================================
MAIN: CLR P3.7
LCALL   SET_LCD         ;初始化 LCD 12864
LCALL   W18B20          ;初始化18B20
LCALL CWD
;********************************************************
WANG:   LCALL   W18B20   ;初始化18B20
LCALL   DU18B20         ;读18B20温度
LCALL   S18B20          ;送温度显视
LCALL   ANJIAN          ;按键程序
LJMP    WANG 
;==============================================================
;对 LCD12864 做初始化设置
;==============================================================
SET_LCD:
SETB PSB             ;通讯方式为8位数据并口
MOV A,#34H            ;34H--扩充指令操作
LCALL SEND_I
MOV A,#30H            ;30H--8bit控制界面,基本指令操作
LCALL SEND_I
MOV A,#01H            ;清除显示
LCALL SEND_I
MOV A,#06H            ;指定在资料写入或读取时,光标的移动方向
LCALL SEND_I          ;DDRAM 的地址计数器(AC)加1
MOV A,#0CH            ;开显示,关光标,不闪烁
LCALL SEND_I
RET
;==============================================================
;写指令子程序
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;==============================================================
SEND_I: LCALL CHK_BUSY
CLR RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
CLR E
RET
;==============================================================
;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;==============================================================
CHK_BUSY:
MOV P0,#0FFH    ;测忙碌子程序
CLR RS
SETB RW
SETB E
JB   P0.7,$
CLR E
RET 
;==============================================================
;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器(暂时用不到)
;==============================================================
CWD: LCALL W18B20
        MOV A,#0CCH        ;跳过ROM匹配
        LCALL XIEB20
        MOV A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器
        LCALL XIEB20
        RET

;***************************************************
;DS18B20 复位与检测子程序
;SHUJU=1 OK, SHUJU=0 ERROR
;****************************************************   
W18B20: SETB    SHUJU
NOP
CLR     SHUJU
MOV     R0,#64H         ; 主机发出延时600微秒的复位低脉冲
MOV     R1,#03H
W11: DJNZ    R0,$
MOV     R0,#64H
DJNZ    R1,W11 
SETB    SHUJU           ; 然后拉高数据线
NOP
MOV     R0,#25H
WW2: JNB     SHUJU,WW3       ; 等待DS18B20回应
DJNZ    R0,WW2
JMP     WW4             ; 延时
WW3:    SETB    20H.0          ; 置标志位,表示DS1820存在
JMP     WW5
WW4:   CLR     20H.0          ; 清标志位,表示DS1820不存在
JMP     WW6
WW5:   MOV     R0,#064H
DJNZ    R0,$            ; 时序要求延时一段时间
WW6:   SETB    SHUJU
JNB 20H.0,AAAA ;DS18B20出错
RET
;==============================================================
;DS18B20错误时LCD显示子程序
;==============================================================
AAAA: MOV DPTR,#M_ERROR1 ;指针指到显示信息区
MOV COUNT,#10H       ;地址计数器设为16
MOV A,#80H          ;第一行起始地址
   LCALL SEND_I        ;调用写指令子程序
LCALL QUSHU

MOV DPTR,#M_ERROR2 ;指针指到显示信息区
MOV COUNT,#10H       ;地址计数器设为16
MOV A,#90H          ;第二行起始地址
   LCALL SEND_I        ;调用写指令子程序
LCALL QUSHU

   MOV DPTR,#M_ERROR3 ;指针指到显示信息区
   MOV COUNT,#10H       ;地址计数器设为16
   MOV A,#88H          ;第三行起始地址
   LCALL SEND_I        ;调用写指令子程序
   LCALL QUSHU

MOV DPTR,#M_ERROR4 ;指针指到显示信息区
   MOV COUNT,#10H       ;地址计数器设为16
          MOV A,#98H          ;第四行起始地址
LCALL SEND_I        ;调用写指令子程序
          LCALL QUSHU
   LCALL MING1
         RET
;--------------------------------------------------------------
;                       读18B20温度
;***********************************************************
DU18B20:
MOV     A,#0CCH ;
LCALL   XIEB20
MOV     A,#44H ;发出温度转换命令
LCALL   XIEB20 ;
LCALL   W18B20 ;
MOV     A,#0CCH ;
LCALL   XIEB20 ;写18B20指令
MOV     A,#0BEH ;发出读温度命令
LCALL   XIEB20 ;       
LCALL   WDSJ    ;温度数据
RET 
;===========================================================
;写入18B20指令
;===========================================================
XIEB20: MOV     R2,#8           ;一共8位数据
CLR     CY
XIE: CLR     SHUJU           ;开始写入DS18B20总线要处于复位(低)状态
MOV     R3,#09
DJNZ    R3,$            ;总线复位保持18微妙以上
RRC     A               ;把一个字节DATA 分成8个BIT环移给C
MOV     SHUJU,C         ;写入一个BIT
MOV     R3,#23
DJNZ    R3,$            ;等待46微妙
SETB    SHUJU           ;重新释放总线
NOP
DJNZ    R2,XIE          ;写入下一个BIT
SETB    SHUJU
RET
;******************************************************
;读温度子程序
;从DS18B20中读出温度低位、高位,
;存入33H,34H,35H,36H
;****************************************************
WDSJ:   MOV     R4,#04H
MOV     R1,#33H          ; 存入33H,34H
RE00: MOV     R2,#8
RE01: CLR     C
SETB    SHUJU
NOP
NOP
CLR     SHUJU            ;读前总线保持为低
NOP
NOP
NOP
SETB    SHUJU            ;开始读总线释放
MOV     R3,#07           ;延时15微妙
DJNZ    R3,$
MOV     C,SHUJU          ;从DS18B20总线读得一个BIT
MOV     R3,#23
DJNZ    R3,$             ;等待46微妙
RRC     A                ;把读得的位值环移给A
DJNZ    R2,RE01          ;读下一个BIT
MOV     @R1,A
INC     R1
DJNZ    R4,RE00
LCALL WDCZ
RET
;==============================================================
;处理入水口实际水温度 BCD 码子程序(未考虑百位和负温度值)
;整数部分:取出 WENDUD 高四位和 WENDUG 低四位进行重新组合
;小数部分:取出 TEMPL1 低四位,查小数码表
;小数部分:73H;个位:74H;十位:75H
;==============================================================
WDCZ:
         MOV A,WENDUD
         ANL A,#0FH              ;取出小数部分
         MOV B,#10               ;将TEMP_L的低四位X10/16得小数后一位数.
         MUL AB
         MOV B,#16
         DIV AB
         MOV 73H,A               ;小数部分 BCD

         MOV A,WENDUD            ;整数部分
         ANL A,#0F0H             ;取出高四位
         SWAP A
         MOV WENDUD,A
         MOV A,WENDUG            ;取出低四位
         ANL A,#0FH
         SWAP A
         ORL A,WENDUD            ;重新组合温度数据
         MOV WENDU,A           ;重新组合的温度数据存入WENDU
         LCALL HEX2BCD1

         MOV WENDUD,A            ;(A)=十位数和个位数
         ANL A,#0F0H
         SWAP A
         MOV 75H,A               ;十位数 BCD
         MOV A,WENDUD
         ANL A,#0FH
         MOV 74H,A               ;个位数 BCD                   
         RET 
;==============================================================
;单字节十六进制转BCD
;入口:(A)=单字节十六进制的温度值
;出口:(A)=十位数和个位数
;==============================================================
HEX2BCD1:
         MOV B,#0AH
         DIV AB
         SWAP A
         ORL A,B              ;(A)=个位数和十位数
         RET
;**********************************************************
;**********************送显示******************************
;**********************************************************
S18B20: 
MOV DPTR,#M_OK2       ;指针指到显示信息区
MOV COUNT,#10H         ;地址计数器设为16
MOV A,#80H            ;第一行起始地址
LCALL SEND_I          ;调用写指令子程序
LCALL QUSHU
LCALL SHOW_D         ;显示设定的恒温水温度值

MOV DPTR,#M_OK1       ;指针指到显示信息区
MOV COUNT,#10H         ;地址计数器设为16
MOV A,#90H            ;第二行起始地址
LCALL SEND_I          ;调用写指令子程序
LCALL QUSHU
LCALL SHOW_G         ;显示设定的恒温水温度值

MOV DPTR,#M_OK3       ;指针指到显示信息区
MOV COUNT,#10H         ;地址计数器设为16
MOV A,#88H            ;第三行起始地址
LCALL SEND_I          ;调用写指令子程序
LCALL QUSHU
LCALL SHOW_S           ;显示实际温度值

MOV DPTR,#M_OK4        ;指针指到显示信息区

⌨️ 快捷键说明

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