/****ADC片内温度****/
CLKCONCMD &= ~0x40; //晶振
while(!(SLEEPSTA & 0x40)); //等待晶振稳定
CLKCONCMD &= ~0x47; //TICHSPD128分频,CLKSPD不分频
SLEEPCMD |= 0x04; //关闭不用的RC振荡器
void initTempSensor(void){
DISABLE_ALL_INTERRUPTS(); /****#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00) ****/
SET_MAIN_CLOCK_SOURCE(0); /****#define SET_MAIN_CLOCK_SOURCE(source) \
do { \
if(source) { \
CLKCONCMD |= 0x40; \
while(!HIGH_FREQUENCY_RC_OSC_STABLE); \
SLEEPCMD |= 0x04; \
} \
else { \
SLEEPCMD &= ~0x04; \
while(!XOSC_STABLE); \
asm("NOP"); \
CLKCONCMD &= ~0x47; \
SLEEPCMD |= 0x04; \
} \
}while (0) ****/
*((BYTE __xdata*) 0xDF26) = 0x80; //0xDF26是温度传感器控制单元,80启动它工作
}
INT8 getTemperature(void){
UINT8 i;
UINT16 accValue;
UINT16 value;
accValue = 0;
for( i = 0; i < 4; i++ )
{
ADC_SINGLE_CONVERSION(ADC_REF_1_25_V | ADC_14_BIT | ADC_TEMP_SENS); /****#define ADC_SINGLE_CONVERSION(settings) \
do{ ADCCON3 = (settings); }while(0)
****/
ADC_SAMPLE_SINGLE(); /****#define ADC_SAMPLE_SINGLE() \
do { ADC_STOP(); ADCCON1 |= 0x40; } while (0)
****/
while(!ADC_SAMPLE_READY()); /****#define ADC_SAMPLE_READY() (ADCCON1 & 0x80)****/
value = ADCL >> 2;
value |= (((UINT16)ADCH) << 6);
accValue += value;
}
value = accValue >> 2; // devide by 4
return ADC14_TO_CELSIUS(value); /****#define ADC14_TO_CELSIUS(ADC_VALUE) ( ((ADC_VALUE) >> 4) - 315)****/
}
/****ADC电压测量****/
P0DIR &= ~(0x01<<(6)); //在P06 ADC采集
INT16 halAdcSampleSingle(uchar reference, uchar resolution, uchar input) {
uchar volatile temp;
INT16 value;
INT16 value1;
INT16 value2;
//reading out any old conversion value
temp = ADCH;
temp = ADCL;
ADCCFG |= (0x01<<input);
ADCCON1 |= 0x30; //停止ADC采样
Delay(50); //延时等待
ADCCON3 = (reference | resolution | input);
while (!(ADCCON1 & 0x80)); //等待ADC采集完成
ADCCFG &= ~(0x01<<input); //关闭ADC采集
value = ADCL; //读取ADC采样值
value |= (((INT16)ADCH) << 8);
value1 = ADCL;
value2 = ADCH;
if(value & 0x8000)
{
value = ~value + 1;
}
resolution >>= 3;
value >>= (7 - resolution);
asm("nop");
asm("nop");
return value;
}