DS18B20溫度傳感器測溫顯示在數碼管上(29.9℃)
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #define uchar unsigned char #define uint unsigned int; /******************************************************************/ /* 定義端口 */ /******************************************************************/ sbit DQ=P3^7; //ds18b20 端口 /******************************************************************/ /* 全局變量 */ /******************************************************************/ uint temp; uchar flag_get,count,num,minute,second; uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //7段數碼管段碼表共陽0__9 uchar str[6]; /******************************************************************/ /* 函數聲明 */ /******************************************************************/ void delay1(uchar MS); //延時函數 unsigned int ReadTemperature(void); //讀取溫度 void Init_DS18B20(void); //初始化 unsigned char ReadOneChar(void); //讀一個字節 void WriteOneChar(unsigned char dat); //寫一個字節 void delay(unsigned int i); //延時函數 /******************************************************************/ /* 主函數 */ /******************************************************************/ main() { unsigned char TempH,TempL; TMOD|=0x01;//定時器設置 TH0=0xef; TL0=0xf0; IE=0x82; TR0=1; P2=0x00; count=0; while(1) { str[5]=0x39; //顯示C符號 str[1]=tab[TempH/100]; //十位溫度 str[2]=tab[(TempH%100)/10]; //十位溫度 str[3]=tab[(TempH%100)%10]|0x80; //個位溫度,帶小數點 str[4]=tab[TempL]; if(flag_get==1) //定時讀取當前溫度 { temp=ReadTemperature(); if(temp&0x8000) { str[0]=0x40;//負號標誌 temp=~temp; // 取反加1 temp +=1; } else str[0]=0; TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小數近似處理 flag_get=0; } } } /******************************************************************/ /* 定時器中斷 */ /******************************************************************/ void tim(void) interrupt 1 using 1//中斷,用於數碼管掃描和溫度檢測間隔 { TH0=0xef;//定時器重裝值 TL0=0xf0; num++; if (num==50) {num=0; flag_get=1;//標誌位有效 second++; if(second>=60) {second=0; minute++; } } count++; if(count==1) {P2=0; P0=str[0];}//數碼管掃描 if(count==2) {P2=1; P0=str[1];} if(count==3) { P2=2; P0=str[2]; } if(count==4) { P2=3; P0=str[3]; } if(count==5) { P2=4; P0=str[4]; } if(count==6) { P2=5; P0=str[5]; count=0;} } /******************************************************************/ /* 延時函數 */ /******************************************************************/ void delay(unsigned int i)//延時函數 { while(i--); } /******************************************************************/ /* 初始化 */ /******************************************************************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ複位 delay(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay(80); //精確延時 大於 480us DQ = 1; //拉高總線 delay(10); x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗 delay(5); } /******************************************************************/ /* 讀一個字節 */ /******************************************************************/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈衝信號 dat>>=1; DQ = 1; // 給脈衝信號 if(DQ) dat|=0x80; delay(5); } return(dat); } /******************************************************************/ /* 寫一個字節 */ /******************************************************************/ void 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(5); } /******************************************************************/ /* 讀取溫度 */ /******************************************************************/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 delay(200); Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; return(t); }
最後更新:2017-04-03 19:06:48