C8051F850 ADC Polling Example

有项目需要用到Silabs 的C8051F850. 其实最主要是看中了价格,以及其工作温度。因此需要开始学习这颗片子。如下是最简单的ADC例程:

对系统时钟进行初始化,对IO进行初始化等。P1.0为LED输出,P1.2为ADC输入。ADC采用VDD和GND为参考源。并使用Polling的方式,而不是中断的方式。

void C8051F850_IO_Initial(void)
{
    //Disable Watchdog with key sequence
    WDTCN = 0xDE;
    WDTCN = 0xAD;
    
    //Using internal 24.5MHz RC Oscillator, and no Division
    CLKSEL = CLKSEL_CLKSL__HFOSC | CLKSEL_CLKDIV__SYSCLK_DIV_1;
    
    //GPIO initial
    P0MDOUT = P0MDOUT_B0__OPEN_DRAIN | P0MDOUT_B1__OPEN_DRAIN | P0MDOUT_B2__OPEN_DRAIN
		 | P0MDOUT_B3__OPEN_DRAIN | P0MDOUT_B4__PUSH_PULL | P0MDOUT_B5__OPEN_DRAIN
		 | P0MDOUT_B6__OPEN_DRAIN | P0MDOUT_B7__OPEN_DRAIN;
    
    //P1.0 LED output, P1.2 ADC input
    P1MDOUT = P1MDOUT_B0__PUSH_PULL | P1MDOUT_B1__OPEN_DRAIN | P1MDOUT_B2__OPEN_DRAIN
		 | P1MDOUT_B3__OPEN_DRAIN | P1MDOUT_B4__OPEN_DRAIN | P1MDOUT_B5__OPEN_DRAIN
		 | P1MDOUT_B6__OPEN_DRAIN | P1MDOUT_B7__OPEN_DRAIN;
    
    //P1.2 Alalog ADC input
    P1MDIN = P1MDIN_B0__DIGITAL | P1MDIN_B1__DIGITAL | P1MDIN_B2__ANALOG
		 | P1MDIN_B3__DIGITAL | P1MDIN_B4__DIGITAL | P1MDIN_B5__DIGITAL
		 | P1MDIN_B6__DIGITAL | P1MDIN_B7__DIGITAL;
    
    P1SKIP = P1SKIP_B0__NOT_SKIPPED | P1SKIP_B1__NOT_SKIPPED | P1SKIP_B2__SKIPPED
		 | P1SKIP_B3__NOT_SKIPPED | P1SKIP_B4__NOT_SKIPPED | P1SKIP_B5__NOT_SKIPPED
		 | P1SKIP_B6__NOT_SKIPPED | P1SKIP_B7__NOT_SKIPPED;
    
    //CrossBar initial
    XBR0 = XBR0_URT0E__DISABLED | XBR0_SPI0E__DISABLED | XBR0_SMB0E__DISABLED
		 | XBR0_CP0E__DISABLED | XBR0_CP0AE__DISABLED | XBR0_CP1E__DISABLED
		 | XBR0_CP1AE__DISABLED | XBR0_SYSCKE__DISABLED;
    
    XBR2 = XBR2_WEAKPUD__PULL_UPS_ENABLED | XBR2_XBARE__ENABLED;
    
    //ADC initial
    ADC0MX = ADC0MX_ADC0MX__ADC0P10;
    
    ADC0CF = (1 << ADC0CF_ADSC__SHIFT) | ADC0CF_AD8BE__NORMAL | ADC0CF_ADGN__GAIN_1
		 | ADC0CF_ADTM__TRACK_NORMAL;
    
    //ADC enable and start by writing ADBUSY
    ADC0CN0 &= ~ADC0CN0_ADCM__FMASK;
    ADC0CN0 |= ADC0CN0_ADEN__ENABLED
		 | ADC0CN0_ADCM__ADBUSY;
    
    //Voltage reference control
    REF0CN = REF0CN_REFSL__VDD_PIN | REF0CN_IREFLVL__2P4 | REF0CN_GNDSL__GND_PIN
		 | REF0CN_TEMPE__TEMP_DISABLED;
    
    //Interrupt, All interrupt disabled
    EIE1 = EIE1_EADC0__DISABLED | EIE1_ECP0__DISABLED | EIE1_ECP1__DISABLED
		 | EIE1_EMAT__DISABLED | EIE1_EPCA0__DISABLED | EIE1_ESMB0__DISABLED
		 | EIE1_ET3__DISABLED | EIE1_EWADC0__DISABLED;
}

在主函数中有如下的调用:

void main( void )
{
    C8051F850_IO_Initial();
    
    while(1)
    {
        unsigned long Delay = 60000;
        while(Delay--);
        
        ADC0CN0_bit.AD0BUSY = 1; //ADC start by Soft trigger 
        while(ADC0CN0_bit.AD0INT == 0); //Wait for ADC complate
        ADC0CN0_bit.AD0INT = 0; //Clear ADC Flag
        
        ADCValue = ADC0H;
        ADCValue = ADCValue << 8;
        ADCValue = ADC0L;
        
        if(ADCValue < 128)
        {
            if(LED1)LED1 = 0;
            else LED1 = 1;
        }
        else
        {
            
        }
    }
}


以上代码,基于IAR for 8051编写。


差点忘记了,C8051的官方例程是基于Silabs的官方IDE(Simplicity IDE)编写的,但是由于我比较习惯IAR,因此就把Simplicity IDE用到的一个头文件(SI_C8051F850_Register_Enums.h)稍微修改了下,放到IAR下面调用了。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值