使用Proteus8.9仿真STM32F103 ADC的项目文件,大家一起探讨。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真界面
keil项目文件proteus文件
单片机源程序如下:
- /*******************************************************************************
- *
- * 软件功能: GPIO闪灯实验(软件延时方式)
- *
- *******************************************************************************/
- #include "stm32f10x.h"
- #include <stdio.h>
- #include <string.h> // 加入此头文件后,可使用strstr库函数
- #include <stdlib.h>
- #include <stdint.h>
- #include "led.h"
- #include "key.h"
- #include "usart.h"
- #include "timer.h"
- #include "adc.h"
- u8 adcflag;
- void RCC_Configuration(void)
- {
- // ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
- RCC_DeInit(); //复位RCC外部设备寄存器到默认值
- //RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
- //HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
- // if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
- // {
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
- FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时
-
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK
- RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
- RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟
-
- RCC_PLLConfig(RCC_PLLSource_HSI_Div2 , RCC_PLLMul_2); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
- RCC_PLLCmd(ENABLE); //使能PLL时钟
-
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
- {
- }
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟
- while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
- {
- }
- // }
-
-
- }
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
-
- NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- void EXTI_Configuration(void)
- {
- EXTI_InitTypeDef EXTI_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- EXTI_InitStructure.EXTI_Line= EXTI_Line4;
- EXTI_InitStructure.EXTI_LineCmd=ENABLE;
- EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
-
- EXTI_Init(&EXTI_InitStructure);
- EXTI_ClearITPendingBit(EXTI_Line4);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
- }
- void EXTI4_IRQHandler(void)
- {
- if(EXTI_GetFlagStatus(EXTI_Line4)!=RESET)
- {
- if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_15)==0)
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_15);
- }
- else
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_15);
- }
- }
- // EXTI_ClearFlag(EXTI_Line4);
- EXTI_ClearITPendingBit(EXTI_Line4);
- }
- /*************************************************
- 函数: void GPIO_Configuration(void)
- 功能: GPIO配置
- 参数: 无
- 返回: 无
- **************************************************/
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 ;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void delay(u32 tim)
- {
- for(;tim>0;tim--);
- }
- void delay_ms(u32 tim)
- {
- u16 i;
- for(;tim>0;tim--)
- {
- for(i=2500;i>0;i--);
- }
- }
- /*************************************************
- 函数: int main(void)
- 功能: main主函数
- 参数: 无
- 返回: 无
- **************************************************/
- int main(void)
- {
- u16 keytemp;
- char buf[32];
- char readbuf[32];
- uint16_t advalue,temp;
- float voltage;
- //RCC_Configuration();
- RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
- GPIO_Configuration();
- NVIC_Configuration();
- EXTI_Configuration();
- USART1_Configuration();
- TIMER2_Configuration();
- ADC_Configuration();
- ledinit();
- keyinit();
- USART_SendData(USART1,'A');
- delay_ms(10);
-
- while(1)
- {
- keytemp =keyscan();
- switch(keytemp)
- {
- case 1:
- led(1,ON);
- led(2,OFF);
- break;
- case 2:
- led(2,ON);
- led(1,OFF);
- break;
- case 3:
- led(1,ON);
- led(2,ON);
- break;
- default:
- led1off();
- led2off();
- break;
- }
- if(adcflag)
- {
- adcflag =0;
- memset(buf, 0, 32);
- memset(readbuf, 0, 32);
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件启动ADC转换
- //while(ADC_GetITStatus(ADC1,ADC_IT_EOC) == RESET);
- delay(100000);
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);
- advalue = ADC_GetConversionValue(ADC1);
- advalue &=0x0FFF;
- GPIO_ResetBits(GPIOC,GPIO_Pin_14);
- voltage =(float)advalue*(5000/4096.0);
- advalue = (uint16_t)voltage;
- temp = advalue/1000;
- printf("ADC Result:%d",temp);
- temp= advalue%1000;
- printf(".%d V\r\n",temp);
- }
- }
- }
复制代码
Keil5代码与Proteus8.9仿真下载:
仿真程序.7z
(242.31 KB, 下载次数: 185)
|