主要程序 /******************************************************************** * 名稱 : Main() * 功能 : 主函數 ***********************************************************************/ void main() { uchar h; uint sum; EA = 0; Timer0_Init(); //定時器0初始化 EA = 1; RW=0; L1602_init(); while(1) { if (FlagStartRH== 1&&set==0) //溫濕度轉換標志檢查 { TR0 = 0; for(h=0;h<50;h++) { DA=adc0832(0); sum=sum+DA; delay_ms(100); Key(); } DA=sum/50; sum=0; DA=DA*(float)(DA/5); ALARM(); if(set==0) display(); TR0 = 1; } Key(); ALARM(); } } uchar ADC0832(bit mode,bit channel) //AD轉換,返回結果 { uchari,dat,ndat; ADCS= 0;//拉低CS端 _nop_(); _nop_(); ADDI = 1; //第1個下降沿為高電平 ADCLK = 1;//拉高CLK端 _nop_(); _nop_(); ADCLK= 0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADDI= mode; //低電平為差分模式,高電平為單通道模式。 ADCLK= 1;//拉高CLK端 _nop_(); _nop_(); ADCLK= 0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADDI= channel; //低電平為CH0,高電平為CH1 ADCLK= 1;//拉高CLK端 _nop_(); _nop_(); ADCLK= 0;//拉低CLK端,形成下降沿3 ADDI= 1;//控制命令結束(經試驗必需) dat = 0; //下面開始讀取轉換后的數據,從最高位開始依次輸出(D7~D0) for(i = 0;i <8;i++) { dat<<= 1; ADCLK=1;//拉高晶振端 _nop_(); _nop_(); ADCLK=0;//拉低晶振端形成一次晶振脈沖 _nop_(); _nop_(); dat|= ADDO; } ndat= 0; //記錄D0 if(ADDO== 1) ndat|= 0x80; //下面開始繼續讀取反序的數據(從D1到D7) for(i= 0;i < 7;i++) { ndat>>= 1; ADCLK= 1;//拉高晶振端 _nop_(); _nop_(); ADCLK=0;//拉低晶振端形成一次晶振脈沖 _nop_(); _nop_(); if(ADDO==1) ndat|= 0x80; } ADCS=1;//拉高CS端,結束轉換 ADCLK=0;//拉低CLK端 ADDI=1;//拉高數據端,回到初始狀態 if(dat==ndat) return(dat); else return0; } /****************************************************************************** 文 件 名 : adc0832.c
@file adc0832.c @brief ADC0832驅動(8位ADC)
******************************************************************************/
/*----------------------------------------------* * 包含頭文件 * *----------------------------------------------*/ #include "main.h"
#ifdef ADC0832_DEV_DRIVER
/*----------------------------------------------* * 宏定義 * *----------------------------------------------*/ #define DEBUG ( 1 )
#if DEBUG #define log(X) print_string(X) #else #define log(X) #endif
///ADC0832 IO口引腳定義 sbit ADC0832_PIN_CS = P1^2; sbit ADC0832_PIN_DO = P1^3; sbit ADC0832_PIN_DI = P1^4; sbit ADC0832_PIN_CLK = P1^5;
///ADC0832 IO操作 #define ADC0832_do_pin_read() ADC0832_PIN_DO
#define ADC0832_di_pin_reset() ADC0832_PIN_DI = 0 #define ADC0832_di_pin_set() ADC0832_PIN_DI = 1
#define ADC0832_clk_pin_reset() ADC0832_PIN_CLK = 0 #define ADC0832_clk_pin_set() ADC0832_PIN_CLK = 1
#define ADC0832_cs_pin_reset() ADC0832_PIN_CS = 0 #define ADC0832_cs_pin_set() ADC0832_PIN_CS = 1
///ADC0832參考電壓 #define ADC0832_AD_REF_VALTAGE (5000ul) /*----------------------------------------------* * 枚舉定義 * *----------------------------------------------*/
/*----------------------------------------------* * 結構體定義 * *----------------------------------------------*/
/*----------------------------------------------* * 外部函數原型說明 * *----------------------------------------------*/
/*----------------------------------------------* * 內部函數原型說明 * *----------------------------------------------*/
/*----------------------------------------------* * 全局變量 * *----------------------------------------------*/
/*----------------------------------------------* * 常量定義 * *----------------------------------------------*/
/*---------------------------------------------------------------------------*/ /** *@brief 讀取adc0832的AD值 * * *@param channel 取值: 0/1, 其他值錯誤 * *@return * * *@note * */ uint16_t adc0832_read_ad(uint8_t channel) { uint8_t i = 0; uint8_t j; uint16_t dat = 0; uint8_t ndat = 0;
if(channel == 0){ channel = 2; }else if(channel == 1){ channel = 3; }else{ log("adc0832 channel err\r\n"); return 0; }
ADC0832_di_pin_set(); _nop_(); _nop_(); ADC0832_cs_pin_reset(); _nop_(); _nop_(); ADC0832_clk_pin_set(); _nop_(); _nop_(); ADC0832_clk_pin_reset(); _nop_(); _nop_(); ADC0832_clk_pin_set(); if(channel&0x1){ ADC0832_di_pin_set(); }else{ ADC0832_di_pin_reset(); } _nop_(); _nop_(); ADC0832_clk_pin_reset(); _nop_(); _nop_(); ADC0832_clk_pin_set(); if((channel>>1)&0x1){ ADC0832_di_pin_set(); }else{ ADC0832_di_pin_reset(); } _nop_(); _nop_(); ADC0832_clk_pin_reset(); ADC0832_di_pin_set(); _nop_(); _nop_(); dat=0; for(i = 0; i < 8; i++) { dat |= ADC0832_do_pin_read(); ADC0832_clk_pin_set(); _nop_(); _nop_(); ADC0832_clk_pin_reset(); _nop_(); _nop_(); dat <<= 1; if(i == 7){ dat |= ADC0832_do_pin_read(); }
} for(i = 0; i < 8; i++) { j = 0; j |= ADC0832_do_pin_read();/* 收數據 */ ADC0832_clk_pin_set(); _nop_(); _nop_(); ADC0832_clk_pin_reset(); _nop_(); _nop_(); j <<= 7; ndat |= j; if( i < 7 ){ ndat >>= 1; } }
ADC0832_cs_pin_set(); ADC0832_clk_pin_reset(); dat <<= 8; dat |= ndat; dat >>= 8;
return dat; } /*---------------------------------------------------------------------------*/ /** *@brief 讀取adc0832電壓值 * * *@param channel 取值: 0/1, 其他值錯誤 * *@return * * *@note * */ uint16_t adc0832_read_voltage_mv(uint8_t channel) { uint32_t ad;
ad = adc0832_read_ad(channel);
///計算電壓值 ad *= ADC0832_AD_REF_VALTAGE; ad >>= 8;
return ad; } /*---------------------------------------------------------------------------*/ /** *@brief adc0832初始化 * * *@param none * *@return * * *@note * */ void adc0832_init(void) { adc0832_read_ad(0);///<讀取Adc0832值,丟棄,防止第一次讀取值時錯誤 } /*---------------------------------------------------------------------------*/
#endif//ADC0832_DEV_DRIVER
|