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
}
/*******************************************************************/
/* */
/* 寫一個字節(jié) */
/* */
/*******************************************************************/
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;
}
}
/*******************************************************************/
/* */
/* 讀一個字節(jié) */
/* */
/*******************************************************************/
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]);
}
}