/*ADC0831轉換程式,請調整精密可變電阻,或有加裝其它感測器(如光敏電阻,濕度感測器,等等),看看會如何變化*/ #include #include sbit SCL=P1^3; //SCL2定義為P1的第3腳,連接ADC0831SCL腳 sbit SDA=P1^4; //SDA2定義為P1的第4腳,連接ADC0831SDA腳 sbit CS=P1^6; //CS2定義為P1的第4腳,連接ADC0831CS腳 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 delay_us(int t) { while(t--); } unsigned char ad0831read(void); //定義該函數為讀取ADC0831的資料 void main(void) //程式開始 { unsigned char tmp; unsigned int tmp1; //tmp1因需做計算,宣告為2byte整數(int)比較不會有捨去誤差 delay_us(20000); //若LCM反應較慢,建議電源啟動後需先等一段時間再規劃LCM,LCM才可正常動作 LCDInit(); //LCM初始化 while(1) { delay_us(20000); //這裡為延遲讀取0831,因CPU比較快,沒必要每次循環都馬上去讀取 WriteCommandLCD(0x80); //游標移到第一行開頭 tmp=ad0831read(); tmp1=tmp; WriteDataLCD(tmp/100+0x30); //取出百位數,並改成ASCII碼,顯示於LCD tmp=tmp%100; WriteDataLCD(tmp/10+0x30); //取出十位數,並改成ASCII碼,顯示於LCD WriteDataLCD(tmp%10+0x30); //取出個位數,並改成ASCII碼,顯示於LCD WriteCommandLCD(0x80+0x40); //游標移到第二行開頭 tmp1=tmp1*176/100; //因ADC0831之參考電壓為電源電壓,故量到的值要轉換顯示於LCM,需適當調整 WriteDataLCD(tmp1/100+0x30); //假設參考電壓量到的值為4.48V,0~255數值轉換成0~4.48V,故需乘1.76(448/255)倍,所得值比原來大100倍,故小數點放在倒數第二位。 WriteDataLCD('.'); //請依量到的VCC電壓調整倍數參考值 tmp1=tmp1%100; WriteDataLCD(tmp1/10+0x30); WriteDataLCD(tmp1%10+0x30); WriteDataLCD('V'); } } unsigned char ad0831read(void)//請先解ADC0831轉換器的串列協議,SCL頻率須在10K~400K之間, { //從最高位元開始讀取, //以後,對於一個硬體這樣的就簡單多 unsigned char i=0,tmp=0; SDA=1; CS=0; _nop_(); _nop_(); SCL=1; delay_us(3); SCL=0; //第一次SCL 1=>0,開始轉換 delay_us(3); for(i=0;i<8;i++) { SCL=1; delay_us(3); SCL=0; delay_us(3); //SCL 1=>0,傳送轉換完成之資料 tmp<<=1; //tmp值乘2, 目前最低位元為0 if(SDA) //如果SDA=1,tmp最低位元設為1 tmp++; } CS=1; return tmp; } //寫資料到LCD副程式 void WriteDataLCD(char WDLCD) { LCD_Data = WDLCD; LCD_RS = 1; LCD_RW = 0; LCD_E = 1; //產生負緣 delay_us(100); //延遲等訊號穩定 LCD_E = 0; delay_us(100); //延遲等訊號處裡完畢 } //寫指令到LCD副程式 void WriteCommandLCD(char WCLCD) //BuysC為0時忽略忙檢測 { LCD_Data = WCLCD; LCD_RS = 0; LCD_RW = 0; LCD_E = 1; delay_us(100); //延遲等訊號穩定 LCD_E = 0; delay_us(100); //延遲等訊號處裡完畢 } void LCDInit(void) //LCM初始化 { WriteCommandLCD(0x38); //設定LCD介面8位元,2行,5*7字型 WriteCommandLCD(0x06); // 顯示游標移動設置 WriteCommandLCD(0x0C); // 顯示開及游標設置 WriteCommandLCD(0x01); //顯示清除 delay_us(5000); }