📄 ds1990a.asm
字号:
ORG 0000H
SJMP MAIN;读入DS1990A注册码
ORG 0030H
MAIN:
SETB P1.4;打开三态门
NK: CLR P1.5;主程序先在总线上产生高电平
CLR C;
LCALL RESET;进入复位与应答时隙
JNC WAIT;若C为0则再去发复位脉冲
MOV A,#0F0H;READROM指令
LCALL BYTE;发送READROM指令
MOV B,#08H;读入字节数
READ:MOV A,#00H;发送00H在读入数据时释放总线
LCALL BYTE;读入数据
PUSH ACC;保存读入的数据
DJNZ B,READ;循环读入
MOV R0,#047H;RAM地址
MOV B,#08H;需存储的字节数
PO: POP ACC;
MOV @R0,A;将读入的数据存入RAM
DEC R0
DJNZ B,PO
WAIT:SJMP NK
RESET: PUSH B
PUSH ACC
SETB P1.5;发送复位下降沿
MOV B,#0FAH;设置复位脉冲保持时间
DJNZ B,$;复位脉冲至少保持480uS
CLR P1.5;释放总线产生上升沿
MOV B,#08H;设置DS的等待时间
CLR C;设置软件标志位
WAITLOW: JNB P2.2,WH;
DJNZ B,WAITLOW;监测是否有应答脉冲
SJMP SHORT;没有应答则再去发复位脉冲
WH: MOV B,#01EH;要求应答脉冲保持一段时间
HL: ORL C,P2.2;若C为0则不响应此下降沿
DJNZ B,HL;要求检验到DS释放总线
SHORT:POP ACC
POP B
RET
BYTE: PUSH B;发送读入子程序
MOV B,#08H;指令和数据的8位
BITLOOP:RRC A;右移指令一位
LCALL TOUCHBIT;发出又读入
DJNZ B,BITLOOP;循环右移
RRC A;再循环一次
POP B;
RET
TOUCHBIT:SETB P1.5;发送接收结合子程序先给下降沿
NOP
MOV P1.5,C;发送一位
SETB P2.2;输入先写1
MOV C,P2.2;读入一位
PUSH B
MOV B,#12H
DJNZ B,$;延时到tSOLT
POP B
CLR P1.5;发送读入结束后释放总线
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -