stm32_adc转换,模拟输入端为PB0
单片机源程序如下:
- #include "stm32f10x.h"
- #include "public.h"
- u16 Value;
- u16 voltage;
- u16 ge;
- u16 shi;
- u16 bai;
- u16 qian;
- u16 wan;
- void delay(u32 i)
- {
- while(i--);
- }
- void RCC_Configuration()
- {
- SystemInit(); //系统时钟初始化
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开端口A的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开端口B的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打开端口C的时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//打开TIM2的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//打开ADC1的时钟
- }
- void GPIO_Configuration()
- {
- GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; //选择你要设置的IO口
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
- GPIO_Init(GPIOB,&GPIO_InitStructure); // 初始化GPIOB
- GPIO_Init(GPIOC,&GPIO_InitStructure); // 初始化GPIOC
- GPIO_SetBits(GPIOB,GPIO_Pin_All); //为LCD各引脚拉高电平
- GPIO_SetBits(GPIOC,GPIO_Pin_All);
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //PB0设为模拟输入脚
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- }
- void LcdWriteCom(u8 com) //向LCD写入命令 //LCD_E =PC15;LCD_RW=PC14;LCD_RS=PC13;LCD_DATA=PA0~PA7
- {
- u16 zhi;
- zhi=com;
- zhi=zhi<<8;
- GPIO_ResetBits(GPIOC,GPIO_Pin_15); //LCD_E =0; //使能清零
- GPIO_ResetBits(GPIOC,GPIO_Pin_13); //LCD_RS=0; //选择写入命令
- GPIO_ResetBits(GPIOC,GPIO_Pin_14); //LCD_RW=0; //选择写入
- GPIO_Write(GPIOB,zhi); //LCD_DATA
- delay(10000); //Delay1ms(1); //6000000约为1S
- GPIO_SetBits(GPIOC,GPIO_Pin_15); //LCD_E =1; //写入时序
- delay(50000); //Delay1ms(5); //5mS以上
- GPIO_ResetBits(GPIOC,GPIO_Pin_15); //LCD_E =0;
- zhi=zhi<<4;
- GPIO_Write(GPIOB,zhi); //发送com的低四位
- delay(10000); //Delay1ms(1); //6000000约为1S
- GPIO_SetBits(GPIOC,GPIO_Pin_15); //LCD_E =1; //写入时序
- delay(50000); //Delay1ms(5); //5mS以上
- GPIO_ResetBits(GPIOC,GPIO_Pin_15); //LCD_E =0;
- }
- void LcdWriteData(u8 dat) //向LCD写入数据
- {
- u16 zhi;
- zhi=dat;
- zhi=zhi<<8;
- GPIO_ResetBits(GPIOC,GPIO_Pin_15); //LCD_E =0; //使能清零
- GPIO_SetBits(GPIOC,GPIO_Pin_13); //LCD_RS=1; //选择写入数据
- GPIO_ResetBits(GPIOC,GPIO_Pin_14); //LCD_RW=0; //选择写入
- GPIO_Write(GPIOB,zhi); //LCD_DATA
- delay(10000); //Delay1ms(1);
- GPIO_SetBits(GPIOC,GPIO_Pin_15); //LCD_E =1; //写入时序
- delay(50000); //Delay1ms(5); //5mS以上
- GPIO_ResetBits(GPIOC,GPIO_Pin_15); //LCD_E =0;
- zhi=zhi<<4;
- GPIO_Write(GPIOB,zhi); //发送dat的低四位
- delay(10000); //Delay1ms(1);
- GPIO_SetBits(GPIOC,GPIO_Pin_15); //LCD_E =1; //写入时序
- delay(50000); //Delay1ms(5);
- GPIO_ResetBits(GPIOC,GPIO_Pin_15); //LCD_E =0;
- }
- void SendString_LCD(u8 *s)
- {
- while(*s!='\0')
- {
- LcdWriteData(*s);
- s++;
- }
- }
- void LCD_Configuration()
- {
- LcdWriteCom(0x32); //将8位总线转为4位总线
- LcdWriteCom(0x28); //在四位线下的初始化
- LcdWriteCom(0x0c); //开显示,设光标
- LcdWriteCom(0x06); //写一个指针加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //设置数据指针起点
- }
- void LCD_NewChar()
- {
- u8 i;
- u8 table0[]={0x1E,0x02,0x12,0x1F,0x01,0x1F,0x01,0x03};
- u8 table1[]={0x0A,0x1F,0x04,0x1F,0x04,0x0F,0x15,0x07};
- u8 table2[]={0x1C,0x05,0x06,0x05,0x04,0x05,0x03,0x00};
- LcdWriteCom(0x40);
- for(i=0;i<8;i++)
- LcdWriteData(table0[i]); //将代码写入CGRAM中
- for(i=0;i<8;i++)
- LcdWriteData(table1[i]); //将代码写入CGRAM中
- for(i=0;i<8;i++)
- LcdWriteData(table2[i]); //将代码写入CGRAM中
- }
- void ADC_Configuration()
- {
- ADC_InitTypeDef ADC_InitStructure; //声明一个结构体
- RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置ADC时钟分频
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式
- ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能多通道扫描模式
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件启动转换
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
- ADC_InitStructure.ADC_NbrOfChannel = 1; //指定将转换的ADC通道的数量
- ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
- ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); //ADC1选择信道8,转换顺序1,采样时间55.5周期
- ADC_Cmd(ADC1, ENABLE); //使能ADC1
- ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待ADC1校准重置完成
- ADC_StartCalibration(ADC1); //开始ADC1校准
- while(ADC_GetCalibrationStatus(ADC1)); //等待ADC1校准完成
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
- }
- int main()
- {
- RCC_Configuration();
- GPIO_Configuration();
- LCD_Configuration();
- SendString_LCD("1428401034");
- LcdWriteCom(0xC0); //设置数据指针起点
- ADC_Configuration();
- while(1)
- {
- delay(10000000);
- Value=ADC_GetConversionValue(ADC1);
- voltage=Value*323/4095;
- ge=voltage%10;
- shi=voltage/10%10;
- bai=voltage/100%10;
- qian=voltage/1000%10;
- wan=voltage/1000%10;
- LcdWriteCom(0xC0); //设置数据指针起点
- LcdWriteData(bai+'0');
- LcdWriteData('.');
- LcdWriteData(shi+'0');
- LcdWriteData(ge+'0');
- LcdWriteData('V');
- }
- }
复制代码
所有资料51hei提供下载:
STM32_ADC.rar
(359.65 KB, 下载次数: 47)
|