📄 ad0808.c
字号:
#include <at89x51.h>
#define uchar unsigned char
#define unit unsigned int
sbit eoc=P3^0;
sbit oe =P3^1;
sbit st =P3^3;
sbit s1=P2^5;
sbit s2=P2^6;
sbit s3=P2^7;
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x0,0x0};//数码管共阳级显示0~9,不显示
unit ad_0809,ad_data1,ad_data2,ad_data3;
uchar out;
void delaynms(unit x);
void display();
void ad0809();
void key();
void main()
{
EA=1;
EX0=1;
IT0=1;//下降沿触发,cpu内存占用少,如果是低电平触发,cpu将耗大量内存在中断上,长时间的取ad转换数据
while(1)
{ s1=s2=s3=0;//channel 0
P0=0xff;//input
oe=0;
st=0;
st=1;//清0
st=0;//启动
ad_0809=out;
display();
}
}
void EXINTO(void) interrupt 0
{EA=0;
EX0=0;
oe=1;
out=P0;
oe=0;
EA=1;
EX0=1;
}
void delaynms(unit x)
{ while(x-->0)
{
unsigned char k;
for(k=10;k>0;k--);
}
}
void display()
{ //unit a;
ad_data1=(ad_0809*49/25)/100; //the highest bit, 255*49/25=4.99V
ad_data2=(ad_0809*49/25)/10%10;
ad_data3=(ad_0809*49/25)%100%10;
P1=tab[ad_data3];
P2=0x0b;
delaynms(10);
P2=0xff;
P1=tab[ad_data2];
P2=0x0d;
delaynms(10);
P2=0xff;
P1=tab[ad_data1];
P2=0x0e;
P1_7=1; //共阴极的
delaynms(10);//中断方式延时比较短
P2=0xff;
}
模数转换器适用的最高有效工作时钟频率约为3MHz。最高模数转换速度大约可以达到24微妙。工作时钟的脉冲宽度应不小于166纳秒。</FONT>
<DIV><FONT size=2> 当工作时钟CLK3的脉冲宽度调到125纳秒时,不论频率为何值,得到的转换结果都是错误的。</FONT></DIV>
<DIV><FONT size=2> (1)ADC0809内部带有输出锁存器。可以与AT89S51单片机直接相连。</FONT></DIV>
<DIV><FONT size=2> (2)初始化时,使ST和OE信号全为低电平。</FONT></DIV>
<DIV><FONT size=2> (3)送要转换的那一通道的地址到A、B、C端口上。</FONT></DIV>
<DIV><FONT size=2> (4)在ST端给出一个至少有100纳秒的宽的正脉冲信号。</FONT></DIV>
<DIV><FONT size=2> (5)是否转换完毕,根据EOC信号来判断。</FONT></DIV>
<DIV><FONT size=2> (6)当EOC变为高电平时,这时给OE为高电平,转换的数据就会给单片机了<
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -