|
本帖最后由 liangjiatian 于 2012-11-30 17:53 编辑
我用51单片机与DS18B20搭建了一个温度测量电路,能够正常测出温度。因在使用中不必要12位的分辨率(温度转换时间太长需750mms),想把分辨率改为9位就行了。但是,送入复位、忽略ROM、4E写暂存器指令接着送入TH、TL的数据和“1F”配置寄存器数据后,测量的温度还是以12位分辨率时显示,好像根本就没对DS18B20进行分辨率的配置。我已经将配置寄存器读出来了是1F 请问各位怎样才能正确配置DS18B20的分辨率。谢谢!
;**************************************
;WWW.STCMCU.COM
;Mobile:13922805190
;0755-82948412
;温度传感器DS18B20测试程序
;主芯片 : STC12LE4052 (1T)
;工作频率: 12.000MHz
;**************************************
DQ BIT P1.0 ;DS18B20的数据口位P1.0
AUXR EQU 8EH
TPH DATA 20H ;存放温度值的高字节
TPL DATA 21H ;存放温度值的低字节
ISP_CONTR EQU 0E7H
KEY BIT P3.0
ORG 0010H
MOV SP,#7FH
LCALL InitUART
Reset:
CALL DS18B20_Reset ;设备复位
MOV A,#0CCH ;跳过ROM命令
CALL DS18B20_WriteByte ;送出命令
MOV A,#04EH ;写暂存器 命令
CALL DS18B20_WriteByte ;送出命令
JNB DQ,$ ;等待转换完成
MOV A,#00H ;写暂存器
CALL DS18B20_WriteByte ;送出数据 TH
JNB DQ,$ ;等待完成
MOV A,#00H ;写暂存器
CALL DS18B20_WriteByte ;送出数据 TL
JNB DQ,$ ;等待完成
MOV A,#1FH ;写暂存器
CALL DS18B20_WriteByte ;送出数据 配置暂存器
JNB DQ,$ ;等待完成
JNB KEY,LOOP3
CALL DS18B20_Reset ;设备复位
MOV A,#0CCH ;跳过ROM命令
CALL DS18B20_WriteByte ;送出命令
MOV A,#044H ;开始转换
CALL DS18B20_WriteByte ;送出命令
JNB DQ,$ ;等待转换完成
CALL DS18B20_Reset ;设备复位
MOV A,#0CCH ;跳过ROM命令
CALL DS18B20_WriteByte ;送出命令
MOV A,#0BEH ;读暂存存储器
CALL DS18B20_WriteByte ;送出命令
CALL DS18B20_ReadByte ;读温度低字节
MOV TPL,A ;存储数据
CALL DS18B20_ReadByte ;读温度高字节
MOV TPH,A ;存储数据
MOV 22H,TPH
LCALL LOOP
MOV 22H,TPL
LCALL LOOP
CALL DS18B20_ReadByte ;读TH值
MOV 23H,A ;存储数据
MOV 22H,23H
LCALL LOOP ;发送串口
CALL DS18B20_ReadByte ;读TL值
MOV 24H,A ;存储数据
MOV 22H,24H
LCALL LOOP ;发送串口
CALL DS18B20_ReadByte ;读配置寄存器值
MOV 25H,A ;存储数据
MOV 22H,25H
LCALL LOOP ;发送串口
// CALL DELAY
CALL DELAY
CALL DELAY
// MOV 22H,#00H
// LCALL LOOP
JMP Reset
LOOP3:
MOV ISP_CONTR,#60H
;**************************************
;延时X微秒(STC12C5A60S2@12M)
;不同的工作环境,需要调整此函数
;入口参数:R7
;出口参数:无
;**************************************
DelayXus: ;6 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
NOP ;1
DJNZ R7,DelayXus ;4
RET ;4
;**************************************
;复位DS18B20,并检测设备是否存在
;入口参数:无
;出口参数:无
;**************************************
DS18B20_Reset:
CLR DQ ;送出低电平复位信号
MOV R7,#240 ;延时至少480us
CALL DelayXus
MOV R7,#240
CALL DelayXus
SETB DQ ;释放数据线
MOV R7,#60 ;等待60us
CALL DelayXus
MOV C,DQ ;检测存在脉冲
MOV R7,#240 ;等待设备释放数据线
CALL DelayXus
MOV R7,#180
CALL DelayXus
JC DS18B20_Reset ;如果设备不存在,则继续等待
RET
;**************************************
;从DS18B20读1字节数据
;入口参数:无
;出口参数:ACC
;**************************************
DS18B20_ReadByte:
CLR A
PUSH 0
MOV 0,#8 ;8位计数器
ReadNext:
CLR DQ ;开始时间片
MOV R7,#1 ;延时等待
CALL DelayXus
SETB DQ ;准备接收
MOV R7,#1
CALL DelayXus
MOV C,DQ ;读取数据
RRC A
MOV R7,#60 ;等待时间片结束
CALL DelayXus
DJNZ 0,ReadNext
POP 0
RET
;**************************************
;向DS18B20写1字节数据
;入口参数:ACC
;出口参数:无
;**************************************
DS18B20_WriteByte:
PUSH 0
MOV 0,#8 ;8位计数器
WriteNext:
CLR DQ ;开始时间片
MOV R7,#1 ;延时等待
CALL DelayXus
RRC A ;输出数据
MOV DQ,C
MOV R7,#60 ;等待时间片结束
CALL DelayXus
SETB DQ ;准备送出下一位数据
MOV R7,#1
CALL DelayXus
DJNZ 0,WriteNext
POP 0
RET
DELAY: ;误差 -0.000000000001us
MOV R7,#97H
DL1:
MOV R6,#18H
DL0:
MOV R5,#0A4H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
LOOP:
CLR TI
MOV SBUF,22H
WaitSendFinish:
JNB TI,WaitSendFinish
CLR TI
SETB ES
RET
InitUART:
UARTINIT: ;4800bps@12MHz
ORL PCON,#80H ;使能波特率倍速位SMOD
MOV SCON,#50H ;8位数据,可变波特率
ORL AUXR,#40H ;定时器1时钟为Fosc,即1T
ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器
ANL TMOD,#0FH ;清除定时器1模式位
ORL TMOD,#20H ;设定定时器1为8位自动重装方式
MOV TL1,#064H ;设定定时初值
MOV TH1,#064H ;设定定时器重装值
CLR ET1 ;禁止定时器1中断
SETB TR1 ;启动定时器1
RET
END
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|