www.pudn.com > STC.rar > STC12C5616AD_ADC_C_CODE.C, change:2009-08-19,size:2792b


/* ------------------------- 宏晶科技   05/02/2009 -------------------- */  
/* ----------------------0755-82948412-------------------------------- */  
 
//  ADC DEMO_56xx 程序演示 STC1256xxAD 系列 MCU 的 A/D 转换功能。时钟 18.432MHz 
//  转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。 
//--------------------------------------------------------------------- 
//#include "STC12C5620AD.H" 
//--------------------------------------------------------------------- 
 
sfr ADC_LOW2  = 0xBE;  
sfr ADC_CONTR = 0xC5;  
sfr ADC_DATA  = 0xC6; 
sfr P1M0 = 0x92;  
sfr P1M1 = 0x91;  
//--------------------------------------------------------------------- 
//以下选择 ADC 转换速率,只能选择其中一种 
                        //          SPEED1 SPEED0  A/D转换所需时间 
#define AD_SPEED   0x60 //0110,0000   1      1     270个时钟周期转换一次, 
                        //                         CPU工作频率27MHz时, 
                        //                         A/D转换速度约100KHz 
//#define AD_SPEED   0x40 //0100,0000   1      0     540个时钟周期转换一次 
//#define AD_SPEED   0x20 //0010,0000   0      1     810个时钟周期转换一次 
//#define AD_SPEED   0x00 //0000,0000   0      0     1080个时钟周期转换一次 
//--------------------------------------------------------------------- 
 
void init_adc(); 
unsigned int get_AD_result(unsigned char channel); 
void adc_delay(unsigned char delay_time);       // 延时函数 
//--------------------------------------------------------------------- 
void init_adc() 
{ 
	ADC_CONTR = ADC_CONTR|0x80; //打开adc电源 
	P1M0 = 0x80;                //P1.7为开漏模式 
	P1M1 = 0x80;                // 
} 
 
 
//--------------------------------------------------------------------- 
void adc_delay(unsigned char delay_time)        // 延时函数 
{ 
    unsigned int n; 
    while(delay_time--)  
    {  
        n = 6000; 
        while(--n); 
    } 
} 
 
 
//--------------------------------------------------------------------- 
unsigned int get_AD_result(unsigned char channel) 
{ 
    unsigned int adc_result; 
	ADC_DATA   = 0; 
    channel &= 0x07;                //0000,0111 清0高5位 
    ADC_CONTR = AD_SPEED; 
    ADC_CONTR = 0xE0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位 
    ADC_CONTR |= channel;           //选择 A/D 当前通道 
    adc_delay(1);                       //使输入电压达到稳定 
    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,  
    while (1)                       //等待A/D转换结束 
    { 
        if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否 
        { break; } 
    } 
    ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,  
	 
	adc_result = (( adc_result | ADC_DATA ) <<2 ) |	(ADC_LOW2&0x03); 
    return (adc_result);  
 
}