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

📄 复件 (3) main.asm

📁 饮水机测温度原代码 用汇编语言写超过温度可以报警
💻 ASM
📖 第 1 页 / 共 3 页
字号:
 ;写入DS18B20(有具体的时序要求)
  WRITE_1820: 
       MOV  R2,#8           ;一共8位数据
       CLR  C               ;C=0
    WR1:
       CLR  DQ              ;总线低位,开始写入  
       MOV  R3,#6
       DJNZ R3,$            ;保持16微秒以上
       RRC  A               ;把字节DATA分成8个BIT环移给C
       MOV  DQ, C           ;写入一个BIT
       MOV  R3,#23
       DJNZ R3,$            ;等待
       SETB DQ              ;重新释放总线
       NOP
       DJNZ R2,WR1          ;写入下一个BIT
       SETB DQ              ;释放总线
       RET                                       

 ;―――――――――― 读出DS18B20子程序 ―――――――――――
 ;将温度值从DS18B20中读出(有具体的时序要求)
  READ_1820:    
       MOV  R4,#4                
       MOV  R1,#TEMPL       ;存入25H、26H、27H、28H      
   RE0:
       MOV R2,#8            ;数据一共有8位
   RE1:                  
       CLR C
       SETB  DQ          
       NOP
       NOP                                 
       CLR   DQ             ;读前总线保持为低位               
       NOP
       NOP
       NOP
       SETB  DQ             ;总线释放                 
 ;―――――――――――――
       MOV   R3,#9
       DJNZ  R3,$           ;延时18微妙
       MOV C, DQ            ;从总线读到一个BIT                  
 ;―――――――――――――     
       MOV   R3,#23  ;
       DJNZ R3,$           ;等待50微秒
       RRC  A               ;把读得的位值环移给A
       DJNZ  R2,RE1         ;读下一个BIT
       MOV  @R1,A
       INC  R1              ; R1内数据递增
       DJNZ R4,RE0
       RET                                       

 ;=========== LCD 1602 显示程序 ===========
 ;初始化设置 
  SET_LCD:                   
       CLR   E                
       CALL  INIT_LCD        ;初始化 LCD
       CALL  STORE_DATA      ;将自定义字符存入LCD的CGRAM
       RET

;----------- LCD 初始化子程序 ----------- 
  INIT_LCD:    
      MOV   A,#38H          ;设置8位、2行、5x7点阵  
      ACALL WR_COMM         ; 调用写指令子程序
      ACALL DELAY1          ;调用延时子程序
      MOV   A,#0CH          ;开显示,光标不闪烁
      ACALL WR_COMM         ;调用写指令子程序      ;
      ACALL DELAY1          ;调用延时子程序
      MOV   A,#01H          ;清除 LCD 显示屏
      ACALL WR_COMM         ;调用写指令子程序    ;
      ACALL DELAY1          ;调用延时子程序
      RET

 ;---------- 显示温度标记子程序 -----------
  TEMP_BJ:
     MOV    A, #0CBH       ;设定第二行起始地址
      ACALL  WR_COMM        ;调用写指令子程序
      MOV    DPTR,#BJ       ;存代码表
      MOV    R1 ,#0         ;使指针指到表中第一个码
      MOV    R0 ,#2         ;取码次数
  TP1:     
      MOV    A,R1           ;A为0
      MOVC   A,@A+DPTR      ;取码
      ACALL  WR_DATA        ;调用写数据子程序
      INC    R1             ;R1值加1
      DJNZ   R0,TP1         ;判断是否将代码读取完?
      RET      
 ;―――――――――――――
  BJ:                       ;代码表
    DB  00H, "C"                           
;―――――――――――――

;----------- 自定义字符子程序 -----------
 ;将自定义字符写入LCD1602的CGRAM中
  STORE_DATA:
       MOV    A,#40H      ;指定CG RAM起始地址
       ACALL  WR_COMM     ;将指令写入LCD
       MOV    R2,#08H     ;图形数据长度8个字节
       MOV    DPTR,#TAB   ;存代码表
       MOV    R3,#00H     ;使指针指到表中第一个码
  S_D: MOV    A,R3        ;A为0
       MOVC   A,@A+DPTR   ;读取表代码
       ACALL  WR_DATA     ;调用写入数据指令
       INC    R3          ;R3值加1
       DJNZ   R2, S_D     ;判断是否将代码读取完?
       RET                ;
 ;―――――――――――――
  TAB:                 ;代码表
    DB  0CH,12H,12H,0CH
    DB  00H,00H,00H,00H                             
 ;―――――――――――――-

;----------- 显示"OK"信息子程序 ---------
  MEU_OK:
       MOV    DPTR,#M_OK1   ;指针指到显示消息
       MOV    A,#1          ;显示在第一行
       ACALL  LCD_PRINT     ;LCD显示
       MOV    DPTR,#M_OK2   ;指针指到显示消息
       MOV    A,#2          ;显示在第一行
       ACALL  LCD_PRINT     ;LCD显示
       RET
 ;――――――――――――――
  M_OK1:
     DB   "   DS18B20 OK   ",0
    ;	DB "2",0
  M_OK2:
     DB   " TEMP:          ",0
 ;――――――――――――――

 ;----------显示"ERROR"信息子程序------―――
  MEU_ERROR:
       MOV   DPTR,#M_ERROR1 ;指针指到显示消息1
       MOV   A,#1           ;显示在第一行
       ACALL LCD_PRINT      ;调用菜单显示子程序
       MOV   DPTR,#M_ERROR2 ;指针指到显示消息1
       MOV   A,#2           ;显示在第一行
       ACALL LCD_PRINT      ;调用菜单显示子程序
       RET
 ;---------------
  M_ERROR1:                 ;代码表
      DB   " DS18B20 ERROR  ",0
  M_ERROR2:
      DB   " TEMP: ----     ",0
 ;---------------

 ;------――――― 菜单显示子程序 ―――――――-----
 ;在LCD的第一行或第二行显示字符
  LCD_PRINT:       
       CJNE  A,#1,LINE2      ;判断是否为第一行
  LINE1:  
       ACALL  CLR_LINE       ;清除该行字符数据
       MOV    A,#80H         ;设置 LCD 的第一行地址
       ACALL  WR_COMM        ;写入命令
       JMP    FILL
  LINE2: 
       ACALL  CLR_LINE       ;清除该行字符数据
       MOV    A,#0C0H        ;设置 LCD 的第二行地址
       ACALL  WR_COMM
  FILL:
       CLR    A              ;填入字符
       MOVC   A,@A+DPTR      ;由消息区取出字符
       CJNE   A,#0,LC1       ;判断是否为结束码
       RET
  LC1: 
       ACALL  WR_DATA        ;写入数据
       INC    DPTR           ;指针加1
       JMP    FILL           ;继续填入字符
       RET

 ;---------― LCD显示子程序 ----------
  CONV:
       MOV  A,73H           ;加载百位数据
       MOV  X,#6            ;设置位置
       CJNE A,#1,CO1
       JMP  CO2
  CO1:   
       MOV  A,#" "
      MOV  B,X
        ACALL  LCDP2
        JMP    CO3
  CO2:    
        ACALL  SHOW_LINE2    ;显示数据
  CO3:  INC    X             ;位加1
        MOV    A,72H         ;十位
        ACALL  SHOW_LINE2    ;显示数据
        INC    X             ;位加1
        MOV    A,  71H       ;个位
        ACALL  SHOW_LINE2    ;显示数据
        INC    X             ;位加1  
        MOV    A,#'.'
        MOV    B,X
        ACALL  LCDP2         ;显示字符
        MOV    A,70H         ;加载小数点位
        INC    X             ;设置位置
        ACALL  SHOW_LINE2    ;显示数据
        RET

;-----―― 显示第二行 -----―――
 ;在 LCD 的第二行显示数字     
  SHOW_LINE2:                 
      ADD   A,#30H
       MOV   B,X
      ACALL LCDP2
       RET
  LCDP2:                    ;在LCD的第二行显示字符
       PUSH  ACC            ;放入堆栈
       MOV   A,B            ;设置显示地址
       ADD   A,#0C0H        ;设置LCD的第二行地址
       ACALL WR_COMM        ;写入命令
       POP   ACC            ;由堆栈取出A
       ACALL WR_DATA        ;写入数据
       RET

 ;-----―――――― 写指令子程序 ――――――――――--
  WR_COMM:                     
      MOV   P1,A            ;写入指令
      CLR   RS              ;RS=0,选择指令寄存器
      CLR   RW              ;RW=0,选择写模式
      SETB  E               ;E=1,允许读/写LCM
      ACALL DELAY1          ;延时5MS
      CLR   E               ;E=0,禁止读/写LCM
      RET                                  

 ;---------――― 写数据子程序 ------------
  WR_DATA:                  
      MOV   P1,A            ;写入数据
      SETB  RS              ;RS=1,选择数据寄存器
      CLR    RW             ;RW=0,选择写模式
      SETB   E              ;E=1,允许读/写LCM
      ACALL  DE             ;延时0.5MS
      CLR    E              ;E=0,禁止读/写LCM
      ACALL  DE             ;延时0.5MS
      RET          

 ;---------- 清除LCD 的字符-------------
  CLR_LINE:                  
      MOV    R0,#24         ;设置计数值
  CL1: MOV   A,#' '         ;载入空格符至LCD
      ACALL  WR_DATA        ;输出字符至LCD
      DJNZ   R0,CL1         ;判断
      RET
 ;--------------
  CLR_LINE1:               ;清除LCD的第一行字符
       MOV    A,#80H       ;设置 LCD 的第一行地址
       ACALL  WR_COMM      ;调用写指令子程序
       MOV    R0,#24       ;设置计数值
  C1:  MOV    A,#' '       ;载入空格符至LCD
       ACALL  WR_DATA      ;输出字符至LCD
       DJNZ   R0,C1        ;计数结束
       RET

 ;------------- 鸣响子程序------------
  SPK_BZ:
       MOV    R6,#100
  BZ2:  ACALL  DEX1
       CPL    SPK
       DJNZ   R6,BZ2
       MOV    R5,#10
       ACALL  DELAY
       RET
 DEX1:  MOV   R7,#180
 DE2:   NOP
       DJNZ   R7,DE2
       RET

 ;-------------延时子程序-------------
  DELAY:                    ;延时时间为:R5×10MS
  DL1: MOV   R7,#100
       DJNZ  R7,$
       DJNZ  R6,DL1
       DJNZ  R5,DELAY
       RET
 ;―――――――――――――
  DELAY1:                    ;延时时间为5MS
       MOV   R6,#25
  DL2: MOV   R7,#100
       DJNZ  R7,$
       DJNZ  R6,DL2
       RET
 ;―――――――――――――
  DE:
      MOV   R7,#250          ;延时时间为0.5MS
      DJNZ  R7,$
      RET
 ;-----------――  
      END

⌨️ 快捷键说明

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