搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2013-3-8 15:04:06 | 显示全部楼层 |阅读模式
http://www.pudn.com/downloads40/ ... d/detail140468.html


http://www.pudn.com/downloads115 ... d/detail489192.html

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-3-8 15:48:44 | 显示全部楼层
自己注册个呗 求人不麻烦吗???

出0入93汤圆

发表于 2013-3-8 15:57:30 | 显示全部楼层
汗         

出0入0汤圆

 楼主| 发表于 2013-3-8 17:11:35 | 显示全部楼层
PUDN注册了还要积分,没有amobbs好,把PUDN的东西放到amobbs上,大家都能共享的,谁能帮个忙,谢谢!

出0入0汤圆

发表于 2013-3-8 17:20:36 | 显示全部楼层
不是不给你下,那个链接里面,你直接点开那个文件就能够看的

出0入0汤圆

 楼主| 发表于 2013-3-8 17:33:29 | 显示全部楼层
maimaige 发表于 2013-3-8 17:20
不是不给你下,那个链接里面,你直接点开那个文件就能够看的

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

出0入0汤圆

发表于 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[rear]=Hbyte; //Lbyte 不用   
           rear=(rear+1)%MaxSize;   
         }   
       }   
      if(ADC_databit==10)  //10 bit   
       {   
         if(adccount<(MaxSize/2))   
          {   
            adccount++;   
            adcdata[rear]=Hbyte;//插入高8位   
            rear=(rear+1)%MaxSize;   
            adcdata[rear]=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=(front+1)%MaxSize;   
           adccount--;         
         }      
        if(ADC_databit==10)  //10 bit   
         {   
           idata=adcdata[front];   
           idata=idata<<8;   
           front=(front+1)%MaxSize;   
           idata=idata+adcdata[front];   
           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;   
    }   

出0入0汤圆

发表于 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[MaxSize]; //环形队列
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

出0入0汤圆

发表于 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[32];   
    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 char  x)   
    {   
        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[currenp] = 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[i];   
                    }   
                    adc_average = adc_average>>5;   
                    putnum(adc_average);   
                    putchar(0x0a);          //回车换行   
                    putchar(0x0d);   
                }   
            }   
      
            _delay_ms(2);   
      
            PORTC ^= 0x01;   
        }   
      
        return 0;   
    }   
      
      
头像被屏蔽

出0入0汤圆

发表于 2013-3-8 21:31:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表