找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10144|回复: 15
打印 上一主题 下一主题
收起左侧

Proteus仿真stm32读取ADC源程序

  [复制链接]
跳转到指定楼层
楼主
stm32课程的一个项目,用protues仿真stm32读取ADC,做完之后把这些分享下来。


单片机源程序如下:
  1. //#include "main.h"
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_it.h"
  4. #include <stdio.h>
  5. #define ADC1_DR_Address    ((uint32_t)0x40012400+0x4C)


  6. u8 seg_table[]={
  7. 0xc0,0xf9,0xa4,0xb0,
  8. 0x99,0x92,0x82,0xf8,
  9. 0x80,0x90,0x88,0x83,
  10. 0x39,0x5e,0x79,0x71};  //共阴极表

  11. uint16_t ADCConvertedValue;
  12. uint32_t DMA_ADC_OK;


  13. void NVIC_Config(void);
  14. void ADC_Config(void);
  15. void delay(void);
  16. void xdelay(void);
  17. void GPIO_Config(void);
  18. u16  Get_Adc(u8 ch);
  19. //u16 Get_Adc_Average(u8 ch,u8 times);



  20. int main(void)
  21. {
  22.    float temp=0;
  23. DMA_ADC_OK = 0;
  24. NVIC_Config();
  25. SysTick_Config(72000);
  26. ADC_Config();
  27. GPIO_Config();
  28.        
  29.           
  30.        
  31. while(1)
  32. {
  33.         int p,q;
  34.        
  35. //        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  36. //                GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  37. //            delay();       
  38. //                GPIO_SetBits(GPIOA,GPIO_Pin_8);
  39. //                GPIO_SetBits(GPIOD,GPIO_Pin_2);
  40. //            delay();
  41.        
  42.         if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)!= RESET)
  43.   {
  44.                 DMA_ADC_OK = 1;
  45.     ADC_ClearFlag(ADC1, ADC_FLAG_EOC);   
  46.   }
  47.        
  48.         if(DMA_ADC_OK)
  49. {       
  50.         ADCConvertedValue=ADC_GetConversionValue(ADC1);
  51.         //ADCConvertedValue=Get_Adc(ADC_Channel_1);
  52.        
  53.   temp = (float)ADCConvertedValue* (3.3/4096);
  54.        
  55.        
  56.         if (temp>=1)
  57.         {
  58.                 temp=temp+1;
  59.                 //GPIO_WriteBit(GPIOA,GPIO_Pin_3,
  60.                //         (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3))));
  61.                
  62.                
  63.                 p=(int)temp;
  64.                 temp=(temp-p)*10;
  65.           q=(int)temp;
  66.        
  67.            GPIOB->ODR=0xfa;   // 高位
  68.            GPIOC->ODR=seg_table[p];
  69.            xdelay();
  70.        
  71.            GPIOB->ODR=0xfd;   // 低位
  72.            GPIOC->ODR=seg_table[q];
  73.            xdelay();
  74.         }
  75.         else {
  76.            temp=temp*10;
  77.            q=(int)temp;
  78.                
  79.                  GPIOB->ODR=0xfa;   // 高位
  80.            GPIOC->ODR=0xc0;
  81.                  xdelay();
  82.                
  83.                  GPIOB->ODR=0xfd;   // 低位
  84.            GPIOC->ODR=seg_table[q+1];
  85.                  xdelay();
  86.                
  87.                
  88.        
  89.        
  90.         }
  91.        
  92.        
  93.        
  94.        

  95.    
  96. }
  97. }       
  98. }
  99. /*NVIC??*/        
  100. void NVIC_Config(void)
  101. {
  102. NVIC_InitTypeDef NVIC_InitStructure;
  103. /* DMA??NVIC?? */
  104. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  105. NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  106. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  107. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  108. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  109. NVIC_Init(&NVIC_InitStructure);
  110. }

  111. void ADC_Config(void)
  112. {
  113. GPIO_InitTypeDef GPIO_InitStructure;
  114. ADC_InitTypeDef ADC_InitStructure;
  115. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);//PC4
  116.        
  117.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  118.        
  119. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  120. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  121. GPIO_Init(GPIOA, &GPIO_InitStructure);
  122.        
  123.         ADC_DeInit(ADC1);
  124.        
  125. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  126. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  127. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  128. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  129. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  130. ADC_InitStructure.ADC_NbrOfChannel = 1;
  131. ADC_Init(ADC1, &ADC_InitStructure);
  132.        
  133.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
  134.        
  135.        
  136.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  137.         ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
  138.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);       
  139. }

  140. void delay(void)       
  141. {
  142.         int i=0xffa;
  143.         while(i--);
  144. }

  145. void xdelay(void)       
  146. {
  147.         int i=0xfff;
  148.         while(i--);
  149. }
  150. void GPIO_Config(void)
  151. {
  152.         GPIO_InitTypeDef GPIO_InitStructure;
  153.                 /* GPIOD Periph clock enable */
  154.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
  155.             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//PC4
  156.        
  157.        
  158.       /* Configure PD2 in output pushpull mode */
  159. //      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  160. //      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  161. //      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  162. //      GPIO_Init(GPIOA, &GPIO_InitStructure);//PD2????,?????
  163.        
  164.             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  165.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  166.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  167.       GPIO_Init(GPIOA, &GPIO_InitStructure);//PD2????,?????
  168.           
  169.        
  170.       /* Configure PD2 in output pushpull mode */
  171.       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  172.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  173.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  174.       GPIO_Init(GPIOC, &GPIO_InitStructure);//PD2????,?????
  175. //   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//PC4
  176. //      /* Configure PD2 in output pushpull mode */
  177.       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  178.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  179.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  180.       GPIO_Init(GPIOB, &GPIO_InitStructure);//PD2????,?????
  181. //       
  182.           
  183.        
  184.        
  185. //                /* Configure PA8 in output pushpull mode */
  186. //      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  187. //      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  188. //      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  189. //      GPIO_Init(GPIOC, &GPIO_InitStructure);//PD2????,?????
  190. }       

  191. void xianshi(float x)
  192. {        GPIO_InitTypeDef GPIO_InitStructure; //定义一个管脚初始化的结构体
  193.          //开启PA口时钟
  194.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  195.          //配置PA所有的模式
  196.          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
  197.          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  198.          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  199.          GPIO_Init(GPIOA,&GPIO_InitStructure);
  200.        
  201.        
  202.        


  203. }



  204. void ADC1_2_IRQHandler(void)
  205. {
  206.   if(ADC_GetITStatus(ADC1, ADC_IT_EOC)!= RESET)
  207.   {
  208.                 DMA_ADC_OK=1;
  209.     ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);   
  210.   }  
  211. }
复制代码

所有资料51hei提供下载:
keil.zip (325.06 KB, 下载次数: 345)
proteus.zip (188.01 KB, 下载次数: 343)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:547555 发表于 2019-5-26 15:00 | 只看该作者
学习
回复

使用道具 举报

板凳
ID:731886 发表于 2020-6-16 13:09 | 只看该作者
有没有HEX文件啊
回复

使用道具 举报

地板
ID:781210 发表于 2020-6-16 21:06 | 只看该作者
谢谢楼主,雪中送碳啊,楼主天使
回复

使用道具 举报

5#
ID:781382 发表于 2020-6-16 21:07 | 只看该作者
感谢楼主大恩大德!
回复

使用道具 举报

6#
ID:137883 发表于 2020-6-16 22:00 | 只看该作者
Proteus下下来打不开
回复

使用道具 举报

7#
ID:97832 发表于 2020-6-18 15:52 | 只看该作者

谢谢楼主,雪中送碳啊,楼主天使
回复

使用道具 举报

8#
ID:826991 发表于 2020-10-15 20:26 | 只看该作者
这个dma只是个变量?
回复

使用道具 举报

9#
ID:826991 发表于 2020-10-15 20:31 | 只看该作者
这个好像没有dma啊
回复

使用道具 举报

10#
ID:202142 发表于 2020-10-16 09:51 | 只看该作者
这个不错的,可惜Proteus不支持STM8S仿真。
回复

使用道具 举报

11#
ID:583059 发表于 2021-6-16 15:41 | 只看该作者
为啥我开adc就卡死
回复

使用道具 举报

12#
ID:369194 发表于 2021-9-5 11:18 | 只看该作者
实测有效,但是ad采样精度有点问题
回复

使用道具 举报

13#
ID:946535 发表于 2021-9-14 09:37 | 只看该作者
感谢楼主分享,正需要一个ADC采集的
回复

使用道具 举报

14#
ID:1003077 发表于 2022-2-18 00:00 | 只看该作者
本帖最后由 Hjc12345678 于 2022-2-18 00:14 编辑

没有用到DMA,程序问题较多,如xiangshi()没用到,p,q取用也有问题,不用DMA的话仿真数码管显示会闪烁,原因是转换需要时间太长导致。
回复

使用道具 举报

15#
ID:102665 发表于 2022-7-1 17:43 | 只看该作者
到底有用木有用,有仿真验证过的吗?
回复

使用道具 举报

16#
ID:1011182 发表于 2024-2-12 21:21 | 只看该作者
我用了移植的时候一切正常,但是我发现ADC只在开机时测量一次
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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