找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教关于对单片机pin脚二进制赋值的问题

[复制链接]
跳转到指定楼层
楼主
50黑币
首先感谢各位大佬进来指导
本人愚钝想使用STM32F10x单片机通过按键控制ADG732并完成对应开关选择,将采集到的ADC通过串口发送到PC。
但是在操作过程中,A0-A4口一直处于低电平,不管怎么按键都没有作用,想请问大家是因为我的宏定义冲突吗亦或者其他问题,该如何修改?

另外编译是没有错误的,电路图如图所示
为了方便大家编译,将部分void添加主程序


单片机源程序如下:
  1. #include <stm32f10x.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <delay.h>
  5. #include <ADC.h>
  6. #include <Usart.h>
  7. #include <delay.h>

  8. void USART_Config(void);
  9. void GPIO_Config(void);
  10. void ADC_Config(void);
  11. void Switch_Pin(uint8_t pin_number, uint8_t state);
  12. uint16_t Read_Voltage(void);
  13. void Send_Voltage(uint16_t voltage);

  14. #define A0 PBout(3)
  15. #define A1 PBout(4)
  16. #define A2 PBout(5)
  17. #define A3 PBout(6)
  18. #define A4 PBout(7)

  19. #define ADC PAout(0)        

  20. uint8_t word = 0;

  21. int main(void)
  22. {
  23.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOA和GPIOB时钟
  24.     GPIO_InitTypeDef GPIO_InitStructure;        
  25.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  29.         
  30.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        
  31.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  32.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  33.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  35.     delay_init();

  36.     USART_Config();
  37.     ADC_Config();
  38.     uint16_t voltage;

  39.   while(1)
  40. {
  41.     if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == Bit_RESET)
  42.     {
  43.         // 将二进制数加1,如果达到11111则重置为00000
  44.         
  45.         if (word >= 32)
  46.                                         {
  47.             word = 0;
  48.                                         }
  49.         A4 = (word >> 4) & 0x01;
  50.         A3 = (word >> 3) & 0x01;
  51.         A2 = (word >> 2) & 0x01;
  52.         A1 = (word >> 1) & 0x01;
  53.         A0 = (word >> 0) & 0x01;
  54.         delay_ms(10);
  55.                                 word++;
  56.     }

  57.     voltage = Read_Voltage();
  58.     Send_Voltage(voltage);
  59. }
  60. }

  61. //初始化串口通信
  62. void USART_Config(void)
  63. {
  64.     // 定义串口外设结构体变量
  65.     USART_InitTypeDef USART_InitStructure;
  66.     // 定义GPIO外设结构体变量
  67.     GPIO_InitTypeDef GPIO_InitStructure;
  68.    
  69.     // 使能USART外设的时钟
  70.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  71.     // 使能GPIO外设的时钟
  72.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  73.    
  74.     // 配置GPIO外设(TX)
  75.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  76.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  77.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  78.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  79.    
  80.     // 配置GPIO外设(RX)
  81.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  82.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  83.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  84.    
  85.     // 配置USART外设
  86.     USART_InitStructure.USART_BaudRate = 115200;
  87.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  88.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  89.     USART_InitStructure.USART_Parity = USART_Parity_No;
  90.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  91.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  92.     USART_Init(USART1, &USART_InitStructure);
  93.    
  94.     // 使能USART外设
  95.     USART_Cmd(USART1, ENABLE);
  96. }


  97. void GPIO_Config(void)
  98. {
  99.     //使用GPIOB的引脚作为ADG732的控制端
  100.                 GPIO_InitTypeDef GPIO_InitStructure;
  101.         
  102.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
  103.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  104.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  105.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  106.         
  107.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  108.                 GPIO_ResetBits(GPIOB,GPIO_Pin_3);                                        //PB.10 输出低
  109.                 GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  110.                 GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  111.                 GPIO_ResetBits(GPIOB,GPIO_Pin_6);                                        //PB.10 输出低
  112.                 GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  113.                 delay_init();

  114. }


  115. void ADC_Config(void)
  116. {
  117.     ADC_InitTypeDef ADC_InitStructure;
  118.     GPIO_InitTypeDef GPIO_InitStructure;
  119.    
  120.     //使能ADC和GPIO相关的时钟
  121.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  122.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  123.    
  124.     //配置ADC的工作模式
  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的通道
  134.     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
  135.    
  136.     //使能ADC
  137.     ADC_Cmd(ADC1, ENABLE);
  138.    
  139.     //配置ADC的输入GPIO
  140.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  141.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  142.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  143.    
  144.     //复位ADC校准寄存器
  145.     ADC_ResetCalibration(ADC1);
  146.    
  147.     //等待校准寄存器复位完成
  148.     while(ADC_GetResetCalibrationStatus(ADC1));
  149.    
  150.     //开始校准ADC
  151.     ADC_StartCalibration(ADC1);
  152.    
  153.     //等待校准完
  154. }

  155. void Switch_Pin(uint8_t pin_number, uint8_t state)
  156. {
  157.     //首先,需要对选择的引脚进行初始化,以便进行输出
  158.     GPIO_InitTypeDef GPIO_InitStructure;
  159.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  160.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  161.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  162.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  163.     //将引脚状态设置为指定的状态(0或1)
  164.     if(state == 0)
  165.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);
  166.     else
  167.         GPIO_SetBits(GPIOA, GPIO_Pin_2);
  168. }



  169. // 读取电压值函数
  170. uint16_t Read_Voltage(void)
  171. {
  172. // 启动ADC转换
  173. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  174.         // 等待转换完成
  175. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

  176. // 读取转换结果
  177. uint16_t adc_value = ADC_GetConversionValue(ADC1);

  178. // 计算电压值
  179. float voltage = (float)adc_value / 4096 * 3.3;
  180. uint16_t voltage_mv = (uint16_t)(voltage * 1000);

  181. return voltage_mv;
  182. }


  183. void Send_Voltage(uint16_t voltage)
  184. {
  185.     char buffer[16];
  186.     sprintf(buffer, "%d\r\n", voltage);
  187.     for(int i = 0; buffer[i] != '\0'; i++)
  188.     {
  189.         USART_SendData(USART1, buffer[i]);
  190.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  191.     }
  192. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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