打印
[AVR单片机]

在proteus仿真AVR单片机ADC中断怎么不行呢?

[复制链接]
2397|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zezy371|  楼主 | 2013-4-18 21:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在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);

}

电路.JPG (244.16 KB )

电路.JPG

相关帖子

沙发
zezy371|  楼主 | 2013-4-18 22:04 | 只看该作者
不知什么原因,我写入单片机实验,除了数码管刷新有点慢外,还算正常,但仿真就不行,老是显示上电时,的那一次转换,我就把扫描放入中断函数内,结果就不扫描了,证明中断没有起到作用。请问大侠们,这是仿真环境的原因呢还是我的程序原因呢?

使用特权

评论回复
板凳
zezy371|  楼主 | 2013-4-19 22:20 | 只看该作者
怎么没人回呀

使用特权

评论回复
地板
qin552011373| | 2013-4-20 09:25 | 只看该作者
没有看到你使能全局中断  你使能全局中断后再看看

使用特权

评论回复
5
zezy371|  楼主 | 2013-5-5 22:49 | 只看该作者
后来仔细的找原因,原因终于找到了,原来是AVR单片机的ADC转换太快了,我的数码管扫描函数又在主程序里扫描,AVR单片机的ADC转换太快了,中断把主程序的时间几乎给全部占去了,弄的数码管扫描函数没有什么时间扫描数码管,所以看到的数码管是一位一位的扫描太慢了。这就是故障原因,谢谢大家的参与。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

241

帖子

0

粉丝