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

📄 ad1405.asm

📁 ds18b20的驱动程序
💻 ASM
字号:
; 文件名:AD1405.ASM
; 程序功能:数字温度计 ,已调好

       A_BIT   EQU  20H     ;存放个位数变量
       B_BIT   EQU  21H     ;存放十位数变量
       FLAG    EQU  38H     ;DS18B20是否存在标志
       DQ      EQU  P2.5    ;DQ引脚由P2.5控制  
  MAIN:                     ;主程序标号
       ACALL  RE_TEMP      ;对传感器设置及读取 
       ACALL   TURN     ;转化温度子程序        
       ACALL DISPLAY        ;显示子程序
       JMP MAIN             ;循环                   
 
  RE_TEMP:         ;对DS18B20初始化及读取
       SETB   DQ           
       ACALL  RESET_1820    ;调用复位子程序
       JB   FLAG, ST        ;判断DS1820是否存在?
       RET                                           
 
  ST:                       ; DS18B20存在
       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       
 ;――――――――――――
 ;主机发出延时537微秒的复位低脉冲
       MOV  R1,#3
   DLY: MOV  R0,#107
       DJNZ R0,$
       DJNZ R1,DLY
 ;――――――――――――
 ;然后拉高数据线
       SETB  DQ        
       NOP
       NOP
       NOP
 ;――――――――――――  
       MOV  R0,#25H        
   T2: JNB   DQ ,T3       ;等待DS18B20回应
       DJNZ  R0, T2
       JMP  T4          
 ;――――――――――――
   T3: SETB  FLAG      ;置标志位,表示DS1820存在
       JMP  T5
 ;――――――――――――
   T4: CLR   FLAG     ;清标志位,表示DS1820不存在     
       JMP  T7
  ;――――――――――――
   T5: MOV  R0,#117
   T6: DJNZ R0,T6           ;时序要求延时一段时间
 ;――――――――――――
   T7: SETB   DQ        
       RET                                           
 ;――――――――――――

  WRITE_1820: ;写入DS18B20(有具体的时序要求)
       MOV  R2,#8           ;一共8位数据
       CLR  C
    WR1:
       CLR  DQ            ;总线低位,开始写入  
       MOV  R3,#7
       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                                            

   READ_1820: ;将温度高位和低位从DS18B20中读出
       MOV  R4,#2           ; 读出两个字节的数据
       MOV  R1,#29H     ;低位存入29H,高位存入28h
   RE0:
       MOV R2,#8           ;数据一共有8位
   RE1:                  
       CLR C
       SETB  DQ          
       NOP
       NOP                                 
       CLR   DQ          ;读前总线保持为低               
       NOP
       NOP
       NOP
       SETB  DQ          ;开始读总线释放                 
       MOV   R3,#9
   RE2:   
       DJNZ  R3,RE2        ;延时18微妙
      MOV C, DQ         ;从总线读到一个BIT                  
      MOV R3,#23
  RE3:                    ;
      DJNZ R3,RE3         ;等待100秒
      RRC  A              ;把读得的位价值环移给A
      DJNZ  R2,RE1        ;读下一个BIT
      MOV  @R1,A
      DEC  R1
      DJNZ R4,RE0
      RET                                         

  TURN: 
      MOV  A,29H
      MOV  C,40H          ;将28中的最低位移入C
      RRC  A
      MOV  C,41H
      RRC  A
      MOV  C,42H
      RRC  A
      MOV  C,43H
      RRC  A
      MOV  29H,A
      RET                                           

  DISPLAY:   ;将29H中的十六进制数成10进制
      MOV  A,29H         
      MOV  B,#10             ;10进制/10=10进制
      DIV  AB
      MOV  B_BIT, A        ;十位在A
      MOV  A_BIT, B        ;个位在B
      MOV  DPTR,#TABLE     ;指定查表启始地址
      MOV  R0,#4
  DP1:
      MOV R1, #250          ;显示1000次
  LOOP:
      MOV A,A_BIT          ;取个位数
      MOVC A,@A+DPTR       ;查个位数的7段代码
      MOV  P0,A            ;送出个位的7段代码
      CLR  P2.1            ;开个位显示
      ACALL DELAY          ;
      SETB  P2.1
      MOV A,B_BIT          ;取十位数
      MOVC  A,@A+DPTR      ;查十位数的7段代码
      MOV  P0,A            ;送出个十位的7段代码
      CLR  P2.0            ;开十位显示
      ACALL  DELAY         ;显示1MS
      SETB  P2.0
      DJNZ  R1,LOOP        ;250次没完循环
      DJNZ  R0,DP1         ;4个250次没完循环
      RET                                         
   DELAY:  ;10Ms延时
      MOV  R4,#5
	  MOV  R6,#100
	  MOV  R7, #250
      DJNZ R7,$
	  DJNZ R6, $
	  DJNZ R4, $
      RET                                           


  TABLE:       ;数码管共阳极0~9代码
      DB 0C0H,0F9H,0A4H,0B0H,99H
      DB 92H,82H,0F8H,80H,90H                       

      END                                          
   

⌨️ 快捷键说明

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