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)
2018-6-27 16:49 上傳
點擊文件名下載附件
|