搜索
bottom↓
回复: 3

请教马老师及各位:我的这个AD转换程序怎么不能实现呢,显示的是乱码,谢谢了,我已经调

[复制链接]

出0入0汤圆

发表于 2007-4-22 15:39:30 | 显示全部楼层 |阅读模式
我使用的是MEGA16内部AD转换,是不是中断位置放的不对啊,还是分频设的不精确,我用的是内部RC振荡,1MHZ.

#include<iom16v.h>

#include<macros.h>

#define            osccal       0xB9                             //内部RC校正常数

#define            Vref          5000                               //参考电压值

unsigned int      adc_rel;                                        //AD转换结果

//延时程序

void delayUs(unsigned int time)

{

do

  {

   time--;

   }

  while(time>1);

}

void delayMs(unsigned int time)

{

while(time!=0)

{

  delayUs(500);

  time--;

  }

}

//显示程序

void Disp(unsigned char data_disp)

{

unsigned int i, data,temp;

unsigned char ledtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

DDRD=0xff;

PORTD=0xff;

DDRB|=0xf0;

PORTB|=0xff;

data=data_disp;

for(i=0;i<4;i++)

{

   temp=data%10;

  data=data/10;

  PORTD=ledtable[temp];

  if(i==2)

     {PORTD=0x7f;} //设置小数点

  PORTB=(1<<(4+i));

  delayMs(1);

  PORTB|=0xf0;

  }

  }

void adc_init(void)            //ADC初始化

{

   DDRA=0x00;         //设置为高阻态输入

   PORTA=0x00;

   ADCSRA=0x00;

   ADMUX=0x40|(1<<ADLAR);     // AVCC 片内基准电压 /select adc input 0/

   ACSR=(1<<ACD);                    //关闭模拟比较器

   ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);

}

#pragma interrupt_handler adc_isr:15  //ADC完成中断

void adc_isr(void)

{

adc_rel=ADC&0x3ff;            

}

void ADCtoBCD(unsigned int temp)  //ADC结果转换成电压值

{

  temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);

}

void main(void)

{

   unsigned char i;

   OSCCAL=osccal;          //校正内部RC振荡频率

   adc_init();             //ADC初始化

    SEI();

    for(i=0;i<200;i++)  //复位后显示一段时间8888

   {

     Disp(8888);

   }

   PORTD=0xff;

   delayMs(1000);

   while(1)

   {

     adc_rel=ADC;

     ADCtoBCD(adc_rel);

      Disp(adc_rel);

   }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2007-5-8 14:35:54 | 显示全部楼层
参考我的新版讲义第10章。

出0入0汤圆

发表于 2008-7-11 15:13:46 | 显示全部楼层
初来咋到,请问讲义在哪里?

============================
那就先把本栏置顶的帖子游览一下。

出0入0汤圆

发表于 2008-7-11 17:06:17 | 显示全部楼层
自己写个简单的显示程序,让数码管轮流显示0123456789.如果正常显示,说明是bcd转换的问题。如果不正常,先解决这个问题吧。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 05:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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