搜索
bottom↓
回复: 1

马老师,请教一个AD转换与显示的问题

[复制链接]

出0入0汤圆

发表于 2007-7-21 09:16:21 | 显示全部楼层 |阅读模式
马老师,我的这个程序,烧进去之后就显示6个0,没有变化。本意就是从AD0转换来的8位数据显示出来,从PC1,2,3输出经74LS138译码输出片选信号LED,经PD3,4,6,7输出BCD码经74LS47 译码输出数据到LED。显示部分应该没问题了,我在LED[]里面初始化什么就显示什么。我怀疑是AD转换的问题,可能ADCH里面根本没有数据,不然不会全显示0的。请问我改怎么改呢?谢谢



//ICC-AVR application builder : 2007-7-17 16:07:21

// Target : M8

// Crystal: 8.0000Mhz

#include <iom8v.h>

#include <macros.h>

  

unsigned char i;

unsigned char led[6]={0,0,0,0,0,0};

unsigned int  n;

void xs_zh(unsigned char b)

  {

  PORTD = (PIND & 0x27) | (0xc0 & led<<4) | (0x18 & led<<3);

  }

   

void port_init(void)

{

PORTB = 0x00;

DDRB  = 0x00;

PORTC = 0x00; //m103 output only

DDRC  = 0x0E;

PORTD = 0x00;

DDRD  = 0xD8;

}





//TIMER0 initialize - prescale:64

// desired value: 2mSec

// actual value: 2.000mSec (0.0%)

void timer0_init(void)

{

TCCR0 = 0x00; //stop

TCNT0 = 0x06; //set count

TCCR0 = 0x01; //start timer

}





#pragma interrupt_handler timer0_ovf_isr:10

void timer0_ovf_isr(void)

  {

  TCNT0 = 0x06; //reload counter value

  PORTC |= 0x0E;//先关闭显示

  xs_zh(i);             //送显示数据

  PORTC = (PINC & 0xf1) | (0x0e &i<<1);     //开显示

  i++;                 //准备显示下一位

  if(i>=6)i=0;

  }



  //ADC initialize

// Conversion time: 13uS

void adc_init(void)

{

ADCSR = 0x00; //disable adc

ADMUX = 0x60; //select adc input 0

ACSR = 0x80;

ADCSR = 0xE3;

}



//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

timer0_init();

adc_init();



MCUCR = 0x00;

GICR  = 0x00;

TIMSK = 0x01; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

/*——————————————————————————————————————————————*/

unsigned int read_adc(unsigned char adc_input)//查询方式读取ADC单端通道

   {

      ADMUX=(0x60|adc_input); //adc_input:单端通道 0x00~0x07,0x1E,0x1F

      //0xc0:选择内部5V参考电压,左对齐

      ADCSRA|=(1<<ADSC); //启动AD转换

   

     while ((ADCSRA&(1<<ADIF))==0); //写法2 这种写法优化不好

   

      ADCSRA|=(1<<ADIF); //写1清除标志位

      return ADCH; //ADC=ADCH:ADCL

   }



void pocess(void)

{

n=n/256*5;

led[2]=n/100;

n%=100;

led[1]=n/10;

n%=10;

led[0]=n;

led[3]=0;

led[4]=0;

led[5]=0;

}



void main(void)

{

init_devices();

while(1)

{

  n=read_adc(0);

  pocess();

}

}  

 

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-8-10 16:42:24 | 显示全部楼层
参考我讲义的第10章
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-22 16:02

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

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