18b20显示不正常
时间:10-02
整理:3721RD
点击:
这两天在弄DS18B20,但是现在有个问题,就是在-25-25℃的时候能够正常显示,但一过这个区间就开始乱了,谁能帮我看一下。
原来出现的是-15-15℃,但那个是我将int型写成了char型了,这个我实在是找不到问题所在了。希望各位帮帮忙!
#include <reg51.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
bit Tflag;//温度正负标志
sbit DQ = P3^7;
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x63,0x00,0x40}; //0x40 负
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
//0-9数码管的编码(共阳极), 带小数点
uchar code table1[]={0x40, 0x79, 0x24, 0x30,
0x19, 0x12, 0x02,0x78, 0x00, 0x10};
unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
void dmsec (unsigned int count)
{
unsigned int i; // 1ms延时
while (count--)
{
for (i=0;i<125;i++){}
}
}
void display(uint temp)
{
dispbuf[0]=temp/100;
dispbuf[1]=temp/10%10;
dispbuf[2]=temp%10;
if (Tflag)
{
P2=0xff;
P0=dispcode[12];
P2=dispbitcode[0];
dmsec(3);
P2=0xff;
P0=dispcode[16];
P2=dispbitcode[1];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
dmsec(3);
P2=0xff; //关闭所有显示
P0=~table1[dispbuf[1]];
P2=dispbitcode[3];
dmsec(5);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[0]];
P2=dispbitcode[4];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[18];
P2=dispbitcode[5];
dmsec(3);
}
else
{
P2=0xff;
P0=dispcode[12];
P2=dispbitcode[0];
dmsec(3);
P2=0xff;
P0=dispcode[16];
P2=dispbitcode[1];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
dmsec(3);
P2=0xff; //关闭所有显示
P0=~table1[dispbuf[1]];
P2=dispbitcode[3];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[0]];
P2=dispbitcode[4];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[17];
P2=dispbitcode[5];
dmsec(3);
}
}
/********** 该程序为总线上只有一个器件 **********/
//毫秒延时 11.0592 Mhz
void Delay(unsigned int num)// 延时函数
{
while( --num );
}
//复位脉冲
void tmreset (void)
{
DQ = 0;
Delay(90); // 精确延时 大于 480us
DQ = 1;
Delay(4); // 90,4 可以小范围变化
}
//存在脉冲
void tmpre (void)
{
while (DQ);
while (~DQ);
Delay(4);
}
//读一个位
bit tmrbit (void)
{
unsigned int i;
bit dat;
DQ = 0; i++; // i++;大概1us
DQ = 1; i++; i++;
dat = DQ;
Delay(8);
return (dat);
}
//读一个比特
unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
//写一个比特
void tmwbyte (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)
{// Write 1
DQ = 0; // 先拉低
i++; i++; // >1us
DQ = 1;
Delay(4);
}
else
{// Write 0
DQ = 0;
Delay(4); // 大一点 没影响,但不能太大,写一个位在30us内
DQ = 1;
i++; i++; // 再拉高
}
}
}
//ds1820开始转换
void tmstart (void)
{
dmsec(1);
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0x44); // 转换
}
//读取温度
unsigned char tmrtemp (void)
{
uchar a,b;
uint wendu;
float y1;
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0xbe); // 转换
a = tmrbyte (); // LSB低8位
b = tmrbyte (); // MSB高8位
if((b & 0x80)==0x80) //判断温度正负
{
wendu=b;
wendu<<=8;
wendu=wendu|a;
wendu=~wendu+1;
y1=wendu*0.0625;
wendu=y1*10-0.5;
Tflag=1;
}
else
{
wendu=b;
wendu<<=8;
wendu=wendu|a;
y1=wendu*0.0625;
wendu=y1*10+0.5;
Tflag=0;
}
return(wendu);
}
/********** MAIN **********/
void main (void)
{
uint last;
tmstart();
dmsec(450); // 初始化ds18b20
while(1)
{
tmstart(); // ds1820开始转换
dmsec(2);
last=tmrtemp(); // 读取温度
display(last);
}
}
原来出现的是-15-15℃,但那个是我将int型写成了char型了,这个我实在是找不到问题所在了。希望各位帮帮忙!
#include <reg51.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
bit Tflag;//温度正负标志
sbit DQ = P3^7;
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x63,0x00,0x40}; //0x40 负
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
//0-9数码管的编码(共阳极), 带小数点
uchar code table1[]={0x40, 0x79, 0x24, 0x30,
0x19, 0x12, 0x02,0x78, 0x00, 0x10};
unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
void dmsec (unsigned int count)
{
unsigned int i; // 1ms延时
while (count--)
{
for (i=0;i<125;i++){}
}
}
void display(uint temp)
{
dispbuf[0]=temp/100;
dispbuf[1]=temp/10%10;
dispbuf[2]=temp%10;
if (Tflag)
{
P2=0xff;
P0=dispcode[12];
P2=dispbitcode[0];
dmsec(3);
P2=0xff;
P0=dispcode[16];
P2=dispbitcode[1];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
dmsec(3);
P2=0xff; //关闭所有显示
P0=~table1[dispbuf[1]];
P2=dispbitcode[3];
dmsec(5);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[0]];
P2=dispbitcode[4];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[18];
P2=dispbitcode[5];
dmsec(3);
}
else
{
P2=0xff;
P0=dispcode[12];
P2=dispbitcode[0];
dmsec(3);
P2=0xff;
P0=dispcode[16];
P2=dispbitcode[1];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
dmsec(3);
P2=0xff; //关闭所有显示
P0=~table1[dispbuf[1]];
P2=dispbitcode[3];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[0]];
P2=dispbitcode[4];
dmsec(3);
P2=0xff; //关闭所有显示
P0=dispcode[17];
P2=dispbitcode[5];
dmsec(3);
}
}
/********** 该程序为总线上只有一个器件 **********/
//毫秒延时 11.0592 Mhz
void Delay(unsigned int num)// 延时函数
{
while( --num );
}
//复位脉冲
void tmreset (void)
{
DQ = 0;
Delay(90); // 精确延时 大于 480us
DQ = 1;
Delay(4); // 90,4 可以小范围变化
}
//存在脉冲
void tmpre (void)
{
while (DQ);
while (~DQ);
Delay(4);
}
//读一个位
bit tmrbit (void)
{
unsigned int i;
bit dat;
DQ = 0; i++; // i++;大概1us
DQ = 1; i++; i++;
dat = DQ;
Delay(8);
return (dat);
}
//读一个比特
unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
//写一个比特
void tmwbyte (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)
{// Write 1
DQ = 0; // 先拉低
i++; i++; // >1us
DQ = 1;
Delay(4);
}
else
{// Write 0
DQ = 0;
Delay(4); // 大一点 没影响,但不能太大,写一个位在30us内
DQ = 1;
i++; i++; // 再拉高
}
}
}
//ds1820开始转换
void tmstart (void)
{
dmsec(1);
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0x44); // 转换
}
//读取温度
unsigned char tmrtemp (void)
{
uchar a,b;
uint wendu;
float y1;
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0xbe); // 转换
a = tmrbyte (); // LSB低8位
b = tmrbyte (); // MSB高8位
if((b & 0x80)==0x80) //判断温度正负
{
wendu=b;
wendu<<=8;
wendu=wendu|a;
wendu=~wendu+1;
y1=wendu*0.0625;
wendu=y1*10-0.5;
Tflag=1;
}
else
{
wendu=b;
wendu<<=8;
wendu=wendu|a;
y1=wendu*0.0625;
wendu=y1*10+0.5;
Tflag=0;
}
return(wendu);
}
/********** MAIN **********/
void main (void)
{
uint last;
tmstart();
dmsec(450); // 初始化ds18b20
while(1)
{
tmstart(); // ds1820开始转换
dmsec(2);
last=tmrtemp(); // 读取温度
display(last);
}
}
这是25.5℃的显示
这是26.5℃的显示