|
楼主 |
发表于 2011-11-5 10:42:10
|
显示全部楼层
//#define ENABLE_BIT_DEFINITIONS
#include <mega16.h>
#include <delay.h>
#asm
.equ __lcd_port=0x15;
#endasm
#include <lcd.h>
unsigned char dis_buff[5]={0,0,0,0,0};
//bit time_2ms_ok;
unsigned char *str;
//#include <intrinsics.h>
#define FIRST_ADC_INDEX 0 //第一个通道标示
#define LAST_ADC_INDEX 1 //第二个通道标示
//#define Num_result 11 //每一个AD通道的采样次数为11次
#define ADC_VREF_TYPE 0x40
//float adc_date[LAST_ADC_INDEX-FIRST_ADC_INDEX+1]; //存放每一路AD通道的转换结果的数组
//float ADresults[Num_result]; //4个AD通道转换结果暂存数组
//unsigned char AD_Final=0; //单通道AD转换11次采样后标志
unsigned int input_index=0;
#define ADC0 1
#define ADC1 2
//#define ADC2 3
//#define ADC3 4
//unsigned char times=0;
unsigned int temp1,temp2;
//float voltage;
//float current;
/*float ADFilte(void) //AD去极值数字滤波,结果处理
{
float Filte_result=0;
unsigned int i,j;
float temp;
unsigned int count;
for(j=0;j<Num_result-1;j++)
{
for(i=0;i<Num_result-j;i++)
{
if(ADresults>ADresults[i+1])
{
temp=ADresults;
ADresults=ADresults[i+1];
ADresults[i+1]=temp;
}
}
}
for(count=1;count<(Num_result-1);count++)
{
Filte_result+=ADresults[count];
}
return Filte_result/(Num_result-2);
}
*/
/*float V_I(float vol)
{
current=4+((vol-80)/(400-80))*16;
return current;
}
*/
// ADC电压值送显示缓冲区函数
void adc_to_disbuffer(unsigned int adc)
{
char i,j;
for (i=0;i<=3;i++)
{
j=3-i;
dis_buff[j]=(adc % 10)+48;
adc /= 10;
}
lcd_gotoxy(input_index*6,0);
lcd_puts(str);
}
//#pragma vector=ADC_vect
//__interrupt void AD_process(void)
// ADC 转换完成中断服务
interrupt [ADC_INT] void AD_process(void)
{
//unsigned char times=0;
//unsigned int temp1,temp2;
unsigned int adc_v;
temp1=ADCL;
temp2=ADCH;
temp2=(temp2<<8)+temp1;
// ADresults[times]=temp2; //将结果移到数组ADresults[]
//times++;
ADCSRA |=(1 << ADIF); // Acknowledge the ADC Interrupt Flag
adc_v=(unsigned long)temp2*5000/1024; //换算成电压值
adc_to_disbuffer(adc_v); //转换成ASCII码,送显示缓冲区
// if (++input_index>(LAST_ADC_INDEX-FIRST_ADC_INDEX)) //判断两通道是否转换完毕
// input_index=0;
// ADMUX=(FIRST_ADC_INDEX|ADC_VREF_TYPE)+input_index; //切换到下一通道准备继续转换
// AD_Final=1;
/* if(times==Num_result)
{
voltage=ADFilte();
adc_date[input_index]=V_I(voltage);
times=0;
if (++input_index>(LAST_ADC_INDEX-FIRST_ADC_INDEX))
input_index=0;
ADMUX=(FIRST_ADC_INDEX|ADC_VREF_TYPE)+input_index;
AD_Final=1;
}
*/
}
void main(void)
{
// WDTCR=(1<<WDCE)|(1<<WDE);
// WDTCR = 0x00;
DDRA&=~(1<<ADC0)|(1<<ADC1)|(1<<ADC2)|(1<<ADC3); // 初始化I/O端口
PORTA=0x00;
ADMUX=0x40; //ADC参考电源选择AVCC,AREF外部并接电容,ADC0单端输入
ADCSRA=0xAD; //ADC允许,自动触发转换,ADC转换中断允许位,32分频,ADCclk=(4MHz/32)=125kHz
SFIOR=0; //连续自由转换
//asm("sei");
// lcd_init(16);
// lcd_clear();
ADCSRA|=(1<<ADSC); //开启ADC
str =dis_buff;
// #asm("sei") // 开放全局中断
while(1)
{
#asm("nop");
}
}
程序原来是想实现2通道转换,结果发现有问题,好多语句注释掉了,注释之后的程序是一个通道连续自由转换的实验程序,中断被禁止,只想观察连续自由转换是否正常进行。 |
|