|
发表于 2012-11-12 13:02:41
|
显示全部楼层
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/*//------宏定义------
#define uchar unsigned char
#define uint unsigned int
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR() asm("wdr")*/
//------段选宏定义-------
#define Sega 0x01
#define Segb 0x02
#define Segc 0x04
#define Segd 0x08
#define Sege 0x10
#define Segf 0x20
#define Segg 0x40
#define Segdp 0x80
#define Num0 (Sega + Segb + Segc + Segd + Sege + Segf)
#define Num1 (Segb + Segc)
#define Num2 (Sega + Segb + Segd + Sege + Segg)
#define Num3 (Sega + Segb + Segc + Segd + Segg)
#define Num4 (Segb + Segc + Segf + Segg)
#define Num5 (Sega + Segc + Segd + Segf + Segg)
#define Num6 (Sega + Segc + Segd + Sege + Segf + Segg)
#define Num7 (Sega + Segb + Segc )
#define Num8 (Sega + Segb + Segc + Segd + Sege + Segf + Segg)
#define Num9 (Sega + Segb + Segc + Segd + Segf + Segg)
#define Numdp (Segdp)
#define Numblk (0)
unsigned Num_code[12] = {Num0,Num1,Num2,Num3,Num4,Num5,Num6,Num7,Num8,Num9,Numdp,Numblk};
void show(int num)
{ //数码管显示,先段选再位选
PORTD = Num_code[num/1000];//千
PORTB |= 0x10;
_delay_ms(5);
PORTB = 0;
PORTD = Num_code[num%1000/100];//百
PORTB |= 0x4;
_delay_ms(5);
PORTB = 0;
PORTD = Num_code[num%100/10];//十
PORTB |= 0x2;
_delay_ms(5);
PORTB = 0;
PORTD = Num_code[num%10];//个
PORTB |= 0x1;
_delay_ms(5);
PORTB = 0;
}
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x1F;
PORTC = 0x01;
DDRC &= ~0x01;
PORTD = 0x00;
DDRD = 0xFF;
}
//定时器T0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x00;//初始值
OCR0 = 0x00;//匹配值
TIMSK |= 0x00;//中断允许
// TCCR0 = 0x6A;//启动定时器
}
//adc转换初始化
void adc_init(void)
{
ADCSRA = 0x00; //禁止AD转换
ADMUX = 0xC0;
SFIOR |= 0x00;
ACSR = 0x80; //禁止模拟比较器
ADCSRA = 0xEE;
}
volatile unsigned int adc_calc(void)
{
//计算实际电压
unsigned long value=0;
unsigned int voltage=0; //电压单位为(mV)
value=ADCL; //首先读低位
value|=(int)ADCH << 8; //然后读高位
voltage=(value*2560)>>10;
return voltage;
}
//#pragma interrupt_handler adc_isr:15
//void adc_isr(void)
SIGNAL(SIG_ADC)
{
//转换完成后中断处理
//unsigned int voltage;
OCR0 = adc_calc()/10;
}
void init_devices(void)
{
cli(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
adc_init();
timer0_init();
sei();//开全局中断
}
//主函数
int main(void)
{
init_devices();
while(1)
{
if(!(PINC&0x01))
{
_delay_ms(20);
if(!(PINC&0x01))
TCCR0 ^= 0x6A;//启动定时器PWM
_delay_ms(20);
while(!(PINC&0x01));
}
show(adc_calc());
}
}
这个样就可以了,还带数码管显示ADC的值 |
|