/*ADC0831轉換程式,請調整精密可變電阻,或有加裝其它感測器(如光敏電阻,濕度感測器,等等),看看會如何變化*/ #include #include sbit DQ=P3^3; //定義DS18B20資料線 sbit LCD_RS=P1^0; //LCM接腳定義 sbit LCD_RW=P1^1; sbit LCD_E=P1^2; #define LCD_Data P2 void WriteDataLCD(char WDLCD); void WriteCommandLCD(char WCLCD); void LCDInit(void); void write_byte(char dat); unsigned char read_byte(void); void init_DS18B20(void); void delay(int t); // 宣告延遲函式 void delay_us(int t) { while(t--); } unsigned char ad0831read(void); //定義該函數為讀取ADC0831的資料 char code digit[] = "0112334456678899"; //數值0~15對應到0.0~0.9度 void main(void) //程式開始 { unsigned char temp_low,temp_high,tmp; int temperature,temp_d; //儲存溫度狎� delay_us(20000); //若LCM反應較慢,建議電源啟動後需先等一段時間再規劃LCM,LCM才可正常動作 LCDInit(); //LCM初始化 WriteCommandLCD(0x80+0x06); //游標移到第一行開頭游標移到第6格 WriteDataLCD(0xdf); WriteDataLCD('C'); //先顯示。C符號 while(1) { WriteCommandLCD(0x80); //游標移到第一行開頭 init_DS18B20(); write_byte(0xcc); write_byte(0x44); delay(1000); //等溫度轉換完畢,至少要750 ms init_DS18B20(); write_byte(0xcc); write_byte(0xbe); temp_low = read_byte(); temp_high = read_byte(); temperature=temp_high*256 + temp_low; //將2次讀到的數值轉成實際溫度 if (temperature < 0) { WriteDataLCD('-'); //顯示溫度為負 temperature = -temperature; //將溫度轉成正值 } else WriteDataLCD(' '); // 溫度正時該欄位顯示空白 temp_d = temperature/16; //取出溫度整數部分,前12為原為整數值, 後4位元為小數 tmp = temp_d/100; //取出百位數 if (tmp == 0) WriteDataLCD(' '); //取出百位數是0, 則顯示空白 else WriteDataLCD('1'); //取出百位數不是0, 則顯示1,因上限只會量到125度 tmp = temp_d%100; WriteDataLCD(tmp/10+0x30); //取出十位數,並改成ASCII碼,顯示於LCD WriteDataLCD(tmp%10+0x30); //取出個位數,並改成ASCII碼,顯示於LCD WriteDataLCD('.'); //顯示小數點 WriteDataLCD(digit[temperature%16]); //顯示小數值 } } void write_byte(char dat) //寫資料到ds18b20, 從最低位元開始寫 { unsigned char i; bit testb; for(i=0;i<8;i++) { testb=dat&0x01; //讀取最低位元 dat=dat>>1; //將資料右移一位元, 等待下次判斷最低位元 DQ = 0; delay_us(10); //持續10 us,初始訊號 DQ = testb; delay_us(20); //持續20 us,等待寫入ds18b20 DQ = 1; delay_us(35); //持續35 us,等待ds18b20回復 } } unsigned char read_byte(void) //從ds18b20讀取一位元組訊號, 從最低位元開始讀 { unsigned char i,j,tmp; tmp = 0; // for(i=0;i<8;i++) { DQ=0; delay_us(2); //起始訊號, 持續 2 us DQ=1; delay_us(10); //等待10 us後再讀訊號訊號 j = DQ; //把讀到的1位元資料放到 j tmp=(j<<7)|(tmp>>1); //讀出的資料最低位在最前面,原來的資料向右移一個位元 delay_us(50); //持續50 us,等待ds18b20回復 } return tmp; } void init_DS18B20(void) { DQ = 0; delay_us(500); DQ = 1; delay_us(500); } void delay(int t) // 延遲函數開始 { int i,j; // 宣告整數變數i,j for (i=0;i