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

📄 text3.asm

📁 智能温度系统设计,本设计主要通过以单片机为控制单元的温度采集、转化、显示并通过串口将数据传输到PC机
💻 ASM
📖 第 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   TRSINI          ;%%%%%%%%%%%%%%%%%%%%%%%%%%
LCALL   SET_LCD         ;初始化 LCD 12864
LCALL   W18B20          ;初始化18B20
       LCALL  CWD
;********************************************************
WANG:   LCALL   W18B20   ;初始化18B20
LCALL   DU18B20         ;读18B20温度
LCALL   S18B20          ;送温度显视
LCALL   TRSMAIN         ; %%%%%%%%%%%%%%%%%%%%%%%%
LCALL   ANJIAN          ;按键程序
LJMP    WANG 
;============================================================
; #####   传输初始化
;============================================================
     TRSINI:  NOP
              RET
;==============================================================
;对 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           ;显示实际温度值

⌨️ 快捷键说明

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