历史上的今天

今天是:2024年11月16日(星期六)

2019年11月16日 | AVR单片机8路AD如何采样

发布者:pengbinyyy 来源: 51hei关键字:AVR单片机  8路AD  采样 手机看文章 扫描二维码
随时随地手机看文章

//*********ATmega128,8channel ADC sampling + LED display + USART*******
#include
#include

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define FOSC   1843200
#define baud   9600
#define MyUBBR   (uint)((ulong)FOSC/(16*(ulong)baud)-1)
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[4]={0};
uchar adcon0_table[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
uchar num1,num2;
uint data_buf[10]={0};

void delay_ms(uint x);                       
void PORT_init();
void USART_Init(uint ubbr); 
void USART_Transmit(uchar data);
uchar USART_Receive(void);
void NumericalLED_display(void);
uint data_average(uint buffer[30]);
void get_AD(void);

void main()
{
  uchar i;
  PORT_init();
  USART_Init(MyUBBR);

    while(1)
    {
          NumericalLED_display();
      get_AD();
      if(USART_Receive()==0x01)
      {
        num1=PORTD;
        num2=PORTB&0X03;
        if((num1==0xff)&&(num2==0x03))
        {
           USART_Transmit(num1);
                   USART_Transmit(num2);
                   
           for(i=0;i<8;i++)
            {   
                 num1=data_buf[i]/255;
                 num2=data_buf[i]%255;
                                 USART_Transmit(num1);
                         USART_Transmit(num2);
                 delay_ms(1000);
            }
         } 
      }
    }
}

void delay_ms(uint x)
{
  uint y,z;
  for(y=x;y>0;y--)
   for(z=110;z>0;z--);
}

void PORT_init()
{
    DDRA=0x00;
    DDRB=0xFF;
        PORTB=0xFF;
        DDRC=0xFF;
        PORTC=0xFF;
    PORTD=0xFF;             
    DDRD=0xFF;

}
void USART_Init(uint ubbr)
{
   
   UBRR1H= (uchar)(ubbr>>8);
   UBRR1L= (uchar)ubbr;
   UCSR1A= 0x00;
   UCSR1B|=(1<   UCSR1C=0x06;//(0<
}

void USART_Transmit(uchar data)
{
  while(!(UCSR1A&(UDRE1)));
  UDR1=data;

}

uchar USART_Receive(void)
{
   while(!(UCSR1A&(1<   return UDR1;
}

void NumericalLED_display(void)
{
   static uchar i,temp=0x01;//temp=0x7f;
   for (i=0; i<4; i++)
   {
     PORTC=table[Data[i]];
         temp=1<         PORTB&=~temp;
         delay_ms(10);
          
     //PORTC=table[Data[i]];
     //PORTB=temp;
     //temp=(temp>>1)|0x80;
     //__delay_cycles(100);
  
   }
}
           
uint data_average(uint buffer[30])
{
  uchar i,j;
  
  uint temp;
  float temp1;
  for(i=1; i<30; i++)    
  for(j=29; j>=i; --j)
  {
   if(buffer[j-1] > buffer[j])
   {
    temp = buffer[j-1];
    buffer[j-1] = buffer[j];
    buffer[j] = temp;
   }
  }

temp1 = 0;
for(i=5; i<25; i++)
{
  temp1 += buffer[i];
}   
temp = (uint)(((float)temp1) / 20 + 0.5);

return(temp);
}


void get_AD(void)
{
  uchar i,j;
  uint adcbuf[30]={0};  
   static uchar ADC_channel=0;
   //ADMUX=0x40;                              
   ADCSRA=0x83;                             
   SFIOR=0x00;  
   delay_ms(1);
   for (i=0; i<8; i++)
    {
      ADMUX=adcon0_table[ADC_channel];
      for(j=0; j<30; j++)
       {
          asm("NOP");           
          asm("NOP");
          ADCSRA|=BIT(6); 
          while(((1<         // adcbuf[j]=(ADCH*256)+ADCL;   
                 adcbuf[j]=(ADCH<<8)|ADCL;
       }
      data_buf[i]=data_average(adcbuf); 
          Data[3]=data_buf[i]/1000;
          Data[2]=data_buf[i]%1000/100;
          Data[1]=data_buf[i]%100/10;
          Data[0]=data_buf[i]%10;
      if (++ADC_channel>8)ADC_channel=0;
      delay_ms(1);
    }
}

//PIC Multi_CD channel source code,

//******Multi_ADChannel converter**********//
#include    

__PROG_CONFIG(1,0xc200);
__PROG_CONFIG(2,0x0a16);
__PROG_CONFIG(3,0x8100);
__PROG_CONFIG(4,0x0081);
__PROG_CONFIG(5,0xc00f);
__PROG_CONFIG(6,0xe00f);
__PROG_CONFIG(7,0x400f);

#define uchar unsigned char
#define uint  unsigned int
uchar temp;
void multi_convertor(void);
void port_check(void);

uint ADbuf[10]; 
void delay_ms(uint t)
{
   uint m,n;
   for (m=0;m     for (n=0; n<1140;n++);
}


void GPIO_Init(void)
{
  TRISA=0xff;
  TRISB=0xff;
  TRISC=0xff;
  TRISD=0xff;
  TRISE=0xff;
  PSPMODE=0;
  PSPIE=0;
  PSPIP=0;
                
  TRISBbits.RB2 =1;                  //set direction of RB2 to be An input;
  TRISBbits.RB3 =1;                  //set direction of RB3 to be An input;

}

void ADC_Init(void)
{
  ADCON1 = 0x05;                  //seting AN0~AN9 to be analog input;
  ADCON2 = 0xBE;                  //20TAD,FOSC/64 and right justified;              
}

void timer0_init(void)
{
  INTCON =0xE0;//GIE,PEIE,TMR0IE to set;
  T0CON = 0x1F;// timer0 to be 16-bit;
  TMR0H = (65536-1000)/256;
  TMR0L = (65536-1000)%256; 
  T0CON |=0x80;
  TMR0ON=1;
}


void EUART_init(void)
{
  TRISC7=1;
  TRISC6=1;
  SPBRG=0x40;
  TXSTA=0x24;
  RCSTA=0x90;
  RCIE=0;
  TXIE=0;
  PEIE=1;
  GIE=1;

}

void transmit_udata(uchar udata)
{
   TXREG=udata;
   while(!TRMT);
}

uchar receive_udata(void)
{
   uchar temp;
   if (RCIF==1)
   {
     temp=RCREG;
   }
   return temp;

}
uint data_average(uint buffer[30])
{
  uchar i,j;
  uint temp;
  float temp1;
  for(i=1; i<30; i++)    
  for(j=29; j>=i; --j)
  {
   if(buffer[j-1] > buffer[j])
   {
    temp = buffer[j-1];
    buffer[j-1] = buffer[j];
    buffer[j] = temp;
   }
  }

temp1 = 0;
for(i=5; i<25; i++)
{
  temp1 += buffer[i];
}   
temp = (uint)(((float)temp1) / 20 + 0.5);

return(temp);
}


void main(void)

  EUART_init();
  GPIO_Init();
  ADC_Init();
  timer0_init();  
  while(1)
    {
       temp=receive_udata();
      if (temp==0x01)
       {
         temp=0; 
         port_check();
         multi_convertor();
        
       }
    }
}
void port_check(void)
{
   uchar num1, num2;

   num1=PORTD;
   num2=PORTB&0X03;
   transmit_udata(num2);
   transmit_udata(num1);
}

void multi_convertor(void)
{
   uchar data1,data2,i;
   static uchar ADC_channel=0;
   uint adc[30]={0};
     // ADC_channel++;
      for (ADC_channel=0; ADC_channel<10; ADC_channel++)
        {
        
               switch(ADC_channel) 
                {
                        case 0: ADCON0=0x01;break;//AN0 channel;
                        case 1: ADCON0=0x05;break;//AN1 channel;
                        case 2: ADCON0=0x09;break;//AN2 channel;
                        case 3: ADCON0=0x0D;break;//AN3 channel;
                        case 4: ADCON0=0x11;break;//AN4 channel;
                        case 5: ADCON0=0x15;break;//AN5 channel;
                        case 6: ADCON0=0x19;break;//AN6 channel;
                        case 7: ADCON0=0x1D;break;//AN7 channel;
                        case 8: ADCON0=0x21;break;//AN8 channel;
                        case 9: ADCON0=0x25;break;//AN9 channel;
                        default:break;
                }
     
                     for(i=0;i<30;i++)  
                       {    
                            ADCON0 |=0x01;
                            asm("NOP");           
                            asm("NOP");           
                            GODONE=1;               
                            while(GODONE);
                            adc[i]=(ADRESH*256)+ADRESL;      
                            
                        }
                        ADbuf[ADC_channel]=data_average(adc);
                        data1=ADbuf[ADC_channel]/255;
                        data2=ADbuf[ADC_channel]%255;
                        transmit_udata(data1);
                        transmit_udata(data2);
    
        }
}

[1] [1]
关键字:AVR单片机  8路AD  采样 引用地址:AVR单片机8路AD如何采样

上一篇:DHT11温湿度传感器的AVR单片机例程
下一篇:avr单片机双通信C程序

推荐阅读

      新浪科技讯 北京时间11月16日早间消息,英伟达今日公布了该公司的2019财年第三季度财报。报告显示,英伟达第三季度营收为31.81亿美元,与上年同期的26.36亿美元相比增长21%;净利润为12.30亿美元,与上年同期的8.38亿美元相比增长47%。  英伟达第三季度业绩不及华尔街分析师此前预期,2019财年第四季度业绩展望也未达预期,从而导致其盘后...
现在市场上,功率分析仪种类繁多,由于功率分析仪侧重方面的不同,起功能上也有着相对的出入,性能方面也是相差甚远,关于功率分析仪的选型,是一个值得讨论的问题,下面则对功率分析仪的选型进行一个分析。关于功率分析仪,我们都知道它一般情况下是以数字采样技术为核心,以高性能的微处理器、CPLD等为基本器件。在中国大陆销售的进口功率分析仪厂家主要...
在过去的数年里,借助移动互联网技术的快速渗透,以及汽车行业对于车联网的日趋重视及努力,车载交互系统进入了高速发展时期。锐成芯微携手旺玖科技,成功推出面向车载系统的全新跨平台链接USB Auto Hub桥接芯片,并即将进入量产。2020年11月,锐成芯微在中国成都宣布,携手旺玖科技成功推出面向车载信息娱乐系统的全新跨平台链接USB Auto Hub桥接芯片...
前不久,工科专业的在校生Ken Pillonel通过“魔改”,将一部iPhone X从Lightning闪电接口换成了USB-C接口。因为内部集成有转接器,所以通过USB-C不仅可以充电,还能传输数据。整个项目已经开源,且Pillonel还在个人频道详细分享了过程,包括对苹果C94接口的逆向工程等,说实话,相当复杂。这台可以称得上是全球第一款USB-C接口的iPhone X,前几天被放上e...

史海拾趣

问答坊 | AI 解惑

人生就是不停地与BUG作斗争

闷呀,找了20分钟的错,居然是对编译环境的不熟造成的。原来我定义的 ORG 000H JMP MAIN ORG 00CH JMP TIMER0 ORG 008H JMP RC00 结果是怎么搞都通不过。。最后把ORG的地址按顺序来排列居然通过了。。。。哎, ...…

查看全部问答∨

2010.1期的<<无线电>>有魏坤的新文章

RT, 有兴趣的,可以买来看下啊,呵呵…

查看全部问答∨

PB在编译时会编译PUBLIC下的源代码吗?

PB在编译NK的时候会编译PUBLIC下的内容吗,如果不编译,那些自带的DLL之类的东西又是什么地方来的呢 谢谢…

查看全部问答∨

1602不显示是什么原因?

小弟是菜鸟初学单片机,写了个1602的程序可是不能用,于是借用别人写好的程序(那个人的程序可以用),可是载到我的单片机里面就不能用,1602就第一行全部显示方块,第二行空白,这是什么原因,哪位高手可以点拨点拨小弟,小弟感激不尽。…

查看全部问答∨

问个和字库有关的问题

我手头上有16*16的字库,就是HZK16。 但是我应该怎么用C语言写程序把他转成我需要的数组呢??? 给个思路。。。。。。谢谢 …

查看全部问答∨

字符串行拆分问题

我有一个字符串,是这样的。每行结束符是回车,16进制是OD OA,我想把以下的字符串按行 拆分,并且是在WINCE下执行,请教个位高手,有什么办法。C++环境。 123,adc,d3dse,gd,cdewd,wqeds 23432,wddw3,34dsc,322,ssdre4,wqde3 fkdie,al ...…

查看全部问答∨

STM32与ARM的关系?

                                 STM32与平常说的ARM到底是怎么样的关系?求解释…

查看全部问答∨

我对FPGA设计的一些想法

  去年开始接触EDA至今,我依然感觉自己还在FPGA的门外。我自己对EDA很感兴趣,学习之路不易。经过一段时间的学习,我发现EDA的关键不是用HDL设计而是用HDL描述。   HDL的全称是硬件描述(describe)语言而不是硬件设计(design)语言! ...…

查看全部问答∨

南华大学黄智伟系列——选择低功耗的电源电路结构可以提高效率

本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 在一个有严格功耗要求的系统中,供电电源的设计不能够采用简单的方式来完成,必须对所采用电源电路结构仔细考虑[3~6]。     线性稳压电路   线性稳压电路(包含LDO)其特点是电 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved