历史上的今天
返回首页

历史上的今天

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

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

2019-11-16 来源:51hei

//*********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);
    
        }
}

推荐阅读

史海拾趣

CUI Inc.公司的发展小趣事

CUI Inc.一直坚信,与客户的紧密合作是其成功的关键。因此,公司始终致力于与客户发展协作性伙伴关系。通过深入了解客户的需求和反馈,CUI不断优化其产品和服务,以满足客户的期望。这种以客户为中心的经营理念不仅赢得了客户的忠诚和支持,还为CUI带来了持续的业务增长和市场份额的扩大。

这些故事只是CUI Inc.在电子行业中发展起来的一部分可能情况。实际上,CUI的发展可能涉及更多的战略决策、市场变化和技术突破。如果需要更具体、详细的故事,建议查阅相关的行业报告、公司年报或新闻资讯。

AdaptivEnergy公司的发展小趣事

CUI Inc.一直坚信,与客户的紧密合作是其成功的关键。因此,公司始终致力于与客户发展协作性伙伴关系。通过深入了解客户的需求和反馈,CUI不断优化其产品和服务,以满足客户的期望。这种以客户为中心的经营理念不仅赢得了客户的忠诚和支持,还为CUI带来了持续的业务增长和市场份额的扩大。

这些故事只是CUI Inc.在电子行业中发展起来的一部分可能情况。实际上,CUI的发展可能涉及更多的战略决策、市场变化和技术突破。如果需要更具体、详细的故事,建议查阅相关的行业报告、公司年报或新闻资讯。

Grande Electronics Ltd公司的发展小趣事
确保遥控器中的电池电量充足,避免电池电量不足导致的发射问题。
AXSEM公司的发展小趣事
定期清洁遥控器表面的灰尘和污垢,避免按键接触不良等问题。
CAROLCABLE公司的发展小趣事

在激烈的市场竞争中,CAROLCABLE公司深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进先进的生产设备和技术人才,推动技术创新和产业升级。经过多年的努力,CAROLCABLE成功研发出了一系列具有自主知识产权的高性能线缆产品,这些产品在传输速度、稳定性和耐用性等方面均达到了行业领先水平。

随着产品技术的不断升级,CAROLCABLE开始积极拓展国内外市场。公司参加了多个国际电子线缆展会,与全球同行交流学习,寻找合作机会。同时,CAROLCABLE还加强与国内大型电子企业的合作,为其提供定制化的线缆解决方案。这些举措不仅为公司带来了更多的商机,也进一步巩固了CAROLCABLE在电子线缆行业的领先地位。

这两个故事仅是对CAROLCABLE公司发展起来的简要描述,实际上,公司的成长历程中还有许多值得探讨的细节和里程碑事件。如需了解更多关于CAROLCABLE公司的故事,建议查阅相关新闻报道或公司官方资料。

Devar Inc公司的发展小趣事

Devar Inc公司自创立之初,就致力于在增强现实(AR)领域取得突破。经过多年的研发,公司成功推出了世界上首个用于AR的生成式AI神经网络。这项技术允许用户通过简单的文本提示创建3D对象和其他AR资产,极大地简化了AR内容的创作过程。Devar的AR平台结合了神经网络和云解决方案,让用户能够轻松创建并分享AR内容,开启了AR创作的新时代。

问答坊 | AI 解惑

pll

PLL,,,ADF4108…

查看全部问答>

proteus ARES 画PCB视频教程

点击进入下载-proteus_ARES视频教程.rar 附件太大,放在网盘…

查看全部问答>

适合 DIY显存8M的单片机显卡的开源操作系统RT-THREAD

网址:http://www.rt-thread.org 内核及组件 实时线程操作系统(RT-Thread) 是一款主要由中国开源社区主导开发的开源实时操作系统(许可证GPLv2)。实时线程操作系统不仅仅是一个单一的实时操作系统内核,它也是一个完整的应用 系统,包含了 ...…

查看全部问答>

nand Flash 问题

本人初学nand  flash,有几个问题不太明白, 1.nand flash中chip,die, bank ,zone,block,page等概念之间什么关系,以及它们的具体含义! 2.nand flash  spec资料一般那里找。      …

查看全部问答>

fft函数库的问题

对一个正弦波进行FFT,第0组数据应该是直流分量,第1组数据应该是基波吧?直流分量取模应该是有效值的一半,基波取模就是有效值吧?对吗?…

查看全部问答>

XDS510 USB2.0 , CCS2.2连接f2812出错

前一段时间用ccs连接该DSP开发板一直都没有什么问题, 但是最近怎么都连不上同一块开发板了, 报错为Can\'t Initialize target cpu: 1. Target initialization failed< -1294>; 2. Check target power, and JTAG connection 重装了系统, 重新 ...…

查看全部问答>

Google高空热气球项目Project Loon

北京时间6月25日消息,据国外媒体报道,Google官方近日公布了数张Project Loon项目的动态图片。 上周,Google宣布了高空热气球项目Project Loon,该项目旨在为难以构建高速互联网的偏远地区提供价格低廉的网络服务。Project Loon官方网站称,高空热 ...…

查看全部问答>

ADI设计问答:为什么我精心设计的有源滤波器未能达到其技术指标要求?

回答:这是因为许多有源滤波器软件忽略了“实际的”放大器特性。 最近,我度假去红海潜水。临行之前,我把自己的手机和计算机都留在了家里,并把所有的工作都暂时抛在一边。但是,我却犯了一个愚蠢的错误,那就是用带有\"Analog Devices\"字样的帆 ...…

查看全部问答>

[PCB] 关于PCB设计要点分析

[PCB] 关于PCB设计要点分析 当前社会,大量的电子产品广泛的应用在我们的日常工作、生活当中,所以他们的可靠性需要保证,而绝大多数通过印制电路板的电子系统、设备,必须要有合理的设计原理图,正确的印制电路板,才可以从根本上提高他们的可靠 ...…

查看全部问答>

艾曼第四代四代图像处理采集识别检测fpga开发板套件

去年淘宝买来做毕业设计,现闲置无用,九成九新,附送所有资料,以及关于视频图像的研究生论文。有意者QQ:471293219! 淘宝店家资料:http://item.taobao.com/item.htm? ... 4034&_u=u2b1kmce065 …

查看全部问答>