使用Proteus8.9仿真STM32F103 ADC的項目文件,大家一起探討。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (69.14 KB, 下載次數: 63)
下載附件
2022-5-12 18:07 上傳
ADC.png (155.44 KB, 下載次數: 52)
下載附件
仿真界面
2022-5-12 15:55 上傳
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)
2022-5-12 18:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|