📄 ds18b20.c
字号:
/*DS18B20温度测量实验
功能:在数码管上显示当前DS18B20测到的温度
小数部分为4位,温度为负时,最高位显示"1"
测量范围:-55℃ ~ +125℃*/
/*************7290显示部分********************/
/*
函数:SystemInit()
功能:系统初始化
*/
#include <DS18B20.h>
#include <I2C.h>
#include <ZLG7290.h>
uchar MSB; //温度高字节
uchar LSB; //温度低字节
uint t1=0; //温度整数部分数值
uint t2=0; //温度小数部分数值
uchar flag; //负温度标志
void delay(uint count);
void SystemInit()
{
I2C_Init();
delay(3600); //等待ZLG7290复位完毕
}
/*
函数:ClearAll()
功能:清除所有显示
*/
void ClearAll()
{
unsigned char x;
for ( x=0; x<8; x++ )
{
ZLG7290_Download(x,0,0,31);
}
}
/*******************************************************************************/
void delay(uint count) //延时函数
{
uint i;
for(i=0;i<count;i++);
}
void DS18B20Init() //初始化DS18B20
{
DQ=0; //下拉500us
delay(60);
DQ=1; //释放总线
delay(6);
while(DQ); //等待应答信号
while(~DQ); //等待释放总线
}
uchar ReadByte() //读一个字节
{
uchar i;
uchar ReadData=0;
for(i=0;i<8;i++)
{
DQ=0;
ReadData>>=1;
DQ=1;
if(DQ)
ReadData|=0x80;
delay(4);
}
return ReadData;
}
WriteByte(uchar WriteData) //写一个字节
{
uchar i;
uchar tmpData;
for(i=0;i<8;i++)
{
tmpData=WriteData&0x01;
WriteData>>=1;
if(tmpData)
{
DQ=0;
DQ=1;
delay(4);
}
else
{
DQ=0;
delay(4);
DQ=1;
}
}
}
float GetTemper() //温度计算程序
{
if((MSB&0xF0)>0) //判断是否为负温度
{
flag=1;
}
else
{
flag=0;
}
if(flag) //如果为负温度取反加1
{
MSB=~MSB;
LSB=~LSB+1;
}
t1=MSB<<4;
t1|=(LSB>>4); //得到温度整数部分
t2=(LSB&0x0F)*0.0625*10000; //得到温度小数部分并扩大10000倍
if(flag) //如果为负温度则最高位显示“1”
ZLG7290_Download(7,0,0,1);
//else //如果为正温度则最高位显示“0”
// ZLG7290_Download(7,0,0,0);
//ZLG7290_Download(6,0,0,t1/100);
ZLG7290_Download(7,0,0,t1%100/10);
ZLG7290_Download(6,1,0,t1%10);
ZLG7290_Download(5,0,0,t2/1000);
ZLG7290_Download(4,0,0,t2%1000/100);
//ZLG7290_Download(1,0,0,t2%100/10);
//ZLG7290_Download(0,0,0,t2%10);
return t1+(LSB & 0x0F) * 0.0625; //返回温度为0~99度,决定了该模块的工作范围
}
float Get_Temp() // 供主程序调用的接口函数,返回给主函数温度值
{
float temp;
//SystemInit(); //系统初始化
//ClearAll(); //清除所有显示
DS18B20Init(); //复位DS18B20
WriteByte(0xCC); //跳过ROM配置
WriteByte(0x44); //启动温度转换
DS18B20Init();
WriteByte(0xCC);
WriteByte(0xBE); //读温度寄存器
LSB=ReadByte(); //读温度数据低字节
MSB=ReadByte(); //读温度数据高字节
temp = GetTemper(); //计算温度并显示
return temp; //返回实型的温度值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -