求DS18B20测温程序 用四位数码管显示 单片机STC89C51控制
4个回答
展开全部
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define jump_ROM 0xCC //写跳过读ROM指令。因为只对一个DB18B20操作。
#define start 0x44 // 写温度转换指令。
#define read_EEROM 0xBE //读暂存器,读内部RAM中9字节的温度
sbit DQ=P2^3; //DS18B02唯一与单片机连接的 数据端
uchar TMPH ,TMPL; //用于读取高低 8位数据。
uchar code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点
uchar code table1[11]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF,0x39}; //带点的 //0x39是C
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
//)为不加小数点的, 后10个(0~9)为加小数点的,
/****************************************************************************************
以下为延时函数,晶振为11.0592的时候,延时一次大约为:16us。
*******************************************************************************************/
void delay(uint us)
{
uint s;
for(s=0;s<us;s++);
}
/******************************************************************************************
一下为复位函数。resert() 并且读取它的信号。
注意:一个delay(1)=16us
********************************************************************************************/
uchar resert(void)
{
uchar receive_ready;
DQ=0;
delay(32) ; //最好延时时间为480us。 本次为32*16=512us。
DQ=1;
delay(3); //延时等待。
receive_ready=DQ; //获取信号。
delay(25); //等待时间隙 完。 不超过480us,本次为400us。
return receive_ready; //返回信号
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit()
{
uchar i;
DQ=0;
DQ=1;
for(i=0;i<3;i++); //从时间隙开始延时15us。
return DQ; //读出的一个位值返回
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(bitval)
{
DQ=0; //先把数据位置0,开始时间隙。
//delay(1); //延时16us。
if(bitval==1)
DQ=1;
delay(5); //在其余的时间隙保持值。
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte()
{
uchar i;
uchar value=0;
for(i=0;i<8;i++)
{
if(read_bit()) //当read_bit()=0时,value=0; 当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
{
value|=0x01<<i; //按位或|。 有一个为1则为1
}
delay(6) ; //等待剩下时间隙。
}
return value;
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
}
delay(5);
}
//**************获取温度的数值************************************************
uint get_temp()
{
float f_temp;
uint temp;
P2=0x00;
resert(); //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
//write_byte(jump_ROM) ; //jump_ROM= 0xCC, 写跳过读ROM指令。因为只对一个DB18B20操作。
//write_byte(start); //start 0x44 写温度转换指令。
//resert();
write_byte(jump_ROM); // 写跳过读ROM指令。因为只对一个DB18B20操作。
write_byte(read_EEROM); //read_EEROM =0xBE ,读暂存器,读内部RAM中9字节的温度
TMPL = read_byte(); //读取低字节的8位数据
TMPH = read_byte(); //读取低字节的8位数据
temp = TMPH; //把高位的8字节数据 付给temp。
temp <<= 8; //两个字节为一个字
temp = temp | TMPL;
f_temp=temp*0.0625; //温度在寄存器里面是12位,分辨率为:0.0625。
temp=f_temp*10+0.5; //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
f_temp=f_temp+0.05;
return temp;
}
void display(uint tem)
{
uchar j;
tem=get_temp();
for(j=500; j>0; j--)
{
P2=LED_W[4];
P0 = tab[tem / 100];
delay(200);
P2=LED_W[5];
P0 = table1[tem / 10 % 10];
delay(200);
P2=LED_W[6];
P0 = tab[tem % 10];
delay(200);
P2=LED_W[7];
P0 = table1[10];
delay(200);
}
}
//*****************温度转换函数****************************
void tempchange()
{
resert();
delay(50);
write_byte(jump_ROM); // 写跳过读ROM指令。因为只对一个DB18B20操作。
write_byte(start); // 写温度转换指令。
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
while(1)
{
tempchange(); //温度转换函数。
display( 0);
}
}
#define uchar unsigned char
#define uint unsigned int
#define jump_ROM 0xCC //写跳过读ROM指令。因为只对一个DB18B20操作。
#define start 0x44 // 写温度转换指令。
#define read_EEROM 0xBE //读暂存器,读内部RAM中9字节的温度
sbit DQ=P2^3; //DS18B02唯一与单片机连接的 数据端
uchar TMPH ,TMPL; //用于读取高低 8位数据。
uchar code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点
uchar code table1[11]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF,0x39}; //带点的 //0x39是C
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
//)为不加小数点的, 后10个(0~9)为加小数点的,
/****************************************************************************************
以下为延时函数,晶振为11.0592的时候,延时一次大约为:16us。
*******************************************************************************************/
void delay(uint us)
{
uint s;
for(s=0;s<us;s++);
}
/******************************************************************************************
一下为复位函数。resert() 并且读取它的信号。
注意:一个delay(1)=16us
********************************************************************************************/
uchar resert(void)
{
uchar receive_ready;
DQ=0;
delay(32) ; //最好延时时间为480us。 本次为32*16=512us。
DQ=1;
delay(3); //延时等待。
receive_ready=DQ; //获取信号。
delay(25); //等待时间隙 完。 不超过480us,本次为400us。
return receive_ready; //返回信号
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit()
{
uchar i;
DQ=0;
DQ=1;
for(i=0;i<3;i++); //从时间隙开始延时15us。
return DQ; //读出的一个位值返回
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(bitval)
{
DQ=0; //先把数据位置0,开始时间隙。
//delay(1); //延时16us。
if(bitval==1)
DQ=1;
delay(5); //在其余的时间隙保持值。
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte()
{
uchar i;
uchar value=0;
for(i=0;i<8;i++)
{
if(read_bit()) //当read_bit()=0时,value=0; 当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
{
value|=0x01<<i; //按位或|。 有一个为1则为1
}
delay(6) ; //等待剩下时间隙。
}
return value;
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
}
delay(5);
}
//**************获取温度的数值************************************************
uint get_temp()
{
float f_temp;
uint temp;
P2=0x00;
resert(); //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
//write_byte(jump_ROM) ; //jump_ROM= 0xCC, 写跳过读ROM指令。因为只对一个DB18B20操作。
//write_byte(start); //start 0x44 写温度转换指令。
//resert();
write_byte(jump_ROM); // 写跳过读ROM指令。因为只对一个DB18B20操作。
write_byte(read_EEROM); //read_EEROM =0xBE ,读暂存器,读内部RAM中9字节的温度
TMPL = read_byte(); //读取低字节的8位数据
TMPH = read_byte(); //读取低字节的8位数据
temp = TMPH; //把高位的8字节数据 付给temp。
temp <<= 8; //两个字节为一个字
temp = temp | TMPL;
f_temp=temp*0.0625; //温度在寄存器里面是12位,分辨率为:0.0625。
temp=f_temp*10+0.5; //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
f_temp=f_temp+0.05;
return temp;
}
void display(uint tem)
{
uchar j;
tem=get_temp();
for(j=500; j>0; j--)
{
P2=LED_W[4];
P0 = tab[tem / 100];
delay(200);
P2=LED_W[5];
P0 = table1[tem / 10 % 10];
delay(200);
P2=LED_W[6];
P0 = tab[tem % 10];
delay(200);
P2=LED_W[7];
P0 = table1[10];
delay(200);
}
}
//*****************温度转换函数****************************
void tempchange()
{
resert();
delay(50);
write_byte(jump_ROM); // 写跳过读ROM指令。因为只对一个DB18B20操作。
write_byte(start); // 写温度转换指令。
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
while(1)
{
tempchange(); //温度转换函数。
display( 0);
}
}
展开全部
可惜我有电路图,自己会绘制的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
+2
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去我的博客上找,有图和程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询