关于数字温度计的问题
这是我的仿真图,但是数码管不会显示温度啊~~
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
这个是代码,各位大神帮忙看看是哪里错了~~
大神有木有~~~快来帮帮我撒
你先看看你的硬件吧,你看看你的数码管上已经有高低电瓶的变化了,就说明可以显示了,即使是乱码,还有数码管最好不要引脚直接驱动!
你先把温度值给去掉,直接赋一个初始值给数码管看看能不能正常显示。现查数码管的显示先
数码管用三极管放大电路驱动,这样芯片的输出电流就不用那么多了,你试试吧