专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
【求助】关于数字温度计的问题
2019-07-15 13:43
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
16462
5
1455
这是我的
仿真
图,但是数码管不会显示温度啊~~
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
cvvbbo
1楼-- · 2019-07-15 16:07
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
这个是代码,各位大神帮忙看看是哪里错了~~
加载中...
cvvbbo
2楼-- · 2019-07-15 18:50
大神有木有~~~快来帮帮我撒
加载中...
langzitianya
3楼-- · 2019-07-15 22:18
你先看看你的硬件吧,你看看你的数码管上已经有高低电瓶的变化了,就说明可以显示了,即使是乱码,还有数码管最好不要引脚直接驱动!
加载中...
风之纱
4楼-- · 2019-07-16 00:44
你先把温度值给去掉,直接赋一个初始值给数码管看看能不能正常显示。现查数码管的显示先
加载中...
南宫炎舜
5楼-- · 2019-07-16 03:58
精彩回答 2 元偷偷看……
加载中...
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
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
这个是代码,各位大神帮忙看看是哪里错了~~
一周热门 更多>