4路ADC+4路数字量。4路模拟信号+4路数字信号
被测电路设计
测量结果
基于STM32F103RCT6的串口数据采集程序
单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "lcd.h"
- #include "adc.h"
- #include "dma.h"
- #define Channel_Number 4 // 通道数的宏定义
- #define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
- #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
- #define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
- #define KEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
-
- #define KEY0_PRES 1
- #define KEY1_PRES 2
- #define KEY2_PRES 3
- #define KEY3_PRES 4
- u16 AD_Digital_Value[Channel_Number]; //AD采样值
- float AD_Analog_Value[Channel_Number]; //AD模拟电压值
- void KEY_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- u8 KEY_Scan1(u8 mode)
- {
- static u8 key_up=1;
- if(mode)key_up=1;
- if(key_up&&(KEY0==0))
- {
- delay_ms(10);
- key_up=0;
- if(KEY0==0)return KEY0_PRES;
- // else if(KEY1==0)return KEY1_PRES;
- // else if(KEY2==0)return KEY2_PRES;
- // else if(KEY3==0)return KEY3_PRES;
- }else if(KEY0==1)key_up=1;
- return 0;
- }
- u8 KEY_Scan2(u8 mode)
- {
- static u8 key_up=1;
- if(mode)key_up=1;
- if(key_up&&(KEY1==0))
- {
- delay_ms(10);
- key_up=0;
- if(KEY1==0)return KEY1_PRES;
- // else if(KEY1==0)return KEY1_PRES;
- // else if(KEY2==0)return KEY2_PRES;
- // else if(KEY3==0)return KEY3_PRES;
- }else if(KEY1==1)key_up=1;
- return 0;
- }
- u8 KEY_Scan3(u8 mode)
- {
- static u8 key_up=1;
- if(mode)key_up=1;
- if(key_up&&(KEY2==0))
- {
- delay_ms(10);
- key_up=0;
- if(KEY2==0)return KEY2_PRES;
- }else if(KEY2==1)key_up=1;
- return 0;
- }
- u8 KEY_Scan4(u8 mode)
- {
- static u8 key_up=1;
- if(mode)key_up=1;
- if(key_up&&(KEY3==0))
- {
- delay_ms(10);
- key_up=0;
- if(KEY3==0)return KEY3_PRES;
- // else if(KEY1==0)return KEY1_PRES;
- // else if(KEY2==0)return KEY2_PRES;
- // else if(KEY3==0)return KEY3_PRES;
- }else if(KEY3==1)key_up=1;
- return 0;
- }
- int main(void)
- {
- u8 i;//定义一个变量
- char a1 = 0;
- char a2 = 0;
- char a3 = 0;
- char a4 = 0;
- KEY_Init();
- SystemInit();//延时初始化
- delay_init(72); //延时初始化
- NVIC_Configuration();//中断初始化
- uart_init(9600);//串口初始化
- LED_Init();//led灯初始化
- LCD_Init();//lcd液晶显示屏初始化
- POINT_COLOR=RED;//设置字体为红色
- POINT_COLOR=BLUE;//设置字体为蓝色
- ADC1_Configuration(); //ADC初始化
- delay_ms(10);//延时
- DMA_Configuration(DMA1_Channel1,(u32)&ADC1->DR,(u32)AD_Digital_Value,Channel_Number );//DMA1通道1;外设为ADC1;
- DMA_Cmd(DMA1_Channel1, ENABLE);//启动DMA通道
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件启动AD转换
- while (1)
- {
- a1 = KEY_Scan1(1);
- a2 = KEY_Scan2(1);
- a3 = KEY_Scan3(1);
- a4 = KEY_Scan4(1);
-
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
- while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);//等待传输完成否则第一位数据容易丢失
- DMA_ClearFlag(DMA1_FLAG_TC1); //清除通道 1 传输完成标志
- for( i=0;i<Channel_Number;i++)
- {
- AD_Analog_Value[i]=(float)AD_Digital_Value[i]*(3.3/4096); //将读取到的值存入数组里面
- }
- printf("\r\n 模拟信号1:%d 模拟电压1:%f \r\n",AD_Digital_Value[0],AD_Analog_Value[0]); //串口打印出来通道1的电压值以及测得的ad转化的值
- printf("\r\n 模拟信号2:%d 模拟电压2:%f \r\n",AD_Digital_Value[1],AD_Analog_Value[1]); //串口打印出来通道2的电压值以及测得的ad转化的值
- printf("\r\n 模拟信号3:%d 模拟电压3:%f \r\n",AD_Digital_Value[2],AD_Analog_Value[2]); //串口打印出来通道3的电压值以及测得的ad转化的值
- printf("\r\n 模拟信号4:%d 模拟电压4:%f \r\n",AD_Digital_Value[3],AD_Analog_Value[3]); //串口打印出来通道4的电压值以及测得的ad转化的值
- if(a1 == 1)
- {
- printf("\r\n 数字信号通道1为1\r\n");
- }
- if(a1 == 0)
- {
- printf("\r\n 数字信号通道1为0\r\n");
- }
- if(a2 == 1)
- {
- printf("\r\n 数字信号通道2为1\r\n");
- }
- if(a2 == 0)
- {
- printf("\r\n 数字信号通道2为0\r\n");
- }
- if(a3 == 1)
- {
- printf("\r\n 数字信号通道3为1\r\n");
- }
- if(a3 == 0)
- {
- printf("\r\n 数字信号通道3为0\r\n");
- }
- if(a4 == 1)
- {
- printf("\r\n 数字信号通道4为1\r\n");
- }
- if(a4 == 0)
- {
- printf("\r\n 数字信号通道4为0\r\n");
- }
- // LED0=!LED0;
- delay_ms(100);
-
- }
- }
复制代码
所有资料51hei提供下载:
4路ADC 4路数字量 (1).7z
(735.19 KB, 下载次数: 226)
|