微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于数字温度计的问题

关于数字温度计的问题

时间:10-02 整理:3721RD 点击:

这是我的仿真图,但是数码管不会显示温度啊~~

ORG 0000H               ; 0-125度的温度计
TEMPER_L  EQU 41H       ;用于保存读出温度的低8位        
TEMPER_H  EQU 40H       ;用于保存读出温度的高8位
FLAG1   EQU 38H         ;是否检测到DS18B20标志位
A_BIT1   EQU  30H       ;数码管小数点位数存放内存位置
B_BIT1   EQU  31H       ;数码管个位数存放内存位置
C_BIT1   EQU  32H       ;数码管十位数存放内存位置
D_BIT1   EQU  33H       ;数码管百位数存放内存位置
DQ   EQU  P3.7          ;30H,31H,32H,33H:   小数点位  个位  十位  百位
MOD7:   MOV   SP,#60H               
        LCALL GET_TEMPER        ;调用读温度子程序
        LCALL TEMPCOV                     
        LCALL DISPLAY           ;调用数码管显示子程序
        AJMP  MOD7                       
TEMP0:  INC   A                           
        AJMP  TEMP1                       
TEMPCOV:MOV   A,TEMPER_L        ;数据处理子程序TEMPCOV
        MOV   B,#10H                  
        div   AB                        
        JB    B.3,TEMP0                  
TEMP1:  MOV   34H,A   ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
        MOV   A,B           ;将TEMPER_L的低四位X10/16得小数后一位数
        MOV   B,#0AH                 
        MUL   AB                     
        MOV   B,#10H                  
        div   AB                       
        MOV   30H,A            ;将小数后一位数.存入30H中
        MOV   A,TEMPER_H       ;TEMPER_H中存放高8位数,权重16
        MOV   B,#10H                 
        MUL   AB                          
        ADD   A,34H            ;34H中存入温度值的整数部分
        MOV   B,#0AH               
        div   AB                    
        MOV   31H,B            ;个位存入31H中
        MOV   B,#0AH                 
        div   AB                     
        MOV   32H,B            ;十位存入32H中
        MOV   B,#0AH                  
        div   AB                     
        MOV   33H,B            ;百位存入33H中
        MOV   A,TEMPER_H                    
        MOV   34H,#10H                  
        JB    ACC.7,EXIT7                 
        MOV   34H,#00H                  
EXIT7:  RET;                   ;这是DS18B20复位初始化子程序                             
INIT_1820: SETB  DQ                     
           NOP                           
           CLR   DQ            ;主机发出延时537微秒的复位低脉冲
           MOV   R1,#03H                  
TSR1:      MOV   R0,#6BH                    
           DJNZ  R0,$                       
           DJNZ  R1,TSR1                  
           SETB  DQ              ;然后拉高数据线
           NOP                              
           NOP                              
           NOP                              
           MOV   R0,#25H                     
TSR2:      JNB   DQ,TSR3         ;等待DS18B20回应
           DJNZ  R0,TSR2                    
           LJMP  TSR4            ;延时
TSR3:      SETB  FLAG1           ;置标志位,表示DS1820存在
           LJMP  TSR5                     
TSR4:      CLR   FLAG1           ;清标志位,表示DS1820不存在
           LJMP  TSR7                       
TSR5:      MOV   R0,#75H                  
           DJNZ  R0,$            ;时序要求延时一段时间
TSR7:      SETB  DQ                       
           RET                 ;读出转换后的温度值
GET_TEMPER:SETB  DQ                       
           LCALL INIT_1820       ;先复位DS18B20
           JB    FLAG1,TSS2               
           RET                  
TSS2:      MOV   A,#0CCH         ;跳过ROM匹配
           LCALL WRITE_1820                     
           MOV   A,#44H        ;发出温度转换命令
           LCALL WRITE_1820                       
           LCALL DISPLAY       ;等待AD转换结束,12位的话750微秒
           LCALL INIT_1820     ;准备读温度前先复位
           MOV   A,#0CCH       ;跳过ROM匹配
           LCALL WRITE_1820                    
           MOV   A,#0BEH       ;发出读温度命令
           LCALL WRITE_1820               
           LCALL READ_1820     ;将读出的温度数据保存到35H/36H
           RET                 ;写DS18B20的子程序(有具体的时序要求)                           
WRITE_1820: MOV   R2,#08H      ;一共8位数据
            CLR   C                          
WR1:        CLR   DQ                       
            MOV   R3,#06H                     
            DJNZ  R3,$                        
            RRC   A                           
            MOV   DQ,C                     
            MOV   R3,#17H                     
            DJNZ  R3,$                        
            SETB  DQ                       
            NOP                              
            DJNZ  R2,WR1                    
            SETB  DQ                        
            RET  ;读DS18B20的程序,从DS18B20中读出两个字节的温度数据                              
READ_1820:  MOV   R4,#02H           ;将温度高位和低位从DS18B20中读出
          MOV   R1,#TEMPER_L        ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00:       MOV   R2,#08H           ;数据一共有8位
RE01:       CLR   C                          
            SETB  DQ                       
            NOP                             
            NOP                              
            CLR   DQ                        
            NOP                              
            NOP                              
            NOP                              
            SETB  DQ                        
            MOV   R3,#09H                    
            DJNZ  R3,$                       
            MOV   C,DQ                     
            MOV   R3,#17H                     
            DJNZ  R3,$                        
            RRC   A                           
            DJNZ  R2,RE01                    
            MOV   @R1,A                     
            DEC   R1                        
            DJNZ  R4,RE00                    
            RET                          ;显示子程序
DISPLAY:    MOV   DPTR,#TAB              ;指定查表启始地址
            MOV   R0,#04H                     
DPL1:       MOV   R1,#0FAH               ;显示1000次
DPLOP:      MOV   A,A_BIT1               ;取小数点后位数
            MOVC  A,@A+DPTR              ;查小数点后位数的7段代码
            MOV   P1,A                   ;送出小数点后位的7段代码
            CLR   P3.2                   ;开小数点后位显示
            ACALL D1MS                   ;显示1MS
            SETB  P3.2         
            MOV DPTR,#TAB2               ;个位需要小数点点亮                                    
            MOV   A,B_BIT1               ;取个位数
            MOVC  A,@A+DPTR              ;查个位数的7段代码
            MOV   P1,A                   ;送出个位的7段代码
            CLR   P3.3                   ;开个位显示
            ACALL D1MS                   ;显示1MS
            SETB  P3.3           
            MOV DPTR,#TAB                ;重新为DPTR赋TAB值                                    
            MOV   A,C_BIT1               ;取十位数
            MOVC  A,@A+DPTR              ;查十位数的7段代码
            MOV   P1,A                   ;送出十位的7段代码
            CLR   P3.4                   ;开十位显示
            ACALL D1MS                   ;显示1MS
            SETB  P3.4                        
            MOV   A,D_BIT1               ;取百位数
            MOVC  A,@A+DPTR              ;查百位数的7段代码
            MOV   P1,A                   ;送出百位的7段代码
            CLR   P3.5                   ;开百位显示
            ACALL D1MS                   ;显示1MS
            SETB  P3.5                        
            MOV   P1,#00H                     
            DJNZ  R1,DPLOP               ;小于100次循环
            DJNZ  R0,DPL1                ;小于4个100次循环
            RET                          ;1MS延时(按12MHZ算)
D1MS:       MOV   R7,#0FFH                     
            DJNZ  R7,$                        
            DJNZ  R7,$                        
            RET                          
实验板上的7段数码管0~9数字的共阴显示代码
TAB:        DB  3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
TAB2:       DB  0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH           
END

这个是代码,各位大神帮忙看看是哪里错了~~

大神有木有~~~快来帮帮我撒

你先看看你的硬件吧,你看看你的数码管上已经有高低电瓶的变化了,就说明可以显示了,即使是乱码,还有数码管最好不要引脚直接驱动!

你先把温度值给去掉,直接赋一个初始值给数码管看看能不能正常显示。现查数码管的显示先

数码管用三极管放大电路驱动,这样芯片的输出电流就不用那么多了,你试试吧

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

网站地图

Top