谁有PUDN账号,帮忙下个mega88的程序,谢谢!
http://www.pudn.com/downloads40/sourcecode/embed/detail140468.htmlhttp://www.pudn.com/downloads115/sourcecode/embed/detail489192.html 自己注册个呗 求人不麻烦吗??? 汗 PUDN注册了还要积分,没有amobbs好,把PUDN的东西放到amobbs上,大家都能共享的,谁能帮个忙,谢谢! 不是不给你下,那个链接里面,你直接点开那个文件就能够看的 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 下面的是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;
} 下面的是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 下面的是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;
}
页:
[1]