#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/wdt.h>
#include <avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define FREQ 4
const table[11]={0x0a,0xfa,0x8c,0xa8,0x78,0x29,0x09, 0xba,
0x08,0x28,0xf7};
const table1[4]={0x02,0x04,0x01,0x08};
static uint ADValue[16] = {0}; //AD采样值
//全局变量定义
static n=0; //中断计数器
static uint g_nAdValue=0;//平均电压
static ADTimes=0; //AD采样次数,第几次采样
static g_nADSampEnd=0; //N次采样完成
static tmp16; //AD采样和
//********************************************************
//函数名:DelayMs
//输入:无
//输出:无
//描述:ms级延时函数
//********************************************************
void DelayMs(uint ms)
{
uint i;
for(i=0;i<ms;i++)
_delay_loop_2(FREQ * 250);
}
//********************************************************
//函数名:Gpio_Init
//输入:无
//输出:无
//描述:ATmega GPIO 初始化,设置输入/输出方向及初始状态
//********************************************************
void Gpio_Init(void)
{
DDRB=0xFF;
DDRD=0XFF;
PORTB=0XFE;
PORTD=0XFF;
}
//********************************************************
//函数名:Timer0_Init
//输入:无
//输出:无
//描述:ATmega 8 Timer0 初始化,中断周期10ms
//********************************************************
void Timer0_Init(void)
{
TCCR0=0x04;//256分频,8M/1024,
TCNT0=0X00;//计数器清零
TIMSK|=0x01;//使能TOIE0中断
TIFR|=0X01; //清楚中断标识位
}
//********************************************************
//函数名:void show
//输入:无
//输出:无
//描述:数码管扫描函数
//********************************************************
void show(uchar duan,uchar wei)
{
PORTD=0X00;//灭灯
PORTB=table[duan];
PORTD=table1[wei];
DelayMs(1);
}
//********************************************************
//函数名:Adc_init
//输入:无
//输出:无
//描述:AD中断扫描函数
//********************************************************
void Adc_init(void)
{
ADMUX=0Xc0;
//使能ADC,中断允许,自由模式, 时钟:ck/8
ADCSRA=_BV(ADEN)|_BV(ADIE)|_BV(ADFR)|_BV(ADPS1)|_BV(ADPS0);
ADCSRA|=_BV(ADSC);//自由模式开始转换
}
//********************************************************
//函数名:main.c
//输入:无
//输出:无
//描述:测量电路电压,驱动数码管显示
//********************************************************
void main()
{
Gpio_Init();
Adc_init();
wdt_enable(WDTO_1S);
uint ada ,i,v,ad[4];
sei();
while(1)
{
cli();
v= g_nAdValue;
ada=v*3/10;
for(i=0;i<3;i++)
{
ad[2-i]=ada%10;
ada=ada/10;
}
if(ad[0]==0)//消隐第一位的零
{
for(i=1;i<3;i++)
{
show(ad[i],i);
}
show(10,1);
}
else
{
for(i=0;i<3;i++)
{
show(ad[i],i);
}
show(10,1);
}
sei();
wdt_reset();//喂狗
}
}
//********************************************************
//函数名:SIGNAL(SIG_ADC)
//输入:无
//输出:无
//描述:AD测量中断服务程序
//********************************************************
SIGNAL(SIG_ADC)
{
/* g_nAdValue=ADCL;
g_nAdValue|=(uint)(ADCH<<8);
*/
ADValue[ADTimes] =ADCL;
ADValue[ADTimes]|=(ADCH<<8);
ADTimes++;
if( ADTimes>=16)
{
ADTimes = 0;
tmp16=0;
for( n=0;n<16;n++ )
{
tmp16+=ADValue[n];
}
g_nAdValue = tmp16/16;
}
}