需要一個STC15W408AS單片機測量兩個模擬量,測量一路的我會,我測一個用的是P1.1口我不知道怎么測量兩個,我把我的一路的得參考內部電壓的AD程序發出來大家幫我改改,改好的分拿走!(參考意見:好像內核就1個ADC,所以得測完一路然后計算發送給寄存器,也就是變量V是多少,然后在測量另外一路的,在重復此過程,在定義一個變量T是多少,有點像雙離合)
//內部BandGap為基準測電壓
//-----------------------------------------
#define uchar unsigned char
#define uint unsigned int
unsigned int v;
//ADC相關設定參數
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個時鐘
#define ADC_SPEEDL 0x20 //360個時鐘
#define ADC_SPEEDH 0x40 //180個時鐘
#define ADC_SPEEDHH 0x60 //90個時鐘
//-----------------------------------------
//BandGap相關參數
//注意:需要在下載代碼時選擇"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
//#define ID_ADDR_ROM 0x03f7 //1K程序空間的MCU
//#define ID_ADDR_ROM 0x07f7 //2K程序空間的MCU
//#define ID_ADDR_ROM 0x0bf7 //3K程序空間的MCU
//#define ID_ADDR_ROM 0x0ff7 //4K程序空間的MCU
//#define ID_ADDR_ROM 0x13f7 //5K程序空間的MCU
#define ID_ADDR_ROM 0x1ff7 //8K程序空間的MCU
//#define ID_ADDR_ROM 0x27f7 //10K程序空間的MCU
//#define ID_ADDR_ROM 0x2ff7 //12K程序空間的MCU
//#define ID_ADDR_ROM 0x3ff7 //16K程序空間的MCU
//#define ID_ADDR_ROM 0x4ff7 //20K程序空間的MCU
//#define ID_ADDR_ROM 0x5ff7 //24K程序空間的MCU
//#define ID_ADDR_ROM 0x6ff7 //28K程序空間的MCU
//#define ID_ADDR_ROM 0x7ff7 //32K程序空間的MCU
//#define ID_ADDR_ROM 0x9ff7 //40K程序空間的MCU
//#define ID_ADDR_ROM 0xbff7 //48K程序空間的MCU
//#define ID_ADDR_ROM 0xcff7 //52K程序空間的MCU
//#define ID_ADDR_ROM 0xdff7 //56K程序空間的MCU
//#define ID_ADDR_ROM 0xeff7 //60K程序空間的MCU
//-----------------------------------------
//聲明
void Delay20ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 234;
k = 113;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x02; //設置P1口為AD口
ADC_RES = 0; //清除結果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay20ms();
}
/*----------------------------
讀取ADC結果
----------------------------*/
uint GetADCResult(uchar ch)
{
uint ADC_10BIT_RES;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4個NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
ADC_CONTR &= ~ADC_FLAG; //關閉 ADC
ADC_10BIT_RES=ADC_RES; //得到高8位
ADC_10BIT_RES<<=2;
ADC_10BIT_RES+=ADC_RESL; //得到低2位
return ADC_10BIT_RES; //返回ADC結果
}
/*----------------------------
發送ADC結果
----------------------------*/
void ShowResult(uchar ch)
{
uint adc_res10,//測量設定通道adc值
bandgap, //bandgap預儲存校準值,單位毫伏
adc_9gallery_res; //測量第九通道(bandgap)值
float power_voltage, //系統供電電壓,單位毫伏
ADC_voltage; //設定通道電壓值,單位毫伏
uchar code *cptr; //定義ROM(代碼)區指針
//uchar idata *iptr;//定義RAM(內存)區指針
cptr = ID_ADDR_ROM; //從程序區讀取BandGap電壓值(單位:毫伏mV)
bandgap=*cptr++;
bandgap<<=8;
bandgap+=*cptr;
/*iptr = ID_ADDR_RAM; //從內存區讀取BandGap電壓值(單位:毫伏mV)
bandgap=*iptr++; //兩種方法結果一樣,上面的方法需要在下載式勾選"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
bandgap<<=8; //下面的方法不需要
bandgap+=*iptr; */
//測量設定通道adc值
ADC_RES = 0; //清除結果寄存器
P1ASF = 0x02; //設置P1口為AD口
GetADCResult(ch);
GetADCResult(ch); //讀三次獲得穩定
adc_res10= GetADCResult(ch);
//測量第九通道(bandgap)值
ADC_RES = 0; //清除結果寄存器
P1ASF = 0x00; //設置讀第九通道
GetADCResult(0); //測bandgap時,調用此函數時通道數只能填0
GetADCResult(0); //讀三次獲得穩定
adc_9gallery_res=GetADCResult(0);
//計算系統供電電壓
power_voltage=(float)bandgap*1024/adc_9gallery_res;
//計算ADC通道測得電壓值
ADC_voltage=(float)bandgap*adc_res10/adc_9gallery_res;
v=ADC_voltage;
}
|