找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4289|回复: 3
收起左侧

Proteus8.9仿真STM32F103 ADC源程序

[复制链接]
ID:795404 发表于 2022-5-12 15:57 | 显示全部楼层 |阅读模式
使用Proteus8.9仿真STM32F103 ADC的项目文件,大家一起探讨。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

仿真界面

仿真界面

keil项目文件proteus文件

单片机源程序如下:
  1. /*******************************************************************************
  2. *       
  3. * 软件功能:         GPIO闪灯实验(软件延时方式)
  4. *
  5. *******************************************************************************/
  6. #include "stm32f10x.h"
  7. #include <stdio.h>
  8. #include <string.h>           // 加入此头文件后,可使用strstr库函数
  9. #include <stdlib.h>
  10. #include <stdint.h>
  11. #include "led.h"
  12. #include "key.h"
  13. #include "usart.h"
  14. #include "timer.h"
  15. #include "adc.h"

  16. u8 adcflag;
  17. void RCC_Configuration(void)
  18. {
  19. //  ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量
  20.   RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值
  21.   //RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振
  22.   //HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好
  23. // if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好
  24. // {
  25.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
  26.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时
  27.              
  28.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLK
  29.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟
  30.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟
  31.          
  32.     RCC_PLLConfig(RCC_PLLSource_HSI_Div2 , RCC_PLLMul_2);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
  33.     RCC_PLLCmd(ENABLE);                                   //使能PLL时钟
  34.    
  35.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪
  36.     {
  37.     }
  38.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟
  39.     while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟
  40.     {
  41.     }
  42. // }
  43.   
  44.   
  45. }

  46. void NVIC_Configuration(void)
  47. {
  48.     NVIC_InitTypeDef NVIC_InitStructure;
  49.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  50.    
  51.     NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
  52.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
  53.     NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
  54.     NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
  55.     NVIC_Init(&NVIC_InitStructure);
  56.    
  57.     NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  58.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
  59.     NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
  60.     NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
  61.     NVIC_Init(&NVIC_InitStructure);
  62.    
  63.     NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  64.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
  65.     NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
  66.     NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
  67.     NVIC_Init(&NVIC_InitStructure);
  68. }

  69. void EXTI_Configuration(void)
  70. {
  71.     EXTI_InitTypeDef EXTI_InitStructure;
  72.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  
  73.     EXTI_InitStructure.EXTI_Line= EXTI_Line4;
  74.     EXTI_InitStructure.EXTI_LineCmd=ENABLE;
  75.     EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;
  76.     EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;   
  77.    
  78.     EXTI_Init(&EXTI_InitStructure);
  79.     EXTI_ClearITPendingBit(EXTI_Line4);
  80.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
  81. }  

  82. void EXTI4_IRQHandler(void)
  83. {
  84.     if(EXTI_GetFlagStatus(EXTI_Line4)!=RESET)
  85.     {
  86.         if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_15)==0)
  87.         {
  88.             GPIO_SetBits(GPIOC,GPIO_Pin_15);      
  89.         }
  90.         else
  91.         {
  92.             GPIO_ResetBits(GPIOC,GPIO_Pin_15);  
  93.         }
  94.     }
  95. //   EXTI_ClearFlag(EXTI_Line4);
  96.     EXTI_ClearITPendingBit(EXTI_Line4);
  97. }
  98. /*************************************************
  99. 函数: void GPIO_Configuration(void)
  100. 功能: GPIO配置
  101. 参数: 无
  102. 返回: 无
  103. **************************************************/
  104. void GPIO_Configuration(void)
  105. {
  106.   GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体
  107.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);  
  108.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15  ;
  109.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  110.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  111.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  112.    
  113.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5  ;
  114.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  115.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  116.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  117. }


  118. void delay(u32 tim)
  119. {
  120.     for(;tim>0;tim--);
  121. }

  122. void delay_ms(u32 tim)
  123. {
  124.     u16 i;
  125.     for(;tim>0;tim--)
  126.     {
  127.       for(i=2500;i>0;i--);      
  128.     }
  129. }
  130. /*************************************************
  131. 函数: int main(void)
  132. 功能: main主函数
  133. 参数: 无
  134. 返回: 无
  135. **************************************************/
  136. int main(void)
  137. {
  138. u16 keytemp;
  139.     char buf[32];
  140.     char readbuf[32];
  141.         uint16_t advalue,temp;
  142.     float voltage;
  143.     //RCC_Configuration();
  144.     RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);   
  145.     GPIO_Configuration();
  146.     NVIC_Configuration();
  147.     EXTI_Configuration();
  148.     USART1_Configuration();
  149.     TIMER2_Configuration();
  150.     ADC_Configuration();
  151.     ledinit();
  152.     keyinit();
  153.     USART_SendData(USART1,'A');
  154.     delay_ms(10);
  155.    
  156.   while(1)
  157.   {
  158.       keytemp =keyscan();
  159.       switch(keytemp)
  160.       {
  161.           case 1:
  162.               led(1,ON);
  163.                led(2,OFF);
  164.           break;
  165.           case 2:
  166.               led(2,ON);
  167.                led(1,OFF);
  168.           break;
  169.           case 3:
  170.               led(1,ON);
  171.                led(2,ON);
  172.           break;
  173.           default:
  174.             led1off();
  175.             led2off();              
  176.           break;
  177.       }
  178.       if(adcflag)
  179.       {
  180.         adcflag =0;
  181.         memset(buf, 0, 32);  
  182.         memset(readbuf, 0, 32);
  183.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //软件启动ADC转换
  184.         //while(ADC_GetITStatus(ADC1,ADC_IT_EOC) == RESET);
  185.         delay(100000);
  186.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  187.         advalue = ADC_GetConversionValue(ADC1);
  188.         advalue &=0x0FFF;
  189.         GPIO_ResetBits(GPIOC,GPIO_Pin_14);
  190.         voltage =(float)advalue*(5000/4096.0);
  191.         advalue = (uint16_t)voltage;
  192.         temp = advalue/1000;
  193.         printf("ADC Result:%d",temp);
  194.         temp= advalue%1000;
  195.         printf(".%d V\r\n",temp);
  196.       }
  197.         }   
  198. }
复制代码

Keil5代码与Proteus8.9仿真下载:
仿真程序.7z (242.31 KB, 下载次数: 185)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:137736 发表于 2022-9-1 19:40 | 显示全部楼层
很好,终于找到了,谢谢分享。
回复

使用道具 举报

ID:123925 发表于 2022-9-6 23:17 | 显示全部楼层
哪个版本运行
回复

使用道具 举报

ID:262 发表于 2022-9-7 01:44 | 显示全部楼层

我没有作者说的8.9版本 用8.8的效果如下
51hei.gif
回复

使用道具 举报

5#
无效楼层,该帖已经被删除
6#
无效楼层,该帖已经被删除
7#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表