⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adled.c

📁 AVR单片机AD转换及LED显示源程序,已经在仿真文件中成功调试
💻 C
字号:
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdint.h>

static uint16_t g_aAdValue[8];  //A/D转换缓冲区

/*void IoInit(void)
{
  //初始化uart,查询方式读写
  UCSRB=_BV(RXEN)|_BV(TXEN);/*(1<<RXCIE)|(1<<TXCIE)|
  UBRRL=25;  //9600 baud 4MHz:25  
  
  stdout=&mystd;
  stdin=&mystd;
} */
//AD转换8次去掉最高和最低后取平均值返回
uint16_t AdcConvert(void)
{
  uint8_t i;
  uint16_t ret;
  uint8_t max_id,min_id,max_value,min_value;
  
  ADMUX=0Xc0;//内部2.56V参考电压,0通道
  ADCSR=_BV(ADEN);//使能ADC,单次转换模式
  
  //连续转换8次
  for(i=0;i<8;i++)
  {
    ADCSR|=_BV(ADSC);
    _delay_loop_1(60);
    while(ADCSR&_BV(ADSC))
      _delay_loop_1(60);
    ret=ADCL;
    ret|=(uint16_t)(ADCH<<8);
    g_aAdValue[i]=ret;
  }
  ret=0;
  for(i=1;i<8;i++)
    ret+=g_aAdValue[i];
  
  //找到最大和最小值索引  
  ret/=7;
  max_id=min_id=1;
  max_value=min_value=0;
  for(i=1;i<8;i++)
  {
    if(g_aAdValue[i]>ret)
    {
      if(g_aAdValue[i]-ret>max_value)
      {
        max_value=g_aAdValue[i]-ret;
        max_id=i;
      }
    }
    else
    {
      if(ret-g_aAdValue[i]>min_value)
      {
        min_value=ret-g_aAdValue[i];
        min_id=i;
      }
    }
  }
  
  //去掉第一个和最大最小值后的平均值
  ret=0;
  for(i=1;i<8;i++)
  {
    if((i!=min_id)&&(i!=max_id))
      ret+=g_aAdValue[i];     
  }
  if(min_id!=max_id)
    ret/=5;
  else  
    ret/=6;

  ADCSR=0;//关闭ADC
  
  return ret;
}

int main(void)
{
  uint8_t i;
  //IoInit();
  
  while(1)
  {
    scanf("%c",&i);
    if(i=='c')
      printf("%d\n",AdcConvert());
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -