

主函数:
/*******************************************************************************
 //
 // 使用单片机STM32F103C8T6
 // 晶振:8.00M
 // 编译环境 Keil uVision4
 // 在3.3V的供电环境下,就能运行
 // 波特率 19200 串口2 PA2(Tx)  PA3(Rx)
 // stm32f100c8t6,8Mhz
 // 使用ADC1_in0通道 PA0 
 // 发送一次ad值就必须接受一个字符'3',然后再次发送
 *******************************************************************************/
 #include "stm32f10x_lib.h"
 #include "usart.h"
 #include "delay.h"
 #include "sys_config.h"
 #include "adc.h"
 #include  <math.h>    //Keil library  
 #define   uchar unsigned char
 #define   uint unsigned int    
   /*
 ********************************************************************************
 ** 函数名称 : main(void)
 ** 函数功能 : 主函数
 ** 输    入    : 无
 ** 输    出    : 无
 ** 返    回    : 无
 ********************************************************************************
 */
int main(void)
 {
   RCC_Configuration();         //配置RCC
   NVIC_Configuration();         //配置中断,没有这一句郁闷了很久
   GPIO_Configuration();         //配置GPIO
   Adc_init();                //初始化ADC
   USART2_Configuration();     //配置串口1
   Delayms(500);                 //延时
   while(1)
  {
    
 //    USART1_SendData(0X0D);     //换行
 //    USART1_SendData(0X0A);     //回车
     Delayms(5);                 //延时
   }
 }
/*************结束***************/
adc.c:
#include <stm32f10x_lib.h>
 #include "adc.h"
     
   unsigned char i=0;
   u16 ad[3]={2040,2040,2040};
           
 //初始化ADC
 //这里我们仅以规则通道为例
 //我们默认将开启通道1                                                                       
 void  Adc_init(void)
 {    
     //先初始化IO口
      RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
     GPIOA->CRL&=0XFFFFF;//PA5 6 7模拟输入            
     RCC->APB2ENR|=1<<9;    //ADC1时钟使能      
     RCC->APB2RSTR|=1<<9;   //ADC1复位
     RCC->APB2RSTR&=~(1<<9);//复位结束        
     RCC->CFGR&=~(3<<14);   //分频因子清零    
     RCC->CFGR|=2<<14;          
    ADC1->CR1&=0XF0FFFF;   //工作模式清零
     ADC1->CR1|=0<<16;      //独立工作模式  
     ADC1->CR1&=~(1<<8);    //非扫描模式      
     ADC1->CR2&=~(1<<1);    //单次转换模式
     ADC1->CR2&=~(7<<17);       
     ADC1->CR2|=7<<17;       //软件控制转换  
     ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!!    必须使用一个事件来触发
     ADC1->CR2&=~(1<<11);   //右对齐    
     ADC1->SQR1&=~(0XF<<20);
     ADC1->SQR1&=0<<20;     //1个转换在规则序列中 也就是只转换规则序列1                
    ADC1->SMPR2&=0XFF007FFF;//通道5 6 7采样时间清空          
     ADC1->SMPR2|=  0XFF8000;      //通道5 6 7  239.5周期,提高采样时间可以提高精确度    
    ADC1->CR2|=1<<0;        //开启AD转换器    
     ADC1->CR2|=1<<3;        //使能复位校准  
     while(ADC1->CR2&1<<3);  //等待校准结束             
     //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。         
     ADC1->CR2|=1<<2;        //开启AD校准       
     while(ADC1->CR2&1<<2);  //等待校准结束
     //该位由软件设置以开始校准,并在校准结束时由硬件清除  
 }                  
 //获得ADC值
 //ch:通道值 5 6 7
 u16 Get_Adc(u8 ch)   
 {
     //设置转换序列              
     ADC1->SQR3&=0XFFFFFFF0;//规则序列1 通道ch
     ADC1->SQR3|=ch;                          
     ADC1->CR2|=1<<22;       //启动规则转换通道
     while(!(ADC1->SR&1<<1));//等待转换结束            
     return ADC1->DR;        //返回adc值    
 }
u16 Adc_filter()
 {
   u16 adc;
    if(i>2)
       i=0;
     ad[i]=Get_Adc(7);            //0通道
     i++;
     adc=(ad[0]+ad[1]+ad[2])/3;     //这样做是防止数值突变
     //Show_data_u16(adc);
     return adc;             
 }















![[附源码]计算机毕业设计基于Vue的社区拼购商城Springboot程序](https://img-blog.csdnimg.cn/005011ba90164b02a28520def08818da.png)


