打印

2007电子制作中的ADC0809A/D转换芯片的原理及应用中的疑问?

[复制链接]
3287|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
[size=+1]C语言源程序
#include <AT89X52.H>
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
 0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
[size=+1]sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
unsigned char channel=0xbc;//IN3
unsigned char getdata;
[size=+1]void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
[size=+1]P3=channel;
[size=+1]while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
[size=+1]void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
请解释一下当选择第三通道时,为何是这句:unsigned char channel=0xbc;//IN3
在设置显示缓冲时为何是:unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
这是什么意思:
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;

为何如此写,请作一个详细的分析,我是单片机初学者,谢谢!


相关帖子

沙发
FDLock| | 2009-8-30 22:35 | 只看该作者
1. unsigned char channel=0xbc;  //IN3
   看后面的P3=channel;,即P3 = 0xBC,即1011 1100,根据原理图得到C B A信号的电平状态为011,即选用IN3。

2. unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
   这是用来初始化LED开始的显示状态,将dispbuf[0]--[4]初始化为10,根据unsigned char code dispcode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};, 用10去查表得0x00,表示不显示。
   所以是初始化前5个数码管不显示,后3个显示为‘0’。

3. 是将getdata变量的百位值放到dispbuf[2],十位值放到dispbuf[1],个位值放到dispbuf[0],这样就可以将A/D结果显示出来。
但getdata=getdata%10;是有问题的,应该是getdata=getdata%100;

使用特权

评论回复
板凳
luo101luo|  楼主 | 2009-8-31 00:59 | 只看该作者
还是明白第一条是什么意思!依你的意思现在就定义了P3.0的
P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
1      0      1      1      1      1      0      0
ST    OE    EOC          A      B     C         
为什么P3.0P3.1P3.2P3.3要试先定义

使用特权

评论回复
地板
FDLock| | 2009-8-31 19:46 | 只看该作者
可以看一下AD0809数据手册上的操作时序, OE是高电平使能输出的, 所以在启动A/D转换前应为低电平.

不预先定义也行, 但对A、B、C的设置就不能用P3=channel;了, 而是要一条一条代码来设置。
......
sbit  ADC0809_A = P3^4;
sbit  ADC0809_B = P3^5;
sbit  ADC0809_C = P3^6;
......
OE = 0;
ADC0809_A = 1;
ADC0809_B = 1;
ADC0809_C = 0;
......

使用特权

评论回复
5
luo101luo|  楼主 | 2009-8-31 20:11 | 只看该作者
哦`~谢谢!

使用特权

评论回复
6
luo101luo|  楼主 | 2009-8-31 20:13 | 只看该作者
能留个联系方式吗?比如QQ有问题向你请教!我的QQ:392296605

使用特权

评论回复
7
luo101luo|  楼主 | 2009-8-31 21:56 | 只看该作者

2007电子制作中的ADC0809A/D转换芯片的原理及应用中的疑问?

本帖最后由 luo101luo 于 2009-8-31 21:58 编辑


ADC0809应用说明
1、ADC0809内部带有输出锁存器,可以与AT89S51单片(2). 初始化时,使ST和OE信号全为低电平。
2、送要转换的哪一通道的地址到A,B,C端口上。
3、在ST端给出一个至少有100ns宽的正脉冲信号。
4、是否转换完毕,我们根据EOC信号来判断。
5、当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。

6、ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。
7、进行A/D转换之前,要启动转换的方法:
ABC=110选择第三通道
ST=0,ST=1,ST=0产生启动转换的正脉冲信号
     从上面的描述语言看似乎不能得出P3 = 0xBC,即1011 1100
从时序图上看能得出这个结论,是否如上图所示的两竖线之间区域内的ST、OE、EOC。谢谢!

使用特权

评论回复
8
li198857| | 2013-5-27 09:35 | 只看该作者
跪求哪位专家帮我编写一下C语言程序  模数转换  我是新手  变了一个星期了  谢谢了  想学点东西   谢谢了

QQ截图20130527092616.png (19.84 KB )

QQ截图20130527092616.png

使用特权

评论回复
9
chengjian167| | 2013-5-27 13:31 | 只看该作者
li198857 发表于 2013-5-27 09:35
跪求哪位专家帮我编写一下C语言程序  模数转换  我是新手  变了一个星期了  谢谢了  想学点东西   谢谢了 ...

孩子,不要再问了,自己动手学点东西,给你点提示吧,你这程序很简单,就是读取IO数据,并且送到1602上显示,设置一个死循环,设置好周期,用p3.0脚循环使能AD转换,读取p0口上的数据,送到p1口去显示。自己认真看书,一天就差不多了,实在不行。到网上找类似现成的程序吧,51的程序网上还是很丰富的.。。

使用特权

评论回复
10
chengjian167| | 2013-5-27 13:37 | 只看该作者
看错了,你这就是点亮数码管,不是1602,那就更简单了。。。

使用特权

评论回复
11
li198857| | 2013-5-28 09:40 | 只看该作者
请问具体是哪个网站   谢谢你了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

107

帖子

0

粉丝