微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求教 为什么用1602显示温度的时候温度一直不变 调节ds18b20a温度也不变一直一样

求教 为什么用1602显示温度的时候温度一直不变 调节ds18b20a温度也不变一直一样

时间:10-02 整理:3721RD 点击:
      DQ bit p3.3
                  
                  tmph data 28h
                  tmpl data 29h
                  temp_xiao equ 30h
      temp_ge   equ 31h
      temp_shi  equ 32h
      temp_bai  equ 33h
      now data 40h;存放当前时间,日期首地址
      IO bit p1.1
      sclk bit p1.0
      rst bit p1.2
                  RS  BIT  P2.0 ;这3位是液晶屏的控制信号,连接方式由具体硬件而定
                  RW  BIT  P2.1
               E   BIT  P2.2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      org 0000h
      jmp reset
      org 0030h
      reset:mov sp,#60h            
            main:
                  call DS18B20_Reset
                  mov a,#0cch
                  call DS18B20_Write
                  mov a,#44h
               call DS18B20_Write
           led_1:
               call DS18B20_Reset
                  mov a,#0cch
                  call DS18B20_Write
               mov a,#0beh
               call DS18B20_Write
               call DS18B20_Read
               mov tmpl,a
                  call DS18B20_Read
                  mov tmph,a
                  lcall Cvttmp
      lcall disp
                  lcall delay_1
                  lcall delay_1
         ajmp main
      
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      disp:   LCALL  INITIAL         
           DISP1: MOV  A,#30H
                    ORL  temp_bai, A
                    ORL  temp_shi, A
                    ORL  temp_ge, A
                    ORL     temp_xiao, A
      DISP2:  MOV  A,temp_bai
                 LCALL WRITE_LCDDATA
   
                    MOV  A,temp_shi
                    LCALL  WRITE_LCDDATA
     
                    MOV  A,temp_ge
                    LCALL  WRITE_LCDDATA
     
                    MOV  A,#2EH                ;'.'字符
              LCALL  WRITE_LCDDATA
     
                    MOV  A,temp_xiao
                    LCALL  WRITE_LCDDATA
                    MOV  A,#0DFH               ;下面两个是摄氏度的数字符号
                    LCALL  WRITE_LCDDATA
                    MOV  A,#43H
                    LCALL  WRITE_LCDDATA
   
                 RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
   Cvttmp:mov a,tmph
                   anl a,#08h
             jz Tmpc1
                   clr c
                   mov a,tmpl
                   cpl a
                   add a,#1
                   mov tmpl,a
                   mov a,tmph
                   cpl a
                addc a,#0
                   mov tmph,a
                   mov temp_bai,#2DH;在百位数位置放负号
                   sjmp Tmpc11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          Tmpc1:mov temp_bai,#20H    ;温度为正值
          Tmpc11:mov a,tmpl
                 anl a,#0fH
                 mov dptr,#Tmptab
                 movc a,@a+dptr
                 mov temp_xiao,a
                 mov a,tmpl
                 anl a,#0f0h
                 swap a
                 mov tmpl,a
                 mov a,tmph
                 anl a,#0fh
                 swap a
                 orl a,tmpl
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
         H2bcd:mov b,#100
               div ab
               jz B2bcd1
               mov temp_bai,a
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
         B2bcd1:mov a,#10
                xch a,b
                div ab
                mov temp_shi,a
                mov temp_ge,b
         Tmpc12:nop
         Disbcd:mov a,temp_bai
          anl a,#0fh
                cjne a,#01,Disbcd0
          ret
         Disbcd0:mov a,temp_ge
            anl a,#0fh
                 jnz Disbcd1
                 mov a,temp_bai
                 mov temp_ge,a
                 mov temp_bai,#20H
         Disbcd1:ret
         tmptab:db 0,1,2,3,3,4,4,5,6,6,7,8,8,9,9
     
  
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   DS18B20_Reset:
                 clr DQ
              mov r7,#48
                 call delay_0
                 setb DQ
              mov r7,#6
                 call delay_0
                 mov c,DQ
                 mov r7,#42
              call delay_0
                 jc DS18B20_Reset
               ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        delay_0:
               nop
               nop
               nop
               nop
               nop
               nop
               nop
               nop
               djnz r7,delay_0
               ret
        delay_1:mov r6,#50
        dl1:    mov r7,#50
                djnz r7,$
                djnz r6,dl1
                ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       DS18B20_Write:
            push b
               mov b,#08
       write_0:   
               clr DQ
               nop
               nop
               rrc a
               mov DQ,c
               mov r7,#6
               call delay_0    ;延时时间
            setb DQ
               djnz b,write_0
               pop b
               ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      DS18B20_Read:
             clr a
             push b
             mov b,#08
      read_0:
             clr DQ
             nop
             nop
             setb DQ
             nop
             nop
             mov c,DQ
             rrc a
             mov r7,#6
             call delay_0;延迟时间
             djnz b,read_0
             pop b
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;---液晶屏初始化,具体请参考资料-------------------------------------------------
INITIAL:
        
      
        MOV   A, #38H
        LCALL  WRITE_INSTRUCTION
        MOV   A, #0cH
        LCALL  WRITE_INSTRUCTION
        MOV   A, #06H
        LCALL  WRITE_INSTRUCTION
  MOV   A, #01H
        LCALL  WRITE_INSTRUCTION
        RET
;----写液晶指令的子程序------------------------------------------
WRITE_INSTRUCTION:
  MOV  P0, A
        CLR  RS ;写入控制命令
        CLR  RW
  lcall DELAY1MS
        clr  E
  lcall DELAY1MS
        LCALL  DELAY
        setb  E
        RET
;----写液晶数据的子程序---------------------------------------------
WRITE_LCDDATA:
  MOV  P0,A
        SETB  RS ;写入数据
        CLR  RW
     lcall DELAY1MS  
        clr  E
     lcall DELAY1MS
  LCALL  DELAY
        ;判断液晶模块是否忙?
     setb  E
        RET
;----查看液晶忙碌信号的子程序---------------------------------------------------------
DELAY:  MOV  P0,#0FFH ;判断液晶显示器是否忙的子程序
        CLR  RS
        SETB  RW
        CLR  E
        NOP
        SETB  E
        JB   P0.7,DELAY ;如果P0.7为高电平表示忙就循环等待
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1MS:
  MOV R6,#66H
DL10:
    MOV R5,#03H
    DJNZ R5,$    ;延时1ms
    DJNZ R6,DL10
    RET
end     

一、18B20的读取程序是不是有问题
二、1602的刷新频率问题

汇编很牛啊,数字钟+温度计

之前用c写过,汇编不懂,温度显示85一直不变,后来改了几次发现是读写时序的问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top