在proteus仿真AVR单片机ADC中断怎么不行呢?
我用的是ATmega16,#include<iom16v.h> //AVR单片机头文件
#include<macros.h> //单片机位操作重要头文件
#define uint unsigned int //整型16位数据宏定义
#define uchar unsigned char //整型8位数据宏定义
#define du_sc_1 PORTB |=(1<<6) //数码管驱动用573数据锁存置1宏定义
#define du_sc_0 PORTB &=~(1<<6) //数码管驱动用573数据锁存清0宏定义
#define we_sc_1 PORTB |=(1<<7) //数码管驱动用573位锁存置1宏定义
#define we_sc_0 PORTB &=~(1<<7) //数码管驱动用573位锁存清0宏定义
const uchar smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const uchar smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
const uchar smg_wf[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar table[8]={0,0,0,0,0,0,0,0}; //
void delay_ms(uchar ms) //
{
uchar a,b; //
for(b=0;b<ms;b++)
for(a=0;a<4;a++); //
}
void PORT_init(void) //
{
DDRC=0xff; //
PORTC=0x00; //
DDRB=0xc0; //
PORTB=0xc0; //
}
void display(void) //
{
uchar i;
for(i=0;i<8;i++)
{ //
PORTC=0; //
du_sc_1; //
du_sc_0; //
PORTC=smg_we; //
we_sc_1; //
we_sc_0; //
PORTC=smg_du[table]; //
du_sc_1; //
du_sc_0; //
delay_ms(1); //
}
}
void adc_init(void) //ADC初始化(形参是ADC的通道选择)
{
DDRA &=~BIT(0);
PORTA &=~BIT(0);
ADMUX |=0x40;
ADCSRA |=0xe8;
SFIOR |=0x00;
SREG |=BIT(7);
}
void data_pot(uint temp_L,uint temp_H)
{
uint temp0,temp1;
temp0=temp_H<<8; //把ADC转换值的高位值左移到16位数的高位
temp1=temp0+temp_L; //把ADC转换值的高8位和低8位合并成一个16位数据
table[4]=temp1/1000; //第4位数分离
table[5]=temp1%1000/100; //第3位数分离
table[6]=temp1%100/10; //第2位数分离
table[7]=temp1%10; //第1位数分离
}
void main(void)
{
PORT_init();
adc_init();
while(1)
{
display();
}
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
uint adc_L,adc_H,temp1,temp2;
adc_L=ADCL;
adc_H=ADCH;
temp1=adc_H*256;
temp2=temp1+adc_L;
table[0]=temp2/1000;
table[1]=temp2%1000/100;
table[2]=temp2%100/10;
table[3]=temp2%10;
delay_ms(20);
}
|