该实验测in3一路的模拟量
仅共学习参考
主程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//各数字的数码管段码(共阴)
uchar code
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit CLK=P1^3; //时钟信号
sbit ST=P1^2; //启动信号
sbit EOC=P1^1; //转换结束信号
sbit OE=P1^0; //输出使能
//延时
void DelayMS(uint ms)
{
uchar
i;
while(ms--)
for(i=0;i<120;i++);
}
//显示转换结果
void Display_Result(uchar d)
{
P2=0xf7; //第4个数码管显示个位数
P0=DSY_CODE[d%10];
DelayMS(5);
P2=0xfb; //第3个数码管显示十位数
P0=DSY_CODE[d%100/10];
DelayMS(5);
P2=0xfd; //第2个数码管显示百位数
P0=DSY_CODE[d/100];
DelayMS(5);
}
//主程序
void main()
{
TMOD=0x02; //T0工作模式2(自动重载8位定时器/计数器)
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
P1=0x3f; //选择ADC0809的通道3(011)(P1.4~P1.6)
while(1)
{
ST=0;ST=1;ST=0; //启动A/D转换
while(EOC==0); //等待转换完成
OE=1;
Display_Result(P3);
OE=0;
}
}
//T0定时器中断给ADC0808提供时钟信号
void Timer0_INT() interrupt 1
{
CLK=~CLK;
}
ADC0809介绍
- LOCK:时种信号。ADC0809内部没有时钟电路,需由外部提供时钟脉冲信号。一般为500KHz。
//T0定时器中断给ADC0808提供时钟信号
void Timer0_INT() interrupt 1
{
CLK=~CLK;
}
//每个时钟脉冲就发生一次中断。c51基本上也就一直忙着中断处理了。中断太频繁,占资源
- IN0-IN7:模拟量输入通道。
- D0-D7:数据输出口。
- ADDA-C:地址线(通道)。
工作过程(借鉴大佬的,建议去阅读大佬的)
①在IN0-IN7上可分别接上要测量转换的8路模拟量信号。有人问了,可不可以只接一路?我就只想测一个模拟信号。当然可了,能挑一百斤的担子,让你只挑十斤那还不小菜。废话太多。。STOP。
②将ADDA-ADDC端给上代表选择测量通道的代码。如000(B)则代表通道0;001(B)代表通道1;111则代表通道7。
③将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后被选中的通道的模拟量送给内部转换单元。
④给START一个正脉冲。当上升沿时,所有内部寄存器清零。下降沿时,开始进行A/D转换;在转换期间,START保持低电平。
⑤EOC为转换结束信号。在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换工作结束。否则,表明正在进行A/D转换。
⑥当A/D转换结束后,将OE设置为1,这时D0-D7的数据便可以读取了。OE=0,D0-D7输出端为高阻态,OE=1,D0-D7端输出转换的数据。
————————————————
版权声明:本文为CSDN博主「少占鱼-正定」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ssou_1985/article/details/12973887