|
楼主 |
发表于 2006-9-19 16:59:43
|
显示全部楼层
/**********************************便携式电源**********************************/
//编译环境ICCAVR ,MCU:MEGA8@8MHZ
//资源分配:
//PB0--PB7:LED显示当前电压
//PC0--PC4:预留 PC5:AD信号采集输入口
//PD0--PD7:预留
//功能:可以模拟显示0--20V以内的电压,精度为0.1,采样电压为实际电压的1/4
//编写:李科 2006/09/18
#include <iom8v.h>
#include <macros.h>
/*************************函数申明*************************/
void port_init(void);
/*************************全局变量*************************/
long int value=0,i=0;//定义长整形变量
/************************端口初始化************************/
void port_init(void) //端口初始化
{
PORTB = 0xff; //B口输出1
DDRB = 0xff;
PORTC = 0xff; //C口输入状态
DDRC = 0x00;
PORTD = 0x00; //D口输出0
DDRD = 0xff;
}
/*************************延时函数*************************/
void delay(int m) //1ms延时
{
int l,j;
for(l=0;l<m;l++)
{for(j=0;j<1000;j++);}
}
/*************************AD初始化*************************/
void adc_init(void) //中断初始化,中断时间: 208uS
{
ADCSR = 0x00; //关ADC
ADMUX = 0x05; //ADC第5通道输入
ACSR = 0x80;
ADCSR = 0xEF; //开ADC,并128分频
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void) //中断函数
{
ADCSR = 0xEF; //开ADC,并128分频
ADMUX = 0x05; //ADC第5通道输入
value = ADCL; //必须先读低8位
value|=(int)ADCH << 8; //再读高8位
}
void main(void) //主函数
{
CLI(); //清0
port_init(); //端口初始化
delay(1000);
PORTB = 0x00; //B口输出0
adc_init(); //A/D转化初始化
SEI(); //允许所有中断
while(1)
{
i=((value*4*5)/102.4)-3;//乘以4表示采样电压为真实电压的1/4,减去3为电压修正
PORTB=i;
}
} |
|