#include <reg51.h> unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit DQ=P3^3; //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳 unsigned char tempL=0; //臨時(shí)變量低位 unsigned char tempH=0; //臨時(shí)變量高位 float temperature; //溫度值 void delay(unsigned int k) { unsigned int n; n=0; while(n < k) {n++;} return; } void delay1(void) { int k; for(k=0;k<400;k++); } void display(int k) { P2=0xfe; P0=tab[k/1000]; delay1(); P2=0xfd; P0=tab[k%1000/100]; delay1(); P2=0xfb; P0=tab[k%100/10]; delay1(); P2=0xf7; P0=tab[k%10]; delay1(); P2=0xff; } Init_DS18B20(void) { unsigned char x=0; DQ=1; //DQ先置高 delay(8); //延時(shí) DQ=0; //發(fā)送復(fù)位脈沖 delay(85); //延時(shí)(>480ms) DQ=1; //拉高數(shù)據(jù)線 delay(14); //等待(15~60ms) } ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for (i=8;i>0;i--) { DQ=1; delay(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4); } return(dat); } WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1; } delay(4); } ReadTemperature(void) { Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作 WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換 delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí) Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作 WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位) tempL=ReadOneChar(); //讀出溫度的低位LSB tempH=ReadOneChar(); //讀出溫度的高位MSB //溫度轉(zhuǎn)換,把高低位做相應(yīng)的運(yùn)算轉(zhuǎn)化為實(shí)際溫度 temperature=((tempH*256)+tempL)*0.0625; delay(200); return(temperature); } void main() { float i; while(1) { i=ReadTemperature(); display(i); } } |
|