我用proteus仿真的时候能达到12位
而我下载到实验板上做实验的时候只能达到9位;
怎么解决???????????
要用c语言,汇编我不懂;
下面是我的程序:
//P_one 数据通信端口
//TEMP 温度值的变量
//flag1 结果为负和正的标志位
//tmchange()开始温度转换
//delay() 延时
//tmp() 读取温度函数
//count 延时技术变量
//dsreset() 复位和初始化函数
//tmpread() 读取数据的一位
//tmpread2()读取数据的一个字节
//tmpwrite()写数据的一个字节
//rom() 读取器件的序列号
//dat 读取数据的临时变量
/*************************************************/
#include<reg52.h>
#include <intrins.h>
#include<absacc.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define uchar unsigned char
//#define uint unsigned int
//sbit P_one=P3^4;
sbit P_one=P2^7;
uchar TEMP;
uchar flag1;
unsigned char data temp_data[2] = {0x00,0x00} ;
void delay (unsigned int count)//延时
{
unsigned int i;
while (count)
{
i=200;
while(i>0)i--;
count--;
}
}
void dsreset(void)//改善复位和初始化
{
unsigned int i;
P_one=0;
i=103;
while(i>0)i--;
P_one=1;
i=4;
while(i>0)i--;
}
bit tmpread(void)//读取数据的一位
{
unsigned int i;
bit dat;
P_one=0;i++;
P_one=1;i++;i++;
dat=P_one;
i=8;while(i>0)i--;
return(dat);
}
unsigned char tmpread2(void)
{
unsigned char i,j ,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=tmpread();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmpwrite(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
P_one=0; //写0
i++;i++;
P_one=1;
i=8;
while(i>0)i--;
}
else
{
P_one=0; //写0
i=8;
while(i>0)i--;
P_one=1;
i++;i++;
}
}
}
void tmpchange(void)
{
dsreset(); //复位
//tmpre(); //等待存在脉冲
delay(1);
tmpwrite(0xcc); //跟过读序列号命令
tmpwrite(0x44);//发转换命令44H
}
//void tmp(void)
unsigned char tmp(void)
{
dsreset();
delay(1);
tmpwrite(0xcc);
tmpwrite(0xbe);
temp_data[0]=tmpread2(); //读取温度低位
temp_data[1]=tmpread2(); //读取温度高位
flag1=(temp_data[1]>>4)&0x01; //若b为1则为负温
/*if(flag1)
{
temp_data[0]=~temp_data[0]+1; //如果为负温则去除其补码
}
else
{
temp_data[0]=temp_data[0];
}
return(temp_data[0]);*/
}
rom() //读取器件序列号
{
//uchar i;
uchar sn1;
uchar sn2;
dsreset();
delay(1);
tmpwrite(0x33);
sn1=tmpread();
sn2=tmpread();
}
实际应用中精度不用设置,让其为最大12位,只需在程序中按需要的精度要求舍弃后面的位数即可。采用右移的明举办法舍弃,有个
数码管显示的程序你可参考一下:
uint16
temp;
uint8
n=0;
//N=0符号为正
/*
if(tem>6348)
//温度值正负判断
{
tem=65536-tem;
//负温度求补码
n=1;
//标志位置n=1
}
*/
if(tem&0x0800)
//为负时
{
tem=~temp+1;
n=1;
}
temp_h=tem>>4;
//去掉小氏陪数
temp_l=tem&0x000f;
//取出小数
temp_l=tem_l*625;
//把小数转化为整数
display[0]=temp_h/100;
//百位
temp_h=temp_h%100;
//温度激核碧值去掉百位
display[1]=temp_h/10;
//十位
display[2]=temp_h%10;
//个位
display[3]=temp_l/1000;
//小数点后一位
temp_l=temp_l%1000;
//温度值去掉小数点后一位
display[4]=temp_l/100;
//小数点后二位
temp_l=temp_l%100;
//温度值去掉小数点后二位
display[5]=temp_l/10;
//小数点后三位
display[6]=temp_l%10;
//小数点后四位
虽然是个老帖子了,但是也无意中看到了
你这个程序困岩应该没问题,可能是你的DS18B20寄存器的精度被设置过了,你可以发送 0x4e指令,汪凯御之后再发3个字节,前2位随便设个高低报警值,最后一个字节就是精度设置,你可以孙桥设置成0x1f,0x3f,0x5f,0x7f,分别对应9bit,10bit,11bit,12bit,
可以看这个图,第4个字节就是寄存器,0x4e指令开始位置就在TH
或者最有效的办法是去再买个新的管子,那样上电就是12bit的精度了 ^_^!
DS18B20数字温度计提供9-12位摄氏温度测量而且有一个由高低电平触发的可编程的不因电源消失而改变的报警功能。DS18B20通过一个单线接口发送或接受信息,因此在中央处理器和DS18B20之间仅需一条衫斗连接线(加上地线)。它的测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。除此之外,DS18B20能直接从单线通讯线上汲取能量,除去了对外部电源的需求。
DS18B20的核心功能是它的直接读数字的温度传感器。温度或锋磨传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位。
存储器的第4位为配置寄存器,上电默认设置:R0=1,R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。暂存器的位7和位0-4被基闷器件保留,禁止写入;在读回数据时,它们全部表现为逻辑1。
可以参考这里:
http://wenku.baidu.com/link?url=nSfPlge7gmx_TYbY1iwnb7TYkeDgscKE3ZpsinhTmo5Q_DrcWB2s7K29rJQeJX5spu9mCx0X1JPoodPXG3e4mgy6C2ZRzQCG2gxKcpkFmBq