/*******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/* 多通道AD转换演示程序 */
/* 作者:ntzwq@wx88.net � */
/* 2002年5月11日 */
/* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
/*******************************************/
//使用内部RC振荡,PB6-G,PB7-DP短路块连接
//使用INT0/INT1按键切换ADC通道
#include <iom8v.h>
#include <macros.h>
#define osccal 0x7d//内部RC校正常数
#define Vref 2580//参考电压值
extern const unsigned char seg_table[16];
extern unsigned char led_buff[4];
extern void delay_ms(unsigned int time);
extern void display(void);
extern void uart();
unsigned int adc_rel;//AD转换结果
unsigned char adc_mux;//AD通道
//ADC初始化
void adc_init(void)
{
DDRC=0x00;
PORTC=0x00;
ADCSRA = 0x00;
ADMUX =(0<<REFS1)|(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
ACSR =(1<<ACD);//关闭模拟比较器
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
}
//ADC完成中断
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
adc_rel=ADC&0x3ff;
ADMUX=(1<<REFS1)|(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
ADCSRA|=(1<<ADSC);//启动AD转换
}
//ADC结果转换成电压值
void ADCtoBCD(unsigned int temp)
{
unsigned char i;
temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
for(i=0;i<4;i++)
{
led_buff[i]=seg_table[temp%10];
temp=temp/10;
}
led_buff[3]&=0x7f;
}
//MAIN程序
void main(void)
{
unsigned int data;
unsigned char i;
unsigned int adc_old;
DDRD=0xf0;
PORTD=0xff;
OSCCAL=osccal;//校正振荡频率
adc_mux=0;
adc_init();
SEI();
for(i=0;i<4;i++)
{
led_buff[i]=seg_table[8];
}
for(i=0;i<200;i++)
display();
adc_old=0;
adc_rel=0;
while(1)
{
if(adc_old!=adc_rel)
{
adc_old=adc_rel;
ADCtoBCD(adc_old);
uart(adc_old);
}
display();
i=PIND&0x0c;//判断按键
if(i!=0x0c)
{
display();//按键消抖
if(i==(PIND&0x0c))
{
CLI();
adc_rel=0;
adc_old=0;
if (i==0x08)//INT0键按下
{
if(adc_mux<3)
adc_mux++;//递增
else
adc_mux=0;
}
if (i==0x04)//INT1键按下
{
if(adc_mux>0)
adc_mux--;//递减
else
adc_mux=3;
}
led_buff[0]=seg_table[adc_mux];
led_buff[1]=0xbf;//-
led_buff[2]=0b10001001;//h
led_buff[3]=0b11000110;//C
while((PIND&0x0c)!=0x0c)//检查按键释放
display();
SEI();
}
}
}
}