求DS18B20测温程序 用四位数码管显示 单片机STC89C51控制

希望哪位高手能提供基于单片机STC89C51的测温电路图,程序,不胜感激... 希望哪位高手能提供基于单片机STC89C51的测温电路图,程序,不胜感激 展开
 我来答
8471872
推荐于2016-03-25 · TA获得超过154个赞
知道答主
回答量:371
采纳率:0%
帮助的人:135万
展开全部
#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);
}

}
leipole
2024-11-29 广告
电商平台MTD温度控制仪是上海雷普电气有限公司推出的一款高性能温度控制设备。该控制仪采用先进的数字显示技术,具有高精度、强抗震性和高可靠性等特点。它广泛应用于化工、冶金、纺织、农业等多个行业,适用于-200℃至1800℃范围内的温度测量和自... 点击进入详情页
本回答由leipole提供
爬行的山羊
2010-06-07 · TA获得超过3026个赞
知道大有可为答主
回答量:6449
采纳率:70%
帮助的人:1160万
展开全部
可惜我有电路图,自己会绘制的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友36c8ebb
2010-06-07 · TA获得超过104个赞
知道答主
回答量:272
采纳率:0%
帮助的人:65.1万
展开全部
+2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友ffb5b39bd
2010-06-07 · TA获得超过569个赞
知道小有建树答主
回答量:339
采纳率:0%
帮助的人:204万
展开全部
去我的博客上找,有图和程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式