pengtaoABC 发表于 2013-3-8 15:04:06

谁有PUDN账号,帮忙下个mega88的程序,谢谢!

http://www.pudn.com/downloads40/sourcecode/embed/detail140468.html


http://www.pudn.com/downloads115/sourcecode/embed/detail489192.html

yklstudent 发表于 2013-3-8 15:48:44

自己注册个呗 求人不麻烦吗???

tim 发表于 2013-3-8 15:57:30

汗         

pengtaoABC 发表于 2013-3-8 17:11:35

PUDN注册了还要积分,没有amobbs好,把PUDN的东西放到amobbs上,大家都能共享的,谁能帮个忙,谢谢!

maimaige 发表于 2013-3-8 17:20:36

不是不给你下,那个链接里面,你直接点开那个文件就能够看的

pengtaoABC 发表于 2013-3-8 17:33:29

maimaige 发表于 2013-3-8 17:20 static/image/common/back.gif
不是不给你下,那个链接里面,你直接点开那个文件就能够看的

就只要mega88 ADC的,有mega88 ADC例程发上来也OK,谢谢!   http://www.pudn.com/downloads115/sourcecode/embed/detail489192.html

maimaige 发表于 2013-3-8 17:41:18

下面的是adc.c
    #include "adc.h"   
    //------------------------------------------------------   
    void insert(uchar Hbyte,uchar Lbyte)//入队,添加一个数据   
    {   
      if(ADC_databit==8)    //8 bit   
       {   
      if(adccount<MaxSize)   
         {   
         adccount++;   
         adcdata=Hbyte; //Lbyte 不用   
         rear=(rear+1)%MaxSize;   
         }   
       }   
      if(ADC_databit==10)//10 bit   
       {   
         if(adccount<(MaxSize/2))   
          {   
            adccount++;   
            adcdata=Hbyte;//插入高8位   
            rear=(rear+1)%MaxSize;   
            adcdata=Lbyte;//插入低8位   
            rear=(rear+1)%MaxSize;   
          }   
       }   
    }   
    //-------------------------------------------------------   
    unsigned int delet(void)            //出队,减少一个数据   
    {   
      int idata;   
      idata=0;   
      if(adccount>0)   
       {   
      if(ADC_databit==8)    //8 bit   
         {   
         idata=adcdata;   
         front=(front+1)%MaxSize;   
         adccount--;         
         }      
      if(ADC_databit==10)//10 bit   
         {   
         idata=adcdata;   
         idata=idata<<8;   
         front=(front+1)%MaxSize;   
         idata=idata+adcdata;   
         front=(front+1)%MaxSize;   
         adccount--;   
          }   
       }   
      return idata;   
    }   
    //-------------------------------------------------------   
    void clear(void)            //队列清空   
    {   
   front=0;   
   rear=0;   
   adccount=0;   
    }   
    //=======================================================   
    void start_adc(void)      //启动ADC   
    {   
   clear();   
   ADCSRA = 0x00; //disable adc   
   ACSR= 0x80; //禁止模拟比较器   
   ADCSRA = 0x87; //允许ADC,93.75KHZ (分频因子:128)   
   ADCSRA|=1<<ADSC; //启动ADC   
    }   
    //-------------------------------------------------------   
    void stop_adc(void)         //停止ADC   
    {   
      ADCSRA = 0x00; //disable adc   
    }   
    //-------------------------------------------------------   
    void setup_databit(uchar databit)   //设置ADC转换数据的长度   
    {   
      if(databit==8)   
       {   
      ADC_databit=8;   
      ADMUX|=(1<<ADLAR); //左对齐,将读取ADCH(高8位),ADCL(最低2位)将抛弃   
      }   
      if(databit==10)   
       {   
      ADC_databit=10;   
      ADMUX&=~(1<<ADLAR); //右边对齐,将读取ADCH(最高两位),和读取ADCL(最低8位)   
       }   
    }   
    //-------------------------------------------------------   
    void setup_vref(uchar vref) //设置参考电压源   
    {   
      if(vref==2) //片内2.56V   
      ADMUX=ADMUX | ((1<<REFS1) | (1<<REFS0));   
      if(vref==1) //片内AVCC   
       {   
      ADMUX|=(1<<REFS0);   
      ADMUX&=~(1<<REFS1);   
      }   
      if(vref==0) //AREF   
      ADMUX&=~((1<<REFS1) | (1<<REFS0) );   
      
    }   
    //-------------------------------------------------------   
    void setup_channels(uchar channels)//设置ADC转换通道   
    {   
   ADMUX=ADMUX & 0xf0;   
   ADMUX=ADMUX | channels;   
    }   

maimaige 发表于 2013-3-8 17:41:50

下面的是adc.h
#ifndef __adc_h_included__
#define __adc_h_included__
//========================================================================
#include <avr/io.h>
#define MaxSize 254
#ifndef uchar
#define uchar unsigned char
#endif

uchar adcdata; //环形队列
uchar front,rear;
uchar adccount; //队列的头和尾,队列中有效数据个数
uchar ADC_databit;

extern void insert(uchar Hbyte,uchar Lbyte);//入队,添加一个数据
extern unsigned int delet(void);                        //出队,减少一个数据
extern void clear(void);                        //队列清空

extern void start_adc(void);      //启动ADC
extern void stop_adc(void);                        //停止ADC
extern void setup_databit(uchar databit);//设置ADC转换数据的长度
extern void setup_vref(uchar vref); //设置参考电压源
extern void setup_channels(uchar channels);//设置ADC转换通道

//========================================================================
#endif

maimaige 发表于 2013-3-8 17:42:26

下面的是main.c
    #include <avr/io.h>   
    #include <util/delay.h>   
    #include <avr/signal.h>   
    #include <avr/interrupt.h>   
      
      
    #define fosc 12000000 //晶振12MHZ   
    #define baud 9600    //波特率   
      
      
    unsigned char adcdata_temp;   
    unsigned char currenp;   
    unsigned char flag_start;   
      
      
    /********************* UART 初始化 ******************************/   
    void uart_Init(void)   
    {   
      UCSR0A = 0x00;   
      UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);               //允许发送和接收   
      /* 设置帧格式: 8 个数据位, 1 个停止位 */   
      UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);   
      
      UBRR0L = (fosc/baud/16 - 1) % 256;   
      UBRR0H = (fosc/baud/16 - 1) / 256;   
    }   
      
    /*************** 字符输出函数 ****************************/   
    void putchar(unsigned char c)   
    {      
      while (!(UCSR0A&(1<<UDRE0)));   
      UDR0=c;      
    }   
      
    /**************** 字符输入函数 ***************************/      
    unsigned char getchar(void)   
    {   
      while(!(UCSR0A& (1<<RXC0)));   
      return UDR0;   
    }   
      
    /*************** 字符串输出函数    *************************/   
    int puts(char *s)   
    {   
      while (*s)   
      {   
            putchar(*s);   
            s++;   
      }      
      putchar(0x0a);//回车换行   
      putchar(0x0d);   
      
      return 1;   
    }   
      
    /*************** 串口接收中断 *************************/   
    SIGNAL(SIG_USART_RECV)   
    {   
      if(getchar()=='s')   
      {   
            flag_start = 1;   
            puts("ADC Start!");   
      }   
      
      if(getchar()=='q')   
      {   
            flag_start = 0;   
            puts("ADC Stop...");   
      }   
    }   
      
    /********************* 显示整数 ***********************/   
    void putnum(unsigned charx)   
    {   
      if(x>10)   
            putnum(x/10);       //判断是否大于10,大于10则继续调用函数本身,直到x<10,这里用了递归   
      putchar(x%10 + '0');    //否则小于10,或已执行上一步部,对十求余得个位数,然后通过字符"0"内码加一得各个位数字的内码   
    }   
      
    /********************* 读取AD值 ******************************/   
    unsigned char ReadADC(void)   
    {   
      unsigned int ADC_value;   
      
      ADCSRA |= (1<<ADEN);                //使能ADC   
      ADCSRA |= 0x06;                     //64分频,6M/64=93.75K   
      
      ADMUX = 0x41;                     //AVCC, AREF 引脚外加滤波电容,左对齐,通道1   
      ADMUX |= (1<<ADLAR);            //左对齐,将读取ADCH(高8位),ADCL(最低2位)将抛弃   
      
      ADCSRA |= (1<<ADSC);                //启动单次转化   
      _delay_us(50);   
      while(!(ADCSRA & (1<<ADIF)));       //等待转化结束   
      ADCSRA |= (1<<ADIF);                //清除中断标志   
      ADC_value = ADCH;                   //只读高字节,当作8位AD使用   
      ADCSRA = 0;                         //关闭ADC   
      return(ADC_value);   
    }   
      
    /********************* 主函数 ******************************/   
      
    int main(void)   
    {   
      unsigned char i;   
      unsigned int adc_average, adc_temp;   
      
      DDRC = 0x01;   
      PORTC = 0x01;   
      
      DDRD = 0xFE;   
      PORTD = 0xFE;   
      
      sei();   
      
      uart_Init();   
      
      while(1)   
      {   
            if(flag_start==1)   
            {   
                adc_temp = ReadADC();   
      
                adcdata_temp = adc_temp;   
                currenp++;   
      
                if(currenp>=32)   
                {   
                  currenp = 0;   
                  adc_average = 0;   
                  for(i=0;i<32;i++)   
                  {   
                        adc_average = adc_average + (unsigned int)adcdata_temp;   
                  }   
                  adc_average = adc_average>>5;   
                  putnum(adc_average);   
                  putchar(0x0a);          //回车换行   
                  putchar(0x0d);   
                }   
            }   
      
            _delay_ms(2);   
      
            PORTC ^= 0x01;   
      }   
      
      return 0;   
    }   
      
      

5768340 发表于 2013-3-8 21:31:16

页: [1]
查看完整版本: 谁有PUDN账号,帮忙下个mega88的程序,谢谢!