#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=P3^4; //DS18B02唯一与单片机连接的 数据端
uchar TMPH ,TMPL; //用于读取高低 8位数据。
uchar code table[20] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09,0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08};// 前10个(0~9
//)为不加小数点的, 后10个(0~9)为加小数点的,
uchar code table1[3]={0x01,0x02,0x04} ; //用于数码管的显示。
/****************************************************************************************
以下为延时函数,晶振为11.0592的时候,延时一次大约为:16us。
*******************************************************************************************/
void delay(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);
}
//***********************数据显示程序**************************************
void display (uchar num ,uchar dat) //num:第几个数码管。 dat是要显示的数字
{
//uchar i;
P0=table[dat];
P2=table1[num];
delay(800); //i=0xff;
//i=i&(~((0x01)<<(num)) );
// P2=i;