/*******************************************************************************
* 标题: 18b20温度芯片驱动程序 *
* 文件: 18b20.h 18b20.c *
* 日期: 2010-3-11 *
* 版本: 1.12(试验通过版)可用51hei单片机开发板 *
* 邮箱:
[email protected]
qq:526083029 *
* 网站: 无 *
********************************************************************************
* 描述: *
* 用法:首先在主程序内添加头文件#include"18b20.c" *
* 在程序中使用ReadTemp();获取温度芯片内数据 *
* 使用 temp_to_str();函数将时间数据转换液晶字符 *
* *
********************************************************************************
*【版权】自己参照网上,朋友,以及书本资料上写的,所以没有版权 *
*【声明】此程序,可用于学习,参考及实际设计中,欢迎转载复制以及建议批评 *
*【技术支持】qq:526083029 小张 *
********************************************************************************/
#ifndef _18B20_H_
#define _18B20_H_
#define uchar unsigned char
#define rerom1820 0x33
// 读ROM指令
#define matchrom1820 0x55
// 匹配ROM指令
#define skiprom1820 0xCC
// 跳过ROM指令
#define searchrom1820 0xF0
// 搜索ROM指令
#define alarmsearch1820 0xEC
// 报警搜索指令
#define wrscratchpad1820 0x4E
// 写暂存寄存器指令
#define rescratchpad1820 0xBE
// 读暂存寄存器指令
#define copyscratchpad1820 0x48
// 复制暂存寄存器指令
#define convert1820 0x44
// 启动温度转换指令
#define recalle21820 0xB8
// 重新调出E2PROM的数据
/***********ds18b20延迟子函数*******/
extern void delaydq(uchar i);
/**********ds18b20初始化函数**********************/
extern void dqinit(void);
/***********ds18b20读一个字节**************/
extern uchar re1820b(void);
/*************ds18b20写一个字节****************/
extern void wr1820b(uchar dat);
extern void ReadTemp(void);
extern void temp_to_str();
#endif
///////////////////////////////////////////////////////////c程序//////////////////////////////////////////////
#include "18b20.h"
#include
//管脚定义
sbit DQ=P3^0;
uchar TempBuffer[8];
uchar temp_value,temp2,xs,fflag;
/*************************************
函数名:delaydq
函数功能:延时
参数:i(秒数)
返回:无
备注:无
*************************************/
void delaydq(uchar i)
{
while(i--);
}
/*************************************
函数名:dqinit
函数功能:初始化
参数:无
返回:无
备注:无
*************************************/
void dqinit(void)
{
uchar x=0;
DQ = 1; //DQ
复位
delaydq(8); //
稍做延时
DQ = 0; //
单片机将DQ拉低
delaydq(80); //
精确延时 大于 480us
DQ = 1; //
拉高总线
delaydq(14);
x=DQ; //
稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delaydq(20);
}
/*************************************
函数名:re1820b
函数功能:读数据
参数:无
返回:dat(数据)
备注:无
*************************************/
uchar re1820b(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //
给脉冲信号
dat>>=1;
DQ = 1; //
给脉冲信号
if(DQ)
dat|=0x80;
delaydq(4);
}
return(dat);
}
/*************************************
函数名:wr1820b
函数功能:写数据
参数:dat(数据)
返回:无
备注:无
*************************************/
void wr1820b(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delaydq(5);
DQ = 1;
dat>>=1;
}
}
/*************************************
作者:刘温电 来源:本站原创 点击数:5292 更新时间:2013年11月26日
函数名:ReadTemp
函数功能:温度转换
参数:无
返回:无
备注:无
*************************************/
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
dqinit();
wr1820b(0xCC); //
跳过读序号列号的操作
wr1820b(0x44); //
启动温度转换
delaydq(100);
dqinit();
wr1820b(0xCC); //
跳过读序号列号的操作
wr1820b(0xBE); //
读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delaydq(100);
a=re1820b(); //
读取温度值低位
b=re1820b(); //
读取温度值高位
if(b>127)
{
b=(256-b);a=(256-a);fflag=1; //
负温度求补码
}
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
temp2=a&0x0f; //
小数的值
xs=temp2*0.0625*10; //
小数位,若为0.5则算为5来显示 xs小数
}
/*************************************
函数名:temp_to_str
函数功能:温度显示
参数:无
返回:无
备注:无
*************************************/
void temp_to_str()
//
温度数据转换成液晶字符显示
{
if(fflag==1)
{ TempBuffer[0]='-';
TempBuffer[1]=temp_value/10+'0'; //
十位
TempBuffer[2]=temp_value%10+'0'; //
个位
TempBuffer[3]='.';
TempBuffer[4]=xs+'0';
TempBuffer[5]=0xdf; //
温度符号
TempBuffer[6]='C';
TempBuffer[7]='\0';
}
else
{
TempBuffer[0]='+';
TempBuffer[1]=temp_value/10+'0'; //
十位
TempBuffer[2]=temp_value%10+'0'; //
个位
TempBuffer[3]='.';
TempBuffer[4]=xs+'0';
TempBuffer[5]=0xdf; //
温度符号
TempBuffer[6]='C';
TempBuffer[7]='\0';
}
}