共2条
1/1 1 跳转至页
18B20 求助!!!18B20使用!!!!!!江湖救急!!!!!斑竹帮忙!!!!!!
问
先谢谢各位大哥了!!
我现在做毕业设计,其中一部分用到18B20做温度采集,自己找了一个程序,单片机晶振11.0592,用的是89C51.现在做仿真,就是测不出温度!!!用的汇编.
采上来的数据全部是FF!!
用的直接接电源的方法,没有上拉电阻.加了也不行.我做的是两路采集.各位大哥帮帮忙看看!!!
程序在这里:
DQ_0 EQU P1.0
DQ_1 EQU P1.1
DQ_2 EQU P1.2
DQ_3 EQU P1.3
ADDR EQU 40H
LENGTH EQU 41H
DAT_BGN EQU 42H
FLAG_RX EQU 7FH
_LOCAL EQU 07H
;CH0 DATA
HI_0 EQU 51H
LO_0 EQU 50H
;CH1 DATA
HI_1 EQU 53H
LO_1 EQU 52H
ORG 0000H
AJMP MAIN
ORG 0023H
ORG 0100H
MAIN:
SUB_PRO:
LCALL SUB_FUNCTION_0
LCALL SUB_FUNCTION_1
;//////////////////////////////////CH0
SUB_FUNCTION_0: ;本子函数将温度转化后存入40H,41H
PUSH 07H
PUSH 03H
ACALL DS18B20_RST_CH_0 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_0
MOV R7,#44H ;命令传感器开始转化温度
ACALL _DS18B20_W8_CH_0
MOV R3,#02H
WAIT5US_0:
DJNZ R3,WAIT5US_0 ;延迟几个微秒
SETB DQ_0 ;将DQ_0上拉935毫秒,为传感器转化温度供电
ACALL DELAY315MS
ACALL DELAY315MS
ACALL DELAY315MS
CLR DQ_0
ACALL DS18B20_RST_CH_0 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_0
MOV R7,#0BEH ;开始读中间存储器
ACALL _DS18B20_W8_CH_0
ACALL DS18B20_R8_CH_0
MOV 50H,R7 ;开始读温度值低字节至40H
ACALL DS18B20_R8_CH_0
MOV 51H,R7 ;开始读温度值高字节至41H
POP 03H
POP 07H
RET
;;DS18B20 SERVICE PROGRAM OF CHANNEL 1
DS18B20_RST_CH_0: ;复位函数
PUSH 02H
PUSH 06H
L11O_0:
CLR DQ_0 ;将DQ_0清零480US以上
MOV R2,#200
L111_0:
NOP
DJNZ R2,L111_0
SETB DQ_0
MOV R2,#30
L114_0:
DJNZ R2,L114_0
CLR C
ORL C,DQ_0 ;读DQ_0入C
JC L113_0 ;DQ_0为1时初始化结束
MOV R6,#80
L115_0:
ORL C,DQ_0 ;DQ_0不为1时,继续读DQ_0判断
JC L113_0
DJNZ R6,L115_0
SJMP L11O_0
L113_0:
MOV R2,#250
L112_0:
DJNZ R2,L112_0
POP 02H
POP 06H
RET
_DS18B20_W8_CH_0: ;本函数将R7中的数从DQ_0写出
PUSH 03H
PUSH 04H
MOV A,R7
MOV R3,#8
WR111_0:
SETB DQ_0
MOV R4,#8
RRC A ;R7的低位依次放入C中
CLR DQ_0 ;将DQ_0清零15uS以内
WR112_0:
DJNZ R4,WR112_0
MOV DQ_0,C ;将C的值置入DQ_0上发出
MOV R4,#20
WR113_0:
DJNZ R4,WR113_0
DJNZ R3,WR111_0 ;循环8次R7的8位依次发出
SETB DQ_0
POP 03H
POP 04H
RET
DS18B20_R8_CH_0: ;本函数将从DQ_0读数存入R7中
PUSH 04H
PUSH 05H
PUSH 06H
MOV R6,#8
RE111_0:
CLR DQ_0
MOV R4,#6
NOP
SETB DQ_0 ;将DQ_0置1,即放弃DQ_0控制权几个uS
RE112_0:
DJNZ R4,RE112_0
MOV C,DQ_0 ;从DQ_0中读入一位数,放入C中
RRC A ;将C循环A中
MOV R5,#30
RE113_0:
DJNZ R5,RE113_0
DJNZ R6,RE111_0 ;延迟一段时间,再读入一位数,共8次
MOV R7,A ;将读的数放入R7中
SETB DQ_0
POP 04H
POP 05H
POP 06H
RET
;///////////////////////////////////CH1
SUB_FUNCTION_1: ;本子函数将温度转化后存入40H,41H
PUSH 07H
PUSH 03H
ACALL DS18B20_RST_CH_1 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_1
MOV R7,#44H ;命令传感器开始转化温度
ACALL _DS18B20_W8_CH_1
MOV R3,#02H
WAIT5US_1:
DJNZ R3,WAIT5US_1 ;延迟几个微秒
SETB DQ_1 ;将DQ_1上拉935毫秒,为传感器转化温度供电
ACALL DELAY315MS
ACALL DELAY315MS
ACALL DELAY315MS
CLR DQ_1
ACALL DS18B20_RST_CH_1 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_1
MOV R7,#0BEH ;开始读中间存储器
ACALL _DS18B20_W8_CH_1
ACALL DS18B20_R8_CH_1
MOV 52H,R7 ;开始读温度值低字节至40H
ACALL DS18B20_R8_CH_1
MOV 53H,R7 ;开始读温度值高字节至41H
POP 03H
POP 07H
RET
;;DS18B20 SERVICE PROGRAM OF CHANNEL 1
DS18B20_RST_CH_1: ;复位函数
PUSH 02H
PUSH 06H
L11O_1:
CLR DQ_1 ;将DQ_1清零480US以上
MOV R2,#200
L111_1:
NOP
DJNZ R2,L111_1
SETB DQ_1
MOV R2,#30
L114_1:
DJNZ R2,L114_1
CLR C
ORL C,DQ_1 ;读DQ_1入C
JC L113_1 ;DQ_1为1时初始化结束
MOV R6,#80
L115_1:
ORL C,DQ_1 ;DQ_1不为1时,继续读DQ_1判断
JC L113_1
DJNZ R6,L115_1
SJMP L11O_1
L113_1:
MOV R2,#250
L112_1:
DJNZ R2,L112_1
POP 02H
POP 06H
RET
_DS18B20_W8_CH_1: ;本函数将R7中的数从DQ_1写出
PUSH 03H
PUSH 04H
MOV A,R7
MOV R3,#8
WR111:
SETB DQ_1
MOV R4,#8
RRC A ;R7的低位依次放入C中
CLR DQ_1 ;将DQ_1清零15uS以内
WR112:
DJNZ R4,WR112
MOV DQ_1,C ;将C的值置入DQ_1上发出
MOV R4,#20
WR113:
DJNZ R4,WR113
DJNZ R3,WR111 ;循环8次R7的8位依次发出
SETB DQ_1
POP 03H
POP 04H
RET
DS18B20_R8_CH_1: ;本函数将从DQ_1读数存入R7中
PUSH 04H
PUSH 05H
PUSH 06H
MOV R6,#8
RE111_1:
CLR DQ_1
MOV R4,#6
NOP
SETB DQ_1 ;将DQ_1置1,即放弃DQ_1控制权几个uS
RE112_1:
DJNZ R4,RE112_1
MOV C,DQ_1 ;从DQ_1中读入一位数,放入C中
RRC A ;将C循环A中
MOV R5,#30
RE113_1:
DJNZ R5,RE113_1
DJNZ R6,RE111_1 ;延迟一段时间,再读入一位数,共8次
MOV R7,A ;将读的数放入R7中
SETB DQ_1
POP 04H
POP 05H
POP 06H
RET
;/////////////////////////DELAY
DELAY315MS: ;延迟315MS函数
PUSH 05H
PUSH 04H
MOV R5,#0FFH
LOOP2:
MOV R4,#0FFH
LOOP1:
NOP
NOP
DJNZ R4,LOOP1
DJNZ R5,LOOP2
POP 04H
POP 05H
RET
END
END
答 1: 谢谢啦!帮帮忙啊!!! 答 2: 我觉得也可能是程序中的延迟有问题!! 答 3: 有没有人知道啊!!???? 答 4: 我也觉得也可能是程序中的延迟有问题!! ACALL DELAY315MS
ACALL DELAY315MS
ACALL DELAY315MS
可能太久了,好像12位精度都只要750MS。 答 5: 有一次我用6M的内部时钟竟然做出来了!有一次我用6M的内部时钟竟然做出来了!
效果还不错,结果半天以后就不行了!
调试了3天了,结果还是FF!!!
答 6: !!我精确的算了一遍延时,改了下.
但是结果还是全一!! 答 7: 斑竹在吗!!! 答 8: 复位以后要延时60毫秒,你好像没有做 答 9: 关于复位??还有一个问题,我在复位时拉高电平后等待的是传感器发过来的高电平还是低电平作为复位成功判断.
SETB DQ_0
MOV R2,#30
L114_0:
DJNZ R2,L114_0
CLR C
ORL C,DQ_0 ;读DQ_0入C
JC L113_0 ;DQ_0为1时初始化结束
有的书上说是收到低电平初始化结束啊!
请指教!
答 10: 应该是低电平在复位时,拉高电平后等待传感器反馈低电平作为复位成功判断。
我现在做毕业设计,其中一部分用到18B20做温度采集,自己找了一个程序,单片机晶振11.0592,用的是89C51.现在做仿真,就是测不出温度!!!用的汇编.
采上来的数据全部是FF!!
用的直接接电源的方法,没有上拉电阻.加了也不行.我做的是两路采集.各位大哥帮帮忙看看!!!
程序在这里:
DQ_0 EQU P1.0
DQ_1 EQU P1.1
DQ_2 EQU P1.2
DQ_3 EQU P1.3
ADDR EQU 40H
LENGTH EQU 41H
DAT_BGN EQU 42H
FLAG_RX EQU 7FH
_LOCAL EQU 07H
;CH0 DATA
HI_0 EQU 51H
LO_0 EQU 50H
;CH1 DATA
HI_1 EQU 53H
LO_1 EQU 52H
ORG 0000H
AJMP MAIN
ORG 0023H
ORG 0100H
MAIN:
SUB_PRO:
LCALL SUB_FUNCTION_0
LCALL SUB_FUNCTION_1
;//////////////////////////////////CH0
SUB_FUNCTION_0: ;本子函数将温度转化后存入40H,41H
PUSH 07H
PUSH 03H
ACALL DS18B20_RST_CH_0 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_0
MOV R7,#44H ;命令传感器开始转化温度
ACALL _DS18B20_W8_CH_0
MOV R3,#02H
WAIT5US_0:
DJNZ R3,WAIT5US_0 ;延迟几个微秒
SETB DQ_0 ;将DQ_0上拉935毫秒,为传感器转化温度供电
ACALL DELAY315MS
ACALL DELAY315MS
ACALL DELAY315MS
CLR DQ_0
ACALL DS18B20_RST_CH_0 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_0
MOV R7,#0BEH ;开始读中间存储器
ACALL _DS18B20_W8_CH_0
ACALL DS18B20_R8_CH_0
MOV 50H,R7 ;开始读温度值低字节至40H
ACALL DS18B20_R8_CH_0
MOV 51H,R7 ;开始读温度值高字节至41H
POP 03H
POP 07H
RET
;;DS18B20 SERVICE PROGRAM OF CHANNEL 1
DS18B20_RST_CH_0: ;复位函数
PUSH 02H
PUSH 06H
L11O_0:
CLR DQ_0 ;将DQ_0清零480US以上
MOV R2,#200
L111_0:
NOP
DJNZ R2,L111_0
SETB DQ_0
MOV R2,#30
L114_0:
DJNZ R2,L114_0
CLR C
ORL C,DQ_0 ;读DQ_0入C
JC L113_0 ;DQ_0为1时初始化结束
MOV R6,#80
L115_0:
ORL C,DQ_0 ;DQ_0不为1时,继续读DQ_0判断
JC L113_0
DJNZ R6,L115_0
SJMP L11O_0
L113_0:
MOV R2,#250
L112_0:
DJNZ R2,L112_0
POP 02H
POP 06H
RET
_DS18B20_W8_CH_0: ;本函数将R7中的数从DQ_0写出
PUSH 03H
PUSH 04H
MOV A,R7
MOV R3,#8
WR111_0:
SETB DQ_0
MOV R4,#8
RRC A ;R7的低位依次放入C中
CLR DQ_0 ;将DQ_0清零15uS以内
WR112_0:
DJNZ R4,WR112_0
MOV DQ_0,C ;将C的值置入DQ_0上发出
MOV R4,#20
WR113_0:
DJNZ R4,WR113_0
DJNZ R3,WR111_0 ;循环8次R7的8位依次发出
SETB DQ_0
POP 03H
POP 04H
RET
DS18B20_R8_CH_0: ;本函数将从DQ_0读数存入R7中
PUSH 04H
PUSH 05H
PUSH 06H
MOV R6,#8
RE111_0:
CLR DQ_0
MOV R4,#6
NOP
SETB DQ_0 ;将DQ_0置1,即放弃DQ_0控制权几个uS
RE112_0:
DJNZ R4,RE112_0
MOV C,DQ_0 ;从DQ_0中读入一位数,放入C中
RRC A ;将C循环A中
MOV R5,#30
RE113_0:
DJNZ R5,RE113_0
DJNZ R6,RE111_0 ;延迟一段时间,再读入一位数,共8次
MOV R7,A ;将读的数放入R7中
SETB DQ_0
POP 04H
POP 05H
POP 06H
RET
;///////////////////////////////////CH1
SUB_FUNCTION_1: ;本子函数将温度转化后存入40H,41H
PUSH 07H
PUSH 03H
ACALL DS18B20_RST_CH_1 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_1
MOV R7,#44H ;命令传感器开始转化温度
ACALL _DS18B20_W8_CH_1
MOV R3,#02H
WAIT5US_1:
DJNZ R3,WAIT5US_1 ;延迟几个微秒
SETB DQ_1 ;将DQ_1上拉935毫秒,为传感器转化温度供电
ACALL DELAY315MS
ACALL DELAY315MS
ACALL DELAY315MS
CLR DQ_1
ACALL DS18B20_RST_CH_1 ;复位
MOV R7,#0CCH ;直接开始函数指令
ACALL _DS18B20_W8_CH_1
MOV R7,#0BEH ;开始读中间存储器
ACALL _DS18B20_W8_CH_1
ACALL DS18B20_R8_CH_1
MOV 52H,R7 ;开始读温度值低字节至40H
ACALL DS18B20_R8_CH_1
MOV 53H,R7 ;开始读温度值高字节至41H
POP 03H
POP 07H
RET
;;DS18B20 SERVICE PROGRAM OF CHANNEL 1
DS18B20_RST_CH_1: ;复位函数
PUSH 02H
PUSH 06H
L11O_1:
CLR DQ_1 ;将DQ_1清零480US以上
MOV R2,#200
L111_1:
NOP
DJNZ R2,L111_1
SETB DQ_1
MOV R2,#30
L114_1:
DJNZ R2,L114_1
CLR C
ORL C,DQ_1 ;读DQ_1入C
JC L113_1 ;DQ_1为1时初始化结束
MOV R6,#80
L115_1:
ORL C,DQ_1 ;DQ_1不为1时,继续读DQ_1判断
JC L113_1
DJNZ R6,L115_1
SJMP L11O_1
L113_1:
MOV R2,#250
L112_1:
DJNZ R2,L112_1
POP 02H
POP 06H
RET
_DS18B20_W8_CH_1: ;本函数将R7中的数从DQ_1写出
PUSH 03H
PUSH 04H
MOV A,R7
MOV R3,#8
WR111:
SETB DQ_1
MOV R4,#8
RRC A ;R7的低位依次放入C中
CLR DQ_1 ;将DQ_1清零15uS以内
WR112:
DJNZ R4,WR112
MOV DQ_1,C ;将C的值置入DQ_1上发出
MOV R4,#20
WR113:
DJNZ R4,WR113
DJNZ R3,WR111 ;循环8次R7的8位依次发出
SETB DQ_1
POP 03H
POP 04H
RET
DS18B20_R8_CH_1: ;本函数将从DQ_1读数存入R7中
PUSH 04H
PUSH 05H
PUSH 06H
MOV R6,#8
RE111_1:
CLR DQ_1
MOV R4,#6
NOP
SETB DQ_1 ;将DQ_1置1,即放弃DQ_1控制权几个uS
RE112_1:
DJNZ R4,RE112_1
MOV C,DQ_1 ;从DQ_1中读入一位数,放入C中
RRC A ;将C循环A中
MOV R5,#30
RE113_1:
DJNZ R5,RE113_1
DJNZ R6,RE111_1 ;延迟一段时间,再读入一位数,共8次
MOV R7,A ;将读的数放入R7中
SETB DQ_1
POP 04H
POP 05H
POP 06H
RET
;/////////////////////////DELAY
DELAY315MS: ;延迟315MS函数
PUSH 05H
PUSH 04H
MOV R5,#0FFH
LOOP2:
MOV R4,#0FFH
LOOP1:
NOP
NOP
DJNZ R4,LOOP1
DJNZ R5,LOOP2
POP 04H
POP 05H
RET
END
END
答 1: 谢谢啦!帮帮忙啊!!! 答 2: 我觉得也可能是程序中的延迟有问题!! 答 3: 有没有人知道啊!!???? 答 4: 我也觉得也可能是程序中的延迟有问题!! ACALL DELAY315MS
ACALL DELAY315MS
ACALL DELAY315MS
可能太久了,好像12位精度都只要750MS。 答 5: 有一次我用6M的内部时钟竟然做出来了!有一次我用6M的内部时钟竟然做出来了!
效果还不错,结果半天以后就不行了!
调试了3天了,结果还是FF!!!
答 6: !!我精确的算了一遍延时,改了下.
但是结果还是全一!! 答 7: 斑竹在吗!!! 答 8: 复位以后要延时60毫秒,你好像没有做 答 9: 关于复位??还有一个问题,我在复位时拉高电平后等待的是传感器发过来的高电平还是低电平作为复位成功判断.
SETB DQ_0
MOV R2,#30
L114_0:
DJNZ R2,L114_0
CLR C
ORL C,DQ_0 ;读DQ_0入C
JC L113_0 ;DQ_0为1时初始化结束
有的书上说是收到低电平初始化结束啊!
请指教!
答 10: 应该是低电平在复位时,拉高电平后等待传感器反馈低电平作为复位成功判断。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |