微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 在书中看了一些问题,不太理解,求帮忙解答一下

在书中看了一些问题,不太理解,求帮忙解答一下

时间:10-02 整理:3721RD 点击:
#include <absacc.h>
#include <reg52.h>
#define uchar unsigned char
#define IN0 XBYTE[0x7ff8]         /*设置AD0809的通道0地址*/ \\不明白的地方1
sbit ad_busy = P3^3;                 /*即EOC状态*/
void ad0809(uchar idata * x)      /*采样结果放指针中的A/D采集函数*/
{
    uchar i;
    uchar xdata * ad_adr;
    ad_adr = &IN0;
    for(i=0;i<8;i++)                 /*处理8通道*/
    {   
        *ad_adr = 0;                 /*启动转换*/         //不明白的地方2
        i = i;                               /*延时等待EOC变低*/
        i = i;
        while(ad_busy == 0);    /*查询等待转换结束*/
        x = *ad_adr;            /*存转换结果*/
        ad_adr++;                  /*下一通道*/
    }
}
int main(void)
{
    static uchar idata ad[10];
    ad0809(ad);                   /*采样AD0809通道的值*/
    return 0;
}

问题:
不明白的地方1:为什么IN0的地址是这一个?
不明白的地方2:指针指向的是IN0的地址,*ad_adr指的是IN0这个地址的内容?具体指的是什么?为什                           么启动转换可以转化成这种形式?START的启动不是低电平—高电平—低电平吗?
电路图片:


你要选中0809就要有地址线和读写信号的配合,你看看那个oe端怎么才能选中呢?

不明白的地方1:为什么IN0的地址是这一个?
从原理图看,要使0809动作,P2.7必须为0,同时通道地址由P0以写数据的方式在P0.[2:1]送出,所以-WR和P2.7经门电路运算后同时给0809的ALE和START高电平,锁存通道地址,并启动转换;
所以,IN0 不一定非要==0x7FF8;只要bit15(输出到P2.7)为0、bit[2:0](作为数据在P0[2:0]输出)为0,都可以作为ADC通道地址(没有其他设备用其他地址位作为片选时);仅就你提供的这个电路图,0也可以作为IN0的地址;
不明白的地方2:指针指向的是IN0的地址,*ad_adr指的是IN0这个地址的内容?具体指的是什么?为什                           么启动转换可以转化成这种形式?START的启动不是低电平—高电平—低电平吗?
‘*ad_adr指的是IN0这个地址的内容’,正确,具体指的是这个地址的数据,写时是通道地址,并且写信号同时会启动转换过程;
后面的为什么请你查阅一下MCS51总线时序、0809时序和基本逻辑门电路,就明白了

关于不明白地方二:你的意思是不是当单片机执行语句*ad_adr = 0的时序给了AD0809 启动(START)的一个启动时序?

是,正确。
并且同时也将通道地址也锁存进了0809

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top