囧小错吧 关注:136贴子:6,649
  • 14回复贴,共1

51单片机A/D转换程序求解释!

只看楼主收藏回复

只给程序中的几行核心代码:
int addr=0x7ff8,b;
for(n=0;n<8;n++)
{
b=addr+n;
XBYTE[b]=0; //启动A/D转换
while(!INT0);
while(INT0); //等待A/D转换
a[n]=XBYTE[b];
}
我不理解的是那两个while循环!当启动A/D后,WR写信号发出,当转换完成后,ADC0809发出信号给int0,然后单片机发出读信号RD给ADC0809的OE。第一个while信号是把int0变成高电平吗?第二个while循环是等待转换结束ADC0809发出EOC信号?还有,第二个while(INT0)一定要有吗?为什么有些程序里在启动AD和读取AD的代码中间只有一个while(!INT0)?最后一个问题,关于XBYTE,请问这是数组还是什么,它的具体用法是什么?


IP属地:江苏1楼2013-12-12 12:55回复
    求指导


    IP属地:江苏2楼2013-12-12 12:56
    回复
      这是全的代码:
      #include<reg51.h>
      #include"absacc.h"
      bit flag;
      unsigned char a[8],counter;
      void t0_ser() interrupt1 using 1
      {
      TLO=0XB0;
      TH0=0X3C;
      countor++;
      if(countor==5)
      {
      countor=0;
      flag=1;
      }
      }
      void samp()
      {
      char n;
      int addr=0x7ff8,b;
      for(n=0;n<8;n++)
      {
      b=addr+n;
      XBYTE[b]=0; //启动A/D转换
      while(!INT0);
      while(INT0); //等待A/D转换
      a[n]=XBYTE[b];
      }
      }
      void main()
      {
      TMOD=0X01;
      TL0=0XB0;
      TH0=0X3C;
      ET0=1;
      EA=1;
      TR0=1;
      while(1)
      {
      if(flag)
      {
      flag=0;
      samp();
      }
      }


      IP属地:江苏3楼2013-12-12 22:55
      回复
        经过一晚上的努力,这两个while循环我已经明白了。不过XBYTE[]的用法还是不明白,甚至连它是什么都不知道。主要是书上什么解释都没有就直接用了。小错姐姐,你就解释一下这个吧!


        IP属地:江苏4楼2013-12-14 01:14
        回复
          XBYTE[] 的意思就是,访问外设的指令。就是51结构的单片机,鬼定好的,访问外设,就用这个指令。
          翻译成人话就是: * address = data
          XBYTE[b]=0 意思就是即:给外部的地址 b 的地方写0。 相当于C语言中的, *b = 0


          5楼2013-12-16 10:15
          回复
            一楼的程序相当于:
            int adc_addr=0x7ff8;
            xdata unsigned char* temp_addr;
            unsigned char adc_data[8];
            for(n=0;n<8;n++)
            {
            temp_addr=adc_addr + n;
            *temp_addr=0; //XBYTE[b]=0; //启动A/D转换
            while(!INT0); //若中断int0 为低,则什么也不干。
            while(INT0); //int0 为高时,ad在转换。//等待A/D转换
            adc_data[n]=*temp_addr; //a[n]=XBYTE[b];
            }


            6楼2013-12-16 10:51
            回复
              请问小错同学,当51单片机同时外扩RAM和ROM时,用C语言编写访问外部RAM或外部ROM的程序,为什么数据不会送错地方?就是和单片机那三个引脚PSEN,WR,RD有关的,具体访问时在一个周期的时序是怎样的?


              IP属地:江苏7楼2013-12-16 12:10
              回复
                因为ram没有oe ,rom没有WR和RD 呀。时序不同,所以不会访问混乱。


                8楼2013-12-17 09:47
                回复


                  9楼2013-12-17 10:13
                  回复


                    10楼2013-12-17 10:16
                    回复
                      挺清楚的。我想再问下,当访问外部ROM(比如“读”)和外部RAM时,用C语言编程该怎么编?比如上面的XBYTE就是访问外部RAM的,能再多举几个例子吗?


                      IP属地:江苏11楼2013-12-17 22:32
                      回复
                        访问ROM使用movc指令,访问片外RAM使用movx
                        C语言访问rom,例如:
                        定义的时候用,static unsigned char tab[10]={111,222,333,444,555,666,777,888,999,456};
                        访问的时候用,tab[1] 就可以取到222这个数。
                        相当于汇编中的,这些语句:
                        tab:111,222,333,444,555,666,777,888,999,456
                        汇编访问时用,
                        mov DPTR,tab
                        mov A,#01H
                        movc A,@DPTR+A


                        12楼2013-12-18 12:21
                        回复
                          访问片外RAM使用movx
                          C语言访问片外ram,例如:
                          定义的时候用,xdata unsigned char aaa;
                          赋值的时候使用,aaa=34; //把34写入aaa
                          取值的时候使用,char bbb=aaa; //把aaa里的数34取出来,给bbb
                          相当于汇编中的,这些语句:
                          给片外ram中的aaa里写34,如下:
                          mov DPTR,0x1023
                          mov A,#22H
                          movx @DPTR,A
                          把aaa的数取到bbb中,如下:
                          mov DPTR,0x1023
                          movx A,@DPTR
                          mov 21h, A


                          13楼2013-12-18 12:37
                          收起回复
                            A/D转化并用数码显示我明明程序正确,但为什么数码一直显示4,91和3.71呢


                            IP属地:江苏14楼2014-06-16 14:40
                            回复