ds18b20,我想改变它的精度,让数码管显示能出小数点后一位,谁能帮我把程序改改?

//18B20单线温度检测的应用样例程序
#include<REG52.H>
/*****************************************************************************/
sbit DQ=P1^7;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
/**********************************************************************/
unsigned char temp;
unsigned char flag_get,count,num;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表共阳
unsigned char str[3];
/***********************************************************************/
unsigned char ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/************************************************************************/
main()
{

TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;

while(1)
{
str[2]=0xc6;//显示C符号
str[0]=tab[temp/10]; //十位温度
str[1]=tab[temp%10]; //个位温度
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
flag_get=0;
}
}
}

void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//标志位有效

}
count++;
if(count==1)
{P2=0xf7;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=0xfb;
dataled=str[1];}
if(count==3)
{ P2=0xfd;
dataled=str[2];
count=0;}
}
/*************************************************************************************/
void delay(unsigned int i)//延时函数
{
while(i--);
}
/***************************************************************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}

//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}

//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}

//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
long int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();

b<<=4;
b+=(a&0xf0)>>4;
t=b;
return(t);
}
要能在数码管上显示出来哦……包括小数点。

是八位共阳级的吗? 试试我的程序吧 我自己改的 可以显示小数点后一位。
帮你写了很详细的备注信息,应该看的懂了把?你的悬赏分是0很杯具。。。

/**********************************************************

DS18B20温度采集系统程序
8 位共阳极显示,P0 送显示代码,P2作位选信号,低电平选通
分时选通,直接计算 能显示摄氏度符号

通过DD18B20读取温度,数码管显示温度值,并由串口
传送到上位机再执行相应操作。

**********************************************************/

#include <reg51.h>

#define XTAL 11059200 // CUP 晶振频率
#define baudrate 9600 // 通信波特率

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P1^7; // 定义DS18B20端口DQ 单片机数据采集口
sbit BEEP = P3^7;

unsigned char presence ;
unsigned char code LEDData1[ ] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //个位显示代码,因为要显示小数点,所以代码与百位 十位的不同
unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff}; // 百位 十位显示代码
unsigned char data temp_data[2] = {0x00,0x00}; //采集的温度低八位 ,高八位位存这里
unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00};
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //小数位转化查表,这是重点
void beep();
sbit DIN = P0^7; // 小数点
bit flash=0; // 显示开关标记

/**********************************************************/
void Delay(unsigned int num)// 延时函数
{
while( --num );
}

/**********************************************************/
uchar Init_DS18B20(void) // 初始化ds1820
{

DQ = 1; // DQ复位
Delay(8); // 稍做延时

DQ = 0; // 单片机将DQ拉低
Delay(90); // 精确延时 大于 480us

DQ = 1; // 拉高总线
Delay(8);

presence = DQ; // 如果=0则初始化成功 =1则初始化失败
Delay(100);
DQ = 1;

return(presence); // 返回信号,0=presence,1= no presence
}
/**********************************************************/
uchar ReadOneChar(void) // 读一个字节
{
unsigned char i = 0;
unsigned char dat = 0;

for (i = 8; i > 0; i--)
{
DQ = 0; // 给脉冲信号
dat >>= 1;
DQ = 1; // 给脉冲信号

if(DQ)
dat |= 0x80;
Delay(4);
}

return (dat);
}

/**********************************************************/
void WriteOneChar(unsigned char dat)// 写一个字节
{
unsigned char i = 0;

for (i = 8; i > 0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);

DQ = 1;
dat>>=1;
}
}

/*********************************************************/
void Read_Temperature(void)// 读取温度
{
Init_DS18B20();

if(presence==1)
{
beep();
flash=1;
} // DS18B20不正常,蜂鸣器报警
else
{
flash=0;
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0xBE); // 读取温度寄存器

temp_data[0] = ReadOneChar(); // 温度低8位
temp_data[1] = ReadOneChar(); // 温度高8位
}
}

/*********************************************************/
void Disp_Temperature()// 显示温度
{
unsigned char n=0;
// temp_data[0]=0x10; // 这里的2行代码可以用于测试,测试温度是17度
// temp_data[1]=0x01;

display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]; // 查表得小数位的值 这里是显示小数位的重点哦~~~!!!

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //屏蔽小数位,到这里是整数位了啦~
display[3]=display[4]/100; //百位计算
display[1]=display[4]%100;
display[2]=display[1]/10; //十位计算
display[1]=display[1]%10; //个位计算

if(!display[3]) // 高位为0,不显示
{
display[3]=0x0a;

if(!display[2]) // 次高位为0,不显示
display[2]=0x0a;
}

P0 = 0xc6; // 显示 C
P2 = 0Xfe; // 位选线为P2.0口,LED为共阳极显示,当位选线为低电平时选通
Delay(300);

P0 = 0x9c; // 显示 °
P2 =0Xfd; // 选中P2.1口
Delay(300);

P0 =LEDData[display[0]] ; // 显示小数位
P2 =0Xfb; //p2.2
Delay(300);

P0 =LEDData1[display[1]]; // 显示个位
P2 = 0Xf7;
Delay(300);

P0 =LEDData[display[2]]; // 显示十位
P2 = 0Xef;
Delay(300);

P0 =LEDData[display[3]]; // 显示百位
P2 = 0Xdf;
Delay(300);

P2 = 0Xff; // 关闭显示
}

/*********************************************************/
void beep(void)
{
unsigned char i;
for (i=0;i<100;i++)
{
Delay(60);
BEEP=!BEEP; // BEEP取反
}
BEEP=1; // 关闭蜂鸣器
}

/****************************************************** 上位机的通讯,你不需要的话就不必了****** ****** ****** /
void init(void)
{
EA = 1; // "中断总允许"

TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率

TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器0赋初值

SCON = 0x50; // 设定串行口工作方式
PCON &= 0x00; // 波特率不倍增

TR1 = 1; // 启动定时器1
IE = 0x00; // 禁止任何中断
}

/*********************************************上位机的通讯,你不需要的话就不必了************/
void send_char(void)
// 传送十六位的温度数据,低位在前
{
unsigned i=0;

// temp_data[0]=0x10;
// temp_data[1]=0x01;
while (i < 2)
{
SBUF = temp_data[i];
while (!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++;
}
}

/*********************************************************/
void main(void)
{
uchar receive;

init();

while(1)
{

;
// temp_data[0]=0x10; //测试温度17度
// temp_data[1]=0x01;
// Read_Temperature(); // 读取温度

Read_Temperature();

Disp_Temperature(); // 显示温度

// flash=0;//模拟

/* if (flash==0)
{
Disp_Temperature(); // 显示温度
}
else
{
P2 = 0x00 ; // DS18B20不正常,关闭显示
}
*/

if (RI) // 是否有数据到来 ,向上位机发数据,你也可以不要这一段。。。
{
RI = 0;
receive = SBUF;

if (receive == 49) // 是否开始采集温度
{
send_char(); // 传送采集的温度
}
}
}
}

/*********************************************************/
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-09-29
用不用我来帮你改?直接改下你的代码就行了
相似回答