單片機(jī)DS18B20溫度計(jì)C語(yǔ)言程序
//功能:有負(fù)溫度顯示,高精度格度可以顯示-9.99C到99.99C
//帶有報(bào)警裝置
//當(dāng)溫度為正時(shí),顯示十位 個(gè)位 十分位 百分位
//當(dāng)溫度為負(fù)時(shí),顯示負(fù)號(hào) 十位 個(gè)位 十分位
//缺點(diǎn)是上下限報(bào)警數(shù)值不能改變
//注明:數(shù)碼管是CC—共陰型
//讀取溫度- sbit DQ = P3^0;
//定義通信端口
bit fg=1;
//晶振12MHz
void delay_18B20(unsigned int i)
{while(i--);
}
//初始化函數(shù)
bit Init_DS18B20(void)
{unsigned char x=0; DQ = 1; //DQ復(fù)位 delay_18B20(8); //稍做延時(shí) DQ = 0; //單片機(jī)將DQ拉低 delay_18B20(80); //精確延時(shí) 大于 480us DQ = 1; //拉高總線 delay_18B20(14); x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 return(x); //Init_DS18B20(void) 被定義為 bit則要有返回值 delay_18B20(20);
}//while(DQ); //while(~DQ); //檢測(cè)到應(yīng)答脈沖 //
//讀一個(gè)字節(jié)
ReadOneChar(void)
{unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號(hào) dat>>=1; DQ = 1; // 給脈沖信號(hào) if(DQ) dat|=0x80; delay_18B20(4); } return(dat);
}
//寫一個(gè)字節(jié)
WriteOneChar(unsigned char dat)
{unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; }
}
ReadTemperature(void)
{unsigned char a=0; unsigned char b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作 WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換 delay_18B20(100);//至少750ms Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度 a=ReadOneChar(); b=ReadOneChar(); if((b&0xf8)==0xf8) //位為1 時(shí)溫度是負(fù) { b=~b; a=~a+1; //補(bǔ)碼轉(zhuǎn)換,取反加一 (a==0)b++; fg=0; //讀取溫度為負(fù)時(shí)fg=0 } //傳感器返回值除16得實(shí)際溫度值 //技巧處理后先乘25,再除4,除4用右移實(shí)現(xiàn) t=((b*256+a)*25)>>2; //t=t+(t>0?0.5:-0.5); //四佘五入大于0加0.5, 小于0減0.5 前面要把t定義為float型才可以 return(t);
}- 顯示頭文件:display()
char disp[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//數(shù)字0-9和‘-’的共陰段碼
char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
void display(int tmp){ if(fg==0) { P2 = 0xff; P1 = 0x40;//"-" P2 = 0xEF; delay_18B20(2000); } P2 = 0xff; P1 = 0x39;//"C" //若先位選再段選, 由于IO口默認(rèn)輸出高電平, 所以當(dāng)先位選會(huì)使數(shù)碼管出現(xiàn)亂碼 P2 = 0xFE; delay_18B20(200); P2 = 0xff; P1 = disp[tmp/10]; P2 = 0xFD; delay_18B20(200); P2 = 0xff; P1 =disp_dot[tmp/10]; P2 = 0xFB; delay_18B20(200); if(fg==1) { P2 = 0xff; P1 = disp[tmp/100]; P2 = 0xF7; delay_18B20(200); }
}
評(píng)論