新人求助!关于DS18B20搞两天没明白
时间:10-02
整理:3721RD
点击:
这是我开发板DS18B20的原理图,可以接两路DS18B20,我现在只插了一个,另一个空着
现在把这个DS12B20空着对写程序有影响吗?搞一个程序发现怎么搞都不对
程序如下
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void Init_LCD1602(void);
void WriteCommandLCD(uchar Cmd);
void WriteDataLCD(uchar Data);
void delayms(uint x);
sbit DQ = P3^2;
sbit Buzz = P1^6;
bit status;
//声明待显示内容
uchar data Word1[] = {"DS18B20 IS OK!"};
uchar data Word2[] = {"TEMP: . "};
uchar data Word3[] = {"DS18B20 IS FAULT"};
uchar data Word4[] = {"PLEASE CHECK! "};
uchar Temp_Value[] = {0x00,0x00};
uchar Display_Digit[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//温度字符数组
uchar code CGRAM_CODE[] = {0x08,0x14,0x08,0x00,0x00,0x00,0x00,0x00};
//延时函数_us级别
void Delay(uint x)
{
while(--x);
}
//LCD1602自定义符号函数
void WriteCGRAM(void)
{
uchar j;
WriteCommandLCD(0x40); //写CGRAM
for(j = 0; j < 8; j ++)
{
WriteDataLCD(CGRAM_CODE[j]);
}
}
//初始化DS18B20函数
bit Init_DS18B20(void)
{
DQ = 1; Delay(1);
DQ = 0; Delay(60);
DQ = 1; Delay(5);
status = DQ;
while(!DQ); //等待DQ变为高电平
return status;
}
//写字节函数
void WriteOneByte(uchar dat)
{
uchar i;
DQ = 1; Delay(1);
for(i = 0; i < 8; i ++)
{
DQ = 0; Delay(1); //1101 1101 & 0x01
DQ = dat & 0x01;
Delay(5); //DS18B20采样DQ线
DQ = 1;
dat >>= 1;
}
}
//读字节函数
uchar ReadOneByte(void)
{
uchar i, dat = 0x00;
DQ = 1; Delay(1);
for(i = 0; i < 8; i ++)
{
DQ = 0; _nop_();
dat >>= 1; //高位放入0
DQ = 1; _nop_();
if(DQ)
{
dat |= 0x80; //高位放入1
}
Delay(8);
DQ = 1;
}
return dat;
}
//读取温度值函数
void Read_Temperature(void)
{
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0xBE);
Temp_Value[0] = ReadOneByte(); //温度低8位
Temp_Value[1] = ReadOneByte(); //温度高8位
}
//LCD1602显示当前温度值函数
void Display_Temperature(void)
{
uchar i,ng = 0;
uint Temp;
ulong Current;
if((Temp_Value[1] & 0xF8) == 0xF8)
{
if(Temp_Value[0] == 0) //有进制
{
Temp_Value[1] = ~Temp_Value[1] + 1;
}
else //没有进制
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0] + 1;
}
ng = 1;
}
Temp = ((uint)Temp_Value[1]) << 8; //强制性转换成16位,并且移至高8位
Current = (Temp + (uint)Temp_Value[0]) * 0.0625 * 10000; //1250000
Display_Digit[6] = Current / 1000000; //百位
Display_Digit[5] = Current % 1000000 / 100000; //十位
Display_Digit[4] = Current % 100000 / 10000; //个位
Display_Digit[3] = Current % 10000 / 1000; //1位小数点
Display_Digit[2] = Current % 1000 / 100; //2位小数点
Display_Digit[1] = Current % 100 / 10; //3位小数点
Display_Digit[0] = Current % 10; //4位小数点
//显示在LCD上的位置
Word2[6] = Display_Digit[6] + '0'; //百位
Word2[7] = Display_Digit[5] + '0'; //十位
Word2[8] = Display_Digit[4] + '0'; //个位
Word2[10] = Display_Digit[3] + '0'; //1位小数点
Word2[11] = Display_Digit[2] + '0'; //2位小数点
Word2[12] = Display_Digit[1] + '0'; //3位小数点
Word2[13] = Display_Digit[0] + '0'; //4位小数点
if(Display_Digit[6] == 0) Word2[6] = ' '; //百位为0不显示
if(Display_Digit[6] == 0 && Display_Digit[5] == 0) Word2[7] = ' ';//十位为0且百位为0,十位不显示
if(ng) //让“-”显示在适当位置 -15 -8
{
if(Word2[7] == ' ')
Word2[7] = '-';
else
Word2[6] = '-';
}
//在第一行里显示标题
WriteCommandLCD(0x80);
for(i = 0; i < 16; i ++)
{
WriteDataLCD(Word1);
}
//在第二行显示当前温度值
WriteCommandLCD(0xC0);
for(i = 0; i < 14; i ++)
{
WriteDataLCD(Word2); // 125.0000℃
}
//显示温度符号
WriteCGRAM();
WriteCommandLCD(0xCE); WriteDataLCD(0x00); //显示°符号
WriteCommandLCD(0xCF); WriteDataLCD('C'); //显示C符号
}
//显示故障信息函数
void Display_Fault(void)
{
uchar i;
WriteCommandLCD(0x80);
for(i = 0; i < 16; i ++)
{
WriteDataLCD(Word3);
}
WriteCommandLCD(0xC0);
for(i = 0; i < 16; i ++)
{
WriteDataLCD(Word4);
}
}
//蜂鸣器发音函数
void Pulse_Buzz(void)
{
uint i;
for(i = 0; i < 100; i ++)
{
Buzz = ~Buzz;
delayms(1);
}
Buzz = 1;
delayms(80);
}
//主函数
void main(void)
{
Init_LCD1602();
Init_DS18B20();
while(1)
{
if(status == 0)
{
Read_Temperature();
Display_Temperature();
}
else
{
Init_DS18B20();
Display_Fault();
Pulse_Buzz();
}
}
}
还有一个1602.c的文件就不发了吧,免得大家看着晕
这个程序的主要功能是 先开机检测 DS18B20是否能初始化,如果能,则1602第一行 显示DS18B20 IS OK!,第二行显示温度,检测的一句是 bit Init_DS18B20(void) 函数的返回值是否为0,0表示正常
如果DS18B20不能初始化则显示DS18B20 IS FAULT PLEASE CHECK!
这个程序应该没问题别人用普通开发板只有一路DS18B20的好用,到我这里就不好用了,求大神告诉为什么
先谢过了
没人吗?
大神就救命啊
求解答啊,不要冷落了新人
应该没影响吧。你可以这样子,不要写两只的程序,你写个一只的。这两只的也是从一只变化来的。是根据接受的信号
可我写的就是一只的啊 bit Init_DS18B20(void) 这个函数开机初始化返回1,但如果把故障检测去了,就能显示温度了,为啥啊
我不久前还专门写过DS18B20注意事项,只是没人关注
路过!,正在搞18b20