万年历代码
时间:10-02
整理:3721RD
点击:
那位可不可以帮我解答一下为什么我的万年历显示的温度总是检测到0,而单独把18B20的程序拿出来烧录就是可以正常显示的。
具体显示状况如下,附上18b20的代码;
#include<reg52.h>
#include"18b20.h"
#include"lcd12864.h"
#include"moondate.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp_buf[5]={1,0,'.',0,'\0'};
uchar flag;
sbit dp = P2^2;
/*********************************
延迟 大约8us
************************************/
void delay_us(uint y)
{
while (y--);
}
/******************************************
DS18B20 初始化
********************************************/
void init_1820()
{
dp = 1;
delay_us(1); //拉高一段时间
dp = 0;
delay_us(350); //拉低大约480us
dp = 1;
while(dp); // 检测是否复位成功或DS18B20是否存在
delay_us(60);
dp = 1;
}
/***************************************
写操作,每次写入一个dat
****************************************/
void wr_1820(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dp = 0;
delay_us(1);
dp = dat&0x01;
delay_us(60);
dp = 1;
dat = dat>>1;
}
}
/****************************************
读操作,每次返回16位数据
******************************************/
uint re_1820()
{
uchar i;
uint dat;
for(i=0;i<16;i++)
{
dp = 0;
delay_us(60);
dp = 1;
if(dp)
{
dat = (dat>>1)|0x8000;
}
else
dat = dat>>1;
dp=1;
delay_us(60);
}
return(dat);
}
/***********************************************************
读取温度函数,返回温度的绝对值,并标注flag,flag=1表示负,flag=0表示正
**********************************************************/
uint readtemp()
{
uint temp;
float m;
init_1820();
wr_1820(0xcc);
wr_1820(0x44);
init_1820();
wr_1820(0xcc);
wr_1820(0xbe);
temp = re_1820();
if(temp > 0xfff)
{
flag = 1;
temp = (~temp)+1;
}
else
{
flag = 0;
}
m = temp*0.0625;
temp = m*10+0.5;
return(temp);
}
/*******************************************
温度读取及处理函数
******************************************/
void gettemp()
{
uint tem;
tem= readtemp();
temp_buf[0] = tem/100 + '0';
temp_buf[1] = tem%100/10 + '0';
temp_buf[2] = '.';
temp_buf[3] = tem%10 + '0';
temp_buf[4] = '\0';
}
/********************************************************************
显示温度函数
********************************************************************/
void print_tem()
{
lcd_pos(3,2);
print_string(temp_buf);
lcd_pos(3,4);
print_string("℃");
}
void wendu()
{
readtemp();
gettemp();
print_tem();
}
具体显示状况如下,附上18b20的代码;
#include<reg52.h>
#include"18b20.h"
#include"lcd12864.h"
#include"moondate.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp_buf[5]={1,0,'.',0,'\0'};
uchar flag;
sbit dp = P2^2;
/*********************************
延迟 大约8us
************************************/
void delay_us(uint y)
{
while (y--);
}
/******************************************
DS18B20 初始化
********************************************/
void init_1820()
{
dp = 1;
delay_us(1); //拉高一段时间
dp = 0;
delay_us(350); //拉低大约480us
dp = 1;
while(dp); // 检测是否复位成功或DS18B20是否存在
delay_us(60);
dp = 1;
}
/***************************************
写操作,每次写入一个dat
****************************************/
void wr_1820(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dp = 0;
delay_us(1);
dp = dat&0x01;
delay_us(60);
dp = 1;
dat = dat>>1;
}
}
/****************************************
读操作,每次返回16位数据
******************************************/
uint re_1820()
{
uchar i;
uint dat;
for(i=0;i<16;i++)
{
dp = 0;
delay_us(60);
dp = 1;
if(dp)
{
dat = (dat>>1)|0x8000;
}
else
dat = dat>>1;
dp=1;
delay_us(60);
}
return(dat);
}
/***********************************************************
读取温度函数,返回温度的绝对值,并标注flag,flag=1表示负,flag=0表示正
**********************************************************/
uint readtemp()
{
uint temp;
float m;
init_1820();
wr_1820(0xcc);
wr_1820(0x44);
init_1820();
wr_1820(0xcc);
wr_1820(0xbe);
temp = re_1820();
if(temp > 0xfff)
{
flag = 1;
temp = (~temp)+1;
}
else
{
flag = 0;
}
m = temp*0.0625;
temp = m*10+0.5;
return(temp);
}
/*******************************************
温度读取及处理函数
******************************************/
void gettemp()
{
uint tem;
tem= readtemp();
temp_buf[0] = tem/100 + '0';
temp_buf[1] = tem%100/10 + '0';
temp_buf[2] = '.';
temp_buf[3] = tem%10 + '0';
temp_buf[4] = '\0';
}
/********************************************************************
显示温度函数
********************************************************************/
void print_tem()
{
lcd_pos(3,2);
print_string(temp_buf);
lcd_pos(3,4);
print_string("℃");
}
void wendu()
{
readtemp();
gettemp();
print_tem();
}
没整明白
不是很懂,还是谢谢LZ
学习中
认真的学习中