为啥18b20显示的温度是90多度,环境才20多度
时间:10-02
整理:3721RD
点击:
/*********ds18b20.c******/
#include<reg51.h>
#include"ds18b20.h"
#include"12864.h"
void Init_Com()//串口初始化
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
}
void Init_DS18B20()//ds18b20初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
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;
}
delay(4);
}
ReadTemperature(void) //测量温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b<<8;
tt=t|a;//2个8位寄存器温度合并为1个16位的
t=tt*0.625; //对结果保留小数点后一位
return(t);
}
void tmpchange(void)//温度转换
{
Init_DS18B20();
delay(20);
WriteOneChar(0xcc);
WriteOneChar(0x44);
}
void init1()//总的初始化函数
{
Init_Com();//串口初始化
init();//lcd12864初始化
}
/******12864.c******/
#include<reg51.h>
#include"12864.h"
uchar code dis1[] = {"当前温度"};
uchar code dis2[] = {"设定温度"};
uchar code table[]="0123456789";
bit lcd_busy() //液晶忙操作
{
bit result;
rs = 0;
rw= 1;
en= 1;
delayNOP();
result = (bit)(P0&0x80);
en = 0;
return(result);
}
void lcd_wcom(uchar com ) //写指令
{
while(lcd_busy());
rs=0;
rw=0;
en=0;
_nop_();
_nop_();
P0 = com;
delayNOP();
en = 1;
delayNOP();
en = 0;
}
void lcd_wdat(uchar dat) //写数据
{
while(lcd_busy());
rs= 1;
rw= 0;
en= 0;
P0 = dat;
delayNOP();
en= 1;
delayNOP();
en= 0;
}
void init (void) //12864初始化
{ delay(50);
psb=1; //并口输入
delay(100);
lcd_wcom(0x34);//扩充指令操作
delay(5);
lcd_wcom (0x30);//基本指令操作
delay(5);
lcd_wcom(0x0c);//开显示,关光标
delay(5);
lcd_wcom(0x01);//清屏
delay(5);
lcd_wcom(0x06);
delay(10);
}
void lcd_pos(uchar X,uchar Y) //显示在第几列第几行
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcom(pos); //显示地址
}
void lcd_display() //LCD12864显示程序 (显示固定不变的)
{ uint i;
lcd_pos(0,0); //设置显示位置为第一行的第1个字符
i=0;
while(dis1[i] != '\0')
{ //显示字符
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(2,0); //设置显示位置为第二行的第1个字符
i=0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字符
i++;
}
}
void ds18b20_display(uint temp)//显示程序温度
{ uint a0,a1,a2,a3,i;
a0=temp/1000;
a0=a0%10;
a1=temp/100;
a1=a1%10;
a2=temp%100;
a2=a2/10;
a3=temp%10;
lcd_pos(1,0);
lcd_wdat('+');
lcd_wdat(table[a1]);//显示十位
lcd_wdat(table[a2]);//显示个位
lcd_wdat('.');//显示小数点
lcd_wdat(table[a3]);//显示小数点后一位
lcd_pos(1,3); //设置显示位置为第二行的第1个字符
i=6;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字符
i++;
}
}
/********main.c*****/
#include"ds18b20.h"
#include"12864.h"
#include"key.h"
#include"delay.h"
void main()
{
init();
lcd_display();
ds18b20_display(ReadTemperature());
while(1) ;
}
#include<reg51.h>
#include"ds18b20.h"
#include"12864.h"
void Init_Com()//串口初始化
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
}
void Init_DS18B20()//ds18b20初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
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;
}
delay(4);
}
ReadTemperature(void) //测量温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b<<8;
tt=t|a;//2个8位寄存器温度合并为1个16位的
t=tt*0.625; //对结果保留小数点后一位
return(t);
}
void tmpchange(void)//温度转换
{
Init_DS18B20();
delay(20);
WriteOneChar(0xcc);
WriteOneChar(0x44);
}
void init1()//总的初始化函数
{
Init_Com();//串口初始化
init();//lcd12864初始化
}
/******12864.c******/
#include<reg51.h>
#include"12864.h"
uchar code dis1[] = {"当前温度"};
uchar code dis2[] = {"设定温度"};
uchar code table[]="0123456789";
bit lcd_busy() //液晶忙操作
{
bit result;
rs = 0;
rw= 1;
en= 1;
delayNOP();
result = (bit)(P0&0x80);
en = 0;
return(result);
}
void lcd_wcom(uchar com ) //写指令
{
while(lcd_busy());
rs=0;
rw=0;
en=0;
_nop_();
_nop_();
P0 = com;
delayNOP();
en = 1;
delayNOP();
en = 0;
}
void lcd_wdat(uchar dat) //写数据
{
while(lcd_busy());
rs= 1;
rw= 0;
en= 0;
P0 = dat;
delayNOP();
en= 1;
delayNOP();
en= 0;
}
void init (void) //12864初始化
{ delay(50);
psb=1; //并口输入
delay(100);
lcd_wcom(0x34);//扩充指令操作
delay(5);
lcd_wcom (0x30);//基本指令操作
delay(5);
lcd_wcom(0x0c);//开显示,关光标
delay(5);
lcd_wcom(0x01);//清屏
delay(5);
lcd_wcom(0x06);
delay(10);
}
void lcd_pos(uchar X,uchar Y) //显示在第几列第几行
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcom(pos); //显示地址
}
void lcd_display() //LCD12864显示程序 (显示固定不变的)
{ uint i;
lcd_pos(0,0); //设置显示位置为第一行的第1个字符
i=0;
while(dis1[i] != '\0')
{ //显示字符
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(2,0); //设置显示位置为第二行的第1个字符
i=0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字符
i++;
}
}
void ds18b20_display(uint temp)//显示程序温度
{ uint a0,a1,a2,a3,i;
a0=temp/1000;
a0=a0%10;
a1=temp/100;
a1=a1%10;
a2=temp%100;
a2=a2/10;
a3=temp%10;
lcd_pos(1,0);
lcd_wdat('+');
lcd_wdat(table[a1]);//显示十位
lcd_wdat(table[a2]);//显示个位
lcd_wdat('.');//显示小数点
lcd_wdat(table[a3]);//显示小数点后一位
lcd_pos(1,3); //设置显示位置为第二行的第1个字符
i=6;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字符
i++;
}
}
/********main.c*****/
#include"ds18b20.h"
#include"12864.h"
#include"key.h"
#include"delay.h"
void main()
{
init();
lcd_display();
ds18b20_display(ReadTemperature());
while(1) ;
}
你的时序有问题?你的数据左移了一位,你再把时序改一下,我以前碰到过这问题,我在采集AM2301湿温度时就遇到过这问题,用单总线采集数据,你再看看你的时序
开头的时序有问题,就是开头的0被你搞掉了,你把开始拉低的时序改一下,开头的时序有问题
要怎么改呢?求程序,谢谢,本人新手
,谢谢,要怎么改呢,求程序,本人新手。谢谢
我程序不是标准的,我只是靠自己理解写出来的,一般的卖家都有一个标准的时序例程来的,而且我是用STM32不是51的,你还是自己再试试吧!
你转换温度系数不对,应该是0.0625.