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
展开
 我来答
为遍安3633
2011-05-06 · TA获得超过473个赞
知道小有建树答主
回答量:756
采纳率:0%
帮助的人:486万
展开全部
今天的程序,经过PROTEUS仿真,基本正常。只是在:
numtab 后面少了个DB。
即:
numtab: DB 040H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,00H,10H
END
-----------
昨天的程序,确实是不能正常工作,只是显示00。
追问
只显示0,不能正常工作
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式