Init_DS18B20.c#include<HL_1.h>
#include<intrins.h>
void delay_11us(uint n)
{
while (n--);
}
/*
* 18B20复位函数
*/
void DS18b20_reset(void)
{
bit flag=1;
while (flag)
{
while (flag)
{
DQ = 1;
delay_11us(1);
DQ = 0;
delay_11us(50); // 550us
DQ = 1;
delay_11us(6); // 66us
flag = DQ; //如果DQ返回信号为低,证明复位成功
}
delay_11us(45); //延时500us
flag = ~DQ;
}
DQ=1;
}
/*
* 18B20写1个字节函数
* 向1-WIRE总线上写一个字节
*/
void write_byte(uchar val)
{
uchar i;
for (i=0; i<8; i++)
{
DQ = 1;
_nop_();
DQ = 0;
_nop_();
_nop_();
_nop_();
_nop_();//4us
DQ = val & 0x01; //最低位移出
delay_11us(6); //66us
val >>= 1; //右移一位
}
DQ = 1;
delay_11us(1);
}
/*
* 18B20读1个字节函数
* 从1-WIRE总线上读取一个字节
*/
uchar read_byte(void)
{
uchar i, value=0;
for (i=0; i<8; i++)
{
DQ=1;
_nop_();
value >>= 1;
DQ = 0;
_nop_();
_nop_();
_nop_();
_nop_(); //4us
DQ = 1;
_nop_();
_nop_();
_nop_();
_nop_(); //4us
if (DQ)
value|=0x80;
delay_11us(6); //66us
}
DQ=1;
return(value);
}
/*
* 启动温度转换
*/
void start_temp_sensor(void)
{
DS18b20_reset();
write_byte(0xCC); // 发Skip ROM命令
write_byte(0x44); // 发转换命令
}
/*
* 读出温度
*/
float read_temp(void)
{
uchar temp_data[2]; // 读出温度暂放
volatile int tt;
float temp;
DS18b20_reset(); // 复位
write_byte(0xCC); // 发Skip ROM命令
write_byte(0xBE); // 发读命令
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
tt = temp_data[1];//把高八位放到int的高八位上,因为最高位是一,为负
tt <<= 8;
tt |= temp_data[0];//再把低八位放到int的低八位上
temp = tt*0.0625;
return temp;
}
主函数#include<reg52.h>
#include<HL_1.h>
#include"Init_DS18B20.h"
int tem;//温度值
uchar shi, ge, xiaoshu;
uint NUM[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint PLACE[7] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void main()
{
while(1)
{
start_temp_sensor();
delay(1);
tem = read_temp();
shi = (int)tem/10;
ge = (int)tem%10;
xiaoshu = (int)(tem*10)%10;
WE = 1;
P0 = PLACE[4];
WE = 0;
DU = 1;
P0 = NUM[shi];
DU = 0;
delay(2);
WE = 1;
P0 = PLACE[5];
WE = 0;
DU = 1;
P0 = NUM[ge];
DU = 0;
delay(2);
WE = 1;
P0 = PLACE[5];
WE = 0;
DU = 1;
P0 = 0x80;
DU = 0;
delay(2);
WE = 1;
P0 = PLACE[6];
WE = 0;
DU = 1;
P0 = NUM[xiaoshu];
DU = 0;
delay(2);
}
}
|