保证能用的ADC程序贡献给大家。
随后几天本人将学习产生PWM波形,哪位前辈的程序也请贡献下!!
/***********************************************************
**文 件 名:sys.c
**创建时间:2012/08/10
**作 者:JIM XUAN
************************************************************
**功 能: 处理单片机核心资源的函数
**备 注: 采用内置的RC=16Mhz振荡器 ,默认8分频,SysClk=2mHZ
**修 改:
************************************************************
*/
void ADC_Init(void)
{
CLK_PCKENR2 |= CLK_ADC1; //给ADC1喂时钟,否则ADC不工作。
ADC1_CR1 = 0x01 ;//开启ADC电路 + 单次取样
ADC1_CR2 = 0b10000010; //0..23通道,取样16分频
ADC1_CR3 = 0b01000000; //24,TS,Vref 通道,取样16分频
}
usint AD(unsigned char channel)
{
unsigned int k =0;
unsigned char i=0;
unsigned char j=0;
CLI(); //这句放在 For内不行
//复杂的选择ADC1 通道。单次取样用ADC1_SRQx寄存器,请仔细看说明书。
ADC1_SQR4 = ADC1_SQR3 = ADC1_SQR2 = ADC1_SQR1 = 0;
if (channel<=7)
ADC1_SQR4 |= (1<<channel);
else if (channel<=15)
ADC1_SQR3 |= (1<<(channel-8));
else if (channel<=23)
ADC1_SQR2 |= (1<<(channel-16));
k=0;
for (i=0 ; i<5 ; i++)
{
ADC1_CR1 |= (1<<START);
for (j=0 ; j<100; j++); //简单延时下
while ((ADC1_SR & (1<<EOC))==0); //等待取样结束
ADC1_SR &= (~(1<<EOC)); //马上清标志位
if (i>0) //废弃第一次取样
k += (unsigned int)((unsigned int)(ADC1_DRH<<8)+(unsigned int)(ADC1_DRL)) ;
}
k /= 4 ;// 4次累计平均数
SEI();
return (unsigned int)k;
}
-----------------------------
/***********************************************************
**文 件 名:SM_STM8L151_REGS.h
**创建时间:2012/08/10
**作 者:JIM XUAN
************************************************************
**功 能:处理单片机核心资源的定义,Bit标识符
**备 注:
**修 改:
***********************************************************/
#ifndef __SM_STM8L151_REGS_H
#define __SM_STM8L151_REGS_H
/* Peripheral clock gating register 1 (CLK_PCKENR1) */
#define CLK_DAC 7
#define CLK_BEEP 6
#define CLK_USART1 5
#define CLK_SPI1 4
#define CLK_I2C1 3
#define CLK_TIM4 2
#define CLK_TIM3 1
#define CLK_TIM2 0
/* Peripheral clock gating register 2 (CLK_PCKENR2) */
#define CLK_BOOTROOM 7 //
#define CLK_COMP12 5
#define CLK_DMA1 4
#define CLK_LCD 3
#define CLK_RTC 2
#define CLK_TIM1 1
#define CLK_ADC1 0
/* ADC1 ADC1_CR1 */
#define OVERIE 7
#define RES1 6
#define RES0 5
#define AWDIE 4
#define EOCIE 3
#define CONT 2
#define START 1
#define ADON 0
/* ADC1_CR2 */
#define PRESC 7
#define TRIG_EDGE1 6
#define TRIG_EDGE0 5
#define EXTSEL1 4
#define EXTSEL0 3
#define SMTP12 2
#define SMTP11 1
#define SMTP10 0
/* ADC1_CR3 */
#define SMTP22 7
#define SMTP21 6
#define SMTP20 5
#define CHSEL4 4
#define CHSEL3 3
#define CHSEL2 2
#define CHSEL1 1
#define CHSEL0 0
#define ADC1_VREFINT 0b00011100
#define ADC1_TS 0b00011101
/* ADC1_SR */
#define OVER 2 //overrun flag
#define AWD 1 //Analog watchdog flag,电压过高or过低。可定义高低阀值。
#define EOC 0 //End of conversion
#endif |