找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4532|回复: 1
打印 上一主题 下一主题
收起左侧

AVR内部AD模块的求助!各位大虾们帮个忙吧……

[复制链接]
跳转到指定楼层
楼主
ID:30377 发表于 2011-8-15 19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 各位大侠们,我想用ATmega128的内部AD的,我选用的编译器是IAR AVR,程序如下:

#include <ioavr.h>
#include <intrinsics.h>
#define  unchar unsigned char
#define  unint  unsigned int

unchar vol;

#define    REFS1    7
#define    REFS0    6
#define    ADLAR    5
#define    MUX4     4
#define    MUX3     3
#define    MUX2     2
#define    MUX1     1
#define    MUX0     0

#define    ADEN     7
#define    ADSC     6
#define    ADFR     5
#define    ADIF     4
#define    ADIE     3
#define    ADPS2    2
#define    ADPS1    1
#define    ADPS0    0

#define rs_L()  (PORTD &= ~(1<<7))
#define rs_H()  (PORTD |= (1<<7))

#define rw_L()  (PORTD &= ~(1<<6))
#define rw_H()  (PORTD |= (1<<6))

#define en_L()  (PORTD &= ~(1<<5))
#define en_H()  (PORTD |= (1<<5))

void delay_ms(unint x)  //12M 1ms延时程序
{
  unint y;
  for(;x>0;x--)
    for(y=0;y<120;y++);
}

void w_com(unchar com)
{
  unint i;
 PORTC=com;

 rs_L();
  
 rw_L();
  
 en_L();
 i=10;
 while(i--);
 en_H();
 i=10;
 while(i--);
}

void w_data(unchar dataa)
{
  unint i;
 PORTC=dataa;
 
 rs_H();
 
 rw_L();
 
 en_L();
 i=10;
 while(i--);
 en_H();
 i=10;
 while(i--);
}

void L1602_init()
{
 w_com(0x01);
 w_com(0x38);
 w_com(0x0c);
 w_com(0x06);
 w_com(0xd0);
}

void L1602_char(unchar hang,unchar lie,char sign)
{
 unchar a;
 if(hang==1) a=0x80;
 if(hang==2) a=0xc0;
 a=a+lie-1;
 w_com(a);
 w_data(sign);
}

void L1602_string(unchar hang,unchar lie,unchar *p)
{
 unchar a;
 if(hang==1) a=0x80;
 if(hang==2) a=0xc0;
 a=a+lie-1;
 w_com(a);
 while(1)
 {
  if(*p=='\0') break;
  w_data(*p);
  p++;
 }
}

unchar BIT(unchar x)
{
  unchar temp;
  temp = (0x01<<x);
  return temp;
}

/*
*函数功能:ADC模块的初始化程序
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void init_adc()
{
  ADCSR=0X00;     //设置ADC前,禁止ADC
  ADMUX=BIT(REFS1)|BIT(REFS0);   //设置ADC内置参考电压为2.56V的片内基准电源
  ADMUX|=BIT(ADLAR);     //ADC转换结果左对齐,直接取ADCH的8位数据
  ADCSR=BIT(ADEN)|BIT(ADPS1)|BIT(ADPS0)|BIT(ADPS2);  //ADC使能,128分频
}

unsigned char get_adcdata(void)
{
  unsigned char volt;
//  ADMUX=BIT(MUX0)|BIT(MUX1)|BIT(MUX2)|BIT(MUX3);           //选择通道3,电池电压通道
  ADMUX|=0;
  ADCSR|=BIT(ADSC);  //启动单次ADC转换
  while (!(ADCSR&BIT(ADIF)));  //等待转换结束
  ADCSR&=~(BIT(ADIF));    //清楚ADIF位
  volt=ADCH;
  return volt;
}

void L1602_display1()
{
  L1602_char(1,9,vol/100%10+48);
  L1602_char(1,11,vol/10%10+48);
  L1602_char(1,12,vol%10+48);
}

 


void main()
{

 
  DDRC=0xff;
  PORTC=0xff;
  DDRD=0xff;
  PORTD=0xff;
  DDRF=0x00;
  PORTF=0x00;
  L1602_init();
  L1602_string(1,1,"   IN0: 0.00V   ");
  L1602_string(2,1,"   IN1: 0.00V   ");
  init_adc();
  while(1)
  {
    vol = get_adcdata();
    vol=(vol/256)*500;
    L1602_display1();
    delay_ms(1000);
  }
}

 

我用IAR模拟运行了一下,发现就是死在了 while (!(ADCSR&BIT(ADIF)));  这边,这说明AD一直都在转换,就是没转换好!这是为什么呢?劳烦各位大侠留步帮小弟解决下!有劳了各位了……

[此贴子已经被作者于2011-8-15 19:14:36编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:37273 发表于 2012-3-28 15:57 | 只看该作者
while (!(ADCSR&BIT(ADIF))); 这句话本身有问题吧。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表