C51 DS18B20程序
扫描二维码
随时随地手机看文章
1、头文件
[cpp] view plaincopy#ifndef _DS18B20_H_
#define _DS18B20_H_
#define uchar unsigned char
#define uint unsigned int
void DS18B20_Delayus(uint us);
void DS18B20_reset();
void DS18B20_write(uchar dat);
uchar DS18B20_data();
uint read_temperature();
#endif
2、C文件
[c-sharp] view plaincopy#include
#include
#include "DS18B20.h"
uint TT; //1820温度变量
sbit DQ = P2^1;
uchar table_temp[5];
uchar temp_comp;
/*******************************************************************/
/* */
/*us级延时函数 */
/* */
/*******************************************************************/
void DS18B20_Delayus(uint us)
{
while(--us);
}
void DS18B20_reset()
{
uchar x = 0;
DQ = 1;
DS18B20_Delayus(16); //稍做延时
DQ = 0; //将DQ拉低
DS18B20_Delayus(160);//延时400us~960us
DQ = 1; //拉高总线
DS18B20_Delayus(28);//延时15us~60us
x = DQ; //如果=0则初始化成功 =1则初始化失败
DS18B20_Delayus(40);//延时60us~240us
}
/*******************************************************************/
/* */
/* 写一个字节 */
/* */
/*******************************************************************/
void DS18B20_write(uchar dat)
{
uchar i;
for(i = 8; i > 0; i--)
{
DQ = 0;
DQ = dat & 0x01;
DS18B20_Delayus(10);
DQ = 1;
dat >>= 1;
}
}
/*******************************************************************/
/* */
/* 读一个字节 */
/* */
/*******************************************************************/
uchar DS18B20_data()
{
uchar i,dat;
for (i = 8; i > 0; i--)
{
DQ = 0; // 给脉冲信号
dat >>= 1;
DQ = 1; // 给脉冲信号
if(DQ)
dat |= 0x80;
DS18B20_Delayus(8);
}
return dat;
}
/*******************************************************************/
/* */
/* 读取温度 */
/* */
/*******************************************************************/
uint read_temperature()
{
uchar a,b;
uint t = 0;
float tt = 0;
DS18B20_reset();//DS18B20复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0x44); //启动温度转换
DS18B20_reset();//DS18B20复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0xbe); //读取温度寄存器
a = DS18B20_data(); //读低8位
b = DS18B20_data(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
void main()
{
uchar i_1,tab1,tab2,tab3;
LCD_init();
DS18B20_reset();
LCD_write_com(0x80);
for(i_1 = 0; i_1 < 5; i_1++)
LCD_write_data(table[i_1]);
while(1)
{
TT = read_temperature(); //读温度
tab1 = TT / 100;
table_temp[0] = tab1 + 0x30; // 十位
tab2= TT / 10 - tab1*10;
table_temp[1] = tab2 + 0x30; //个位
table_temp[2] = '.';
tab3 = TT - tab1*100 - tab2*10;
table_temp[3] = tab3 + 0x30; //小数点一位
table_temp[4] = 'C'; //显示温度符号℃
LCD_write_com(0x80+0x06);
for(i_1 = 0; i_1 < 5; i_1++)
LCD_write_data(table_temp[i_1]);
}
}