帮我看下这个程序好吗?AT89S52P0连接2位共阴数码管,P2.2连接DS18B20温度传感器,晶振12MH,程序是共阳接

程序是共阳接法,如何改为共阴接法?TEMPER_LEQU29H;用于保存读出温度的低8位TEMPER_HEQU28H;用于保存读出温度的高8位FLAG1EQU38H;是否... 程序是共阳接法,如何改为共阴接法?
TEMPER_L EQU 29H ;用于保存读出温度的低8位
TEMPER_H EQU 28H ;用于保存读出温度的高8位
FLAG1 EQU 38H ;是否检测到DS18B20标志位
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
ORG 0000H
MAIN: LCALL GET_TEMPER ;调用读温度子程序 MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序
AJMP MAIN
INIT_1820:; 这是DS18B20复位初始化子程序
SETB P2.2
NOP
CLR P2.2
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P2.2 ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P2.2,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB P2.2
RET
GET_TEMPER:
SETB P2.2
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
RET
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H
RET
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR P2.2
MOV R3,#5
DJNZ R3,$
RRC A
MOV P2.2,C
MOV R3,#21
DJNZ R3,$
SETB P2.2
NOP
DJNZ R2,WR1
SETB P2.2
RET
READ_18200: ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB P2.2
NOP
NOP
CLR P2.2
NOP
NOP
NOP
SETB P2.2
MOV R3,#8
RE10:
DJNZ R3,RE10
MOV C,P2.2
MOV R3,#21
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
DISPLAY: MOV A,29H;将29H中的十六进制数转换成10进制
MOV A,#10
DIV AB
MOV B_BIT,A ;十位在a
MOV A_BIT,B ;个位在b
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV R0,#4
DP11: MOV R1,#250 ;显示1000次
DPLOP: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A;送出个位的7段代码
CLR P2.7 ;开个位显示
ACALL D1MS ;显示1ms
SETB P2.7
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A;送出十位的7段代码
CLR P2.6 ;开十位显示
ACALL D1MS ;显示1ms
SETB P2.6
DJNZ R1,DPLOP ;100次没完循环
DJNZ R0,DP11 ;4个100次没完循环
RET
;1MS延时
D1MS: MOV R7,#80
DJNZ R7,$
RET
NUMTAB: DB 040H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,00H,10H
END
展开
 我来答
紫云风泪
2011-05-06 · 超过11用户采纳过TA的回答
知道答主
回答量:24
采纳率:0%
帮助的人:28万
展开全部
共阳极改为共阴极,程序基本不用变,因为它不会影响程序的基本步骤,只是显示端发生了变化。 只需将硬件共阳极LED换为共阴极LED,同时程序的字形码表共阳变换为共阴的字形码表.如上程序中的 NUMTAB:DB 040H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,00H,10H
变换后为 NUMTAB:DB 0BFH, 06H, 5BH, 4FH, 66H,6DH,7DH,07H, 0FFH,0EFH
更多追问追答
追问
还是不行,共阳也不能正常工作,是不是程序问题,能解决嘛?谢谢!
追答
程序本身有处错,
首先 NUMTAB: DB 040H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,00H,10H
中 040H和00H,10H,无意义,共阳应为0C0H和80H,90H,即0和8,9的字形码;
对应正确的共阴极字形码为:NUMTAB: DB 3FH,06H, 5BH, 4FH, 66H,6DH,7DH,07H, 7FH,6FH

其次:;显示子程序 有错,可能是笔误,不过很关键。。。
DISPLAY: MOV A,29H;将29H中的十六进制数转换成10进制
MOV A,#10
DIV AB
应改为DISPLAY: MOV A,29H;将29H中的十六进制数转换成10进制
MOV B,#10
DIV AB
这样就行了。。。按共阴接法仿真就OK了。。
神勇且飘然的虎鲸6029
2011-05-06 · TA获得超过518个赞
知道小有建树答主
回答量:761
采纳率:0%
帮助的人:474万
展开全部
今天的程序,经过PROTEUS仿真,基本正常。只是在:
numtab 后面少了个DB。
即:
numtab: DB 040H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,00H,10H
END
-----------
昨天的程序,确实是不能正常工作,只是显示00。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mengrui48
2011-05-06 · TA获得超过145个赞
知道答主
回答量:625
采纳率:0%
帮助的人:0
展开全部
;这是关于DS18B20的读写程序,数据脚P2.2,晶振12mhz ;温度传感器18B20汇编今天的程序,经过PROTEUS仿真,基本正常。只是在: numtab 后面少了个DB。即
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式