基于51單片機(jī)的ds18B20溫度程序
測(cè)得室溫為31度
#include reg51.h> /************共陽(yáng)LED段碼表*****************/ unsigned char code tab[ ]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6}; /************端口定義*************/ sbit DQ=P3^6; //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳 sbit wx1=P1^0;sbit wx2=P1^1;sbit wx3=P1^2;sbit wx4=P1^3;/****************定義全局變量*******************/ unsigned char tempL=0; //臨時(shí)變量低位 unsigned char tempH=0; //臨時(shí)變量高位 float temperature; //溫度值 /****************************************函數(shù)功能:延時(shí)子程序 入口參數(shù):k 出口參數(shù): *************************************************/ void delay(unsigned int k) { unsigned int n; n=0; while(n k) {n++;} return; } /**********************************************函數(shù)功能:數(shù)碼管掃描延時(shí)子程序 入口參數(shù): 出口參數(shù): **************************************************/ /*void delay1(void) { int k; for(k=0;k400;k++); } */void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}/*******************************************函數(shù)功能:數(shù)碼管顯示子程序 入口參數(shù):k 出口參數(shù): ***********************************************/ void display(int k) { wx1=1; P2=tab[k/100]; delay1(3); P1=0x00;wx2=1; P2=tab[k%100/10]; delay1(3); P1=0x00;wx3=1; P2=tab[k%10]; delay1(3); P1=0x00;wx4=1; P2=tab[12]; delay1(3); P1=0x00;} /************************************************** 函數(shù)功能:DS18B20初始化子程序 入口參數(shù): 出口參數(shù): ***************************************************/ 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) } /*********************************************函數(shù)功能:向DS18B20讀一字節(jié)數(shù)據(jù) 入口參數(shù): 出口參數(shù):dat ***********************************************/ 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); } /*********************************************函數(shù)功能:向DS18B20寫一字節(jié)數(shù)據(jù) 入口參數(shù):dat 出口參數(shù): ***********************************************/ WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat0x01; delay(5); DQ=1; dat>>=1; } delay(4); } /**********************************************函數(shù)功能:向DS18B20讀溫度值 入口參數(shù): 出口參數(shù):temperature ************************************************/ ReadTemperature(void) { Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過讀序列號(hào)的操作 WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換 delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí) Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過讀序列號(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); } /*************************************************函數(shù)功能:主程序 入口參數(shù): 出口參數(shù): ***************************************************/ void main() { float i; while(1) { i=ReadTemperature(); display(i); } }
評(píng)論