ADC DMA多通道

补充上一次的主函数

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "adc.h"
#include "ds18b20.h"
#include "lcd.h"
#include "24l01.h"
#include "timer.h"
/*******************************************
*第一步:adc量通道采集数据显示(显示内部温度)
*第二步:ds18b20温度显示
*第三步:接收命令状态(无线模块)
*第四步:发送数据给另外开发板 
*******************************************/
#define SEND_BUF_SIZE 2
u16 ADC1Buff[SEND_BUF_SIZE];

short Get_Temprate(void);
u32 ADC_Convert(u16 *DRValue,u16 i);
void dis_ds18b20(void);
void dis_Adc_value(void);
void u16tou8(u16* u16buff,u8* u8buff,u8 len);
void systeminit()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);  //初始化延时函数
    uart_init(115200);  //初始化串口波特率为115200
    TIM3_Int_Init(199,8299);  //定时20ms 分时系统
    LED_Init();                 //初始化LED 
    LCD_Init();                 //LCD初始化  
    NRF24L01_Init();            //初始化NRF24L01 
    Adc_Init();
    MYDMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)&ADC1->DR,(u32)ADC1Buff,SEND_BUF_SIZE);
}
int main(void)
{
    u8 tmp_buf[32]={0};
     u8 t=0;
    systeminit();

    LCD_Clear(BLACK);  //黑屏

    POINT_COLOR=BLUE;//设置字体为蓝色
    BACK_COLOR=BLACK;//字体背景黑色

    LCD_ShowString(60+11*8,120,200,16,16,"0.000v");
    LCD_ShowString(60+11*8,150,200,16,16,"00.00C");
    LCD_ShowString(30+110+8,180,200,16,16,"00.00C");

    while(DS18B20_Init())   //DS18B20初始化    
    {
        LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
    } 
    while(NRF24L01_Check())
    {
        LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
    }
  while(1)
      {     
         switch(systick_time)
          {
              case 0: dis_ds18b20();  break;  //显示环境温度信息
              case 1: dis_Adc_value();  break; //显示采集电压和内部温度信息
              case 2:                          //接收状态
              {
                  NRF24L01_RX_Mode();
                if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
                  {
                      t++;
                      if(tmp_buf[0]=='f')   //验证接收的命令
                      {
                        tmp_buf[1]=0;//加入字符串结束符
                        LCD_ShowString(120+t*16,220,lcddev.width-1,32,16,tmp_buf);
                         delay_ms(100);   //延时一段时间,等待对方反应
                        NRF24L01_TX_Mode();
                        u16tou8(ADC1Buff,tmp_buf,2);  //将采集的电压信息转换成u8类型
                        NRF24L01_TxPacket(tmp_buf) ; //将采集的信息发送给另外一个单片机

                      }
                  }
              }
              break;
          }

      }
}

//采集电压计算函数
u32 ADC_Convert(u16 *DRValue,u16 i)
{
     u32  ResultVolt = 0;
     for(;i<SEND_BUF_SIZE;i=i+2)
    {
        ResultVolt +=(DRValue[i]*3300)/4095;       //计算得到1000倍的电压值
    }
    ResultVolt/=(SEND_BUF_SIZE/2);       //求均值
    printf("%d\r\n",ResultVolt);
    return ResultVolt;                         //比如: 实际电压为1.25V, 返回的数据为1250
}

//内部温度转换函数
short Get_Temprate(void)
{
    u16 i=0;
    u32 adcx=0;
    short result;
    double temperate;
    for(i=1;i<SEND_BUF_SIZE;i=i+2)
    {               
      adcx+=(u32)ADC1Buff[1];   //读取通道16内部温度传感器通道,10次取平均
    }
    adcx/=(SEND_BUF_SIZE/2);
    temperate=(float)adcx*(3.3/4096);       //电压值
    temperate=(temperate-0.76)/0.0025 + 25; //转换为温度值 
    result=temperate*=100;                  //扩大100倍.
    return result;
}
void dis_ds18b20()
{       
    short temperature; 
    u8 t;
    u8 x;
    x=50;
    for(t=12;t<18;t++)//显示汉字‘环境温度是:’
    {
        Test_Show_CH_Font16(x ,180,t,BLUE);
        x+=16;
    }
     temperature=DS18B20_Get_Temp();        
     if(temperature<0)
     {
        LCD_ShowChar(30+110,180,'-',16,0);          //显示负号
        temperature=-temperature;                   //转为正数
     }else LCD_ShowChar(30+110,180,' ',16,0);           //去掉负号
    LCD_ShowNum(30+110+8,180,temperature/10,2,16);  //显示正数部分        
    LCD_ShowNum(30+110+32,180,temperature%10,1,16); //显示小数部分 

}
void dis_Adc_value()
{
    u8 t;
    u8 x;
    x=50;
    for(t=0;t<6;t++)//显示汉字‘内部电压是:’
    {
        Test_Show_CH_Font16(x ,120,t,BLUE);
        x+=16;
    }
    x=50;
    for(t=6;t<12;t++)//显示汉字‘内部温度是:’
    {
        Test_Show_CH_Font16(x ,150,t,BLUE);
        x+=16;
    }
     LCD_ShowxNum(60+11*8,120,ADC_Convert(ADC1Buff,0)/1000,1,16,0);     //显示电压整数部分
     LCD_ShowxNum(60+13*8,120,ADC_Convert(ADC1Buff,0)%1000,3,16,0);     //显示电压小数部分 
     LCD_ShowxNum(60+11*8,150,Get_Temprate()/100,2,16,0);             //显示温度整数部分
     LCD_ShowxNum(60+14*8,150,Get_Temprate()%100,2,16,0);             //显示温度小数部分
}
//数据类型转换函数
void u16tou8(u16* u16buff,u8* u8buff,u8 len)
{
    u8 i;
    for(i=0;i<len;i++)
    {
        u8buff[i*2]=(u8)u16buff[i]; //低位
        u8buff[i*2+1]=(u8)u16buff[i]>>8; //高位

    }
}


从机函数

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"   
#include "24l01.h"   


 int main(void)
 {   
    u8 key;
//  u16 t=0;             
    u8 tmp_buf[33]={0}; 
    u8 RX_buf[33]={0};  
    delay_init();            //延时函数初始化    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);      //串口初始化为115200
    LED_Init();                 //初始化与LED连接的硬件接口
    KEY_Init();                 //初始化按键
    LCD_Init();                 //初始化LCD  
    NRF24L01_Init();            //初始化NRF24L01 
    POINT_COLOR=RED;            //设置字体为红色 
    while(NRF24L01_Check())
    {
        LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
        delay_ms(200);
        LCD_Fill(30,130,239,130+16,WHITE);
        delay_ms(200);
    }
        tmp_buf[0]='J'; 
    while(1)
    {   

        key=KEY_Scan(0);
        if(key==KEY1_PRES)  //发送
        {
            NRF24L01_TX_Mode();                          
            if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
            {
                LCD_ShowString(30,120,239,32,16,"Sended DATA:");    
                LCD_ShowString(50,150,lcddev.width-1,32,16,tmp_buf); 

                LED0=!LED0;
               NRF24L01_RX_Mode();        
              while(NRF24L01_RxPacket(RX_buf)!=0);//一旦接收到信息,则显示出来.
                LCD_ShowString(30,170,200,16,16,"Received DATA:");
                RX_buf[5]=0;//加入字符串结束符
                LCD_ShowString(50,190,lcddev.width-1,32,16,RX_buf);  
                LED1=!LED1;

            }


        }
  }
}


猜你喜欢

转载自blog.csdn.net/shenlong1356/article/details/80961973
今日推荐