设计51单片机和ADC0809的接口电路,使用中断方式顺序采集4路模拟量,依次存入内部RAM的4个单元中,循环往复,不断采集。 资源分配: (1)、线选地址线:P2.0 (2)、模拟量:IN4--IN7 (3)、内部RAM地址:44H --47H
时间: 2023-06-23 19:08:04 浏览: 133
以下是51单片机和ADC0809的接口电路设计:
![ADC0809接口电路设计](https://img-blog.csdnimg.cn/20220401173210726.png)
其中,P2.0是线选地址线,用于选择ADC0809的通道;IN4~IN7是4路模拟量输入口;44H~47H是内部RAM地址,用于存储采集到的模拟量数据。
接口电路的实现流程如下:
1. 初始化ADC0809,设置为顺序采集模式,并使能中断。
2. 初始化内部RAM,设置4个单元的起始地址为44H。
3. 配置中断向量,并使能中断。
4. 在主程序中,循环从IN4~IN7采集模拟量数据,并将数据存储到内部RAM的相应单元中。
5. 在中断服务程序中,读取ADC0809的转换结果,并将结果存储到内部RAM的相应单元中。
6. 循环执行步骤4和步骤5,实现不断采集的功能。
具体实现代码如下:
```c
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^4; // ADC0809的片选信号,连接到P1.4口
sbit CLK = P1^3; // ADC0809的时钟信号,连接到P1.3口
sbit DI = P1^5; // ADC0809的数据输入信号,连接到P1.5口
sbit DO = P1^6; // ADC0809的数据输出信号,连接到P1.6口
sbit EOC = P1^7; // ADC0809的转换完成信号,连接到P1.7口
sbit ADDR = P2^0; // ADC0809的地址输入信号,连接到P2.0口
uchar code ADDR_TABLE[] = {0xC4, 0xCC, 0xD4, 0xDC}; // ADC0809的4个通道对应的地址码
uchar volatile RAM_DATA[4] _at_ 0x44; // 内部RAM的起始地址为44H
void delay(uint t)
{
while(t--);
}
void ADC0809_Init()
{
CS = 1;
CLK = 1;
DI = 1;
ADDR = 0;
delay(10);
}
void ADC0809_Start(uchar channel)
{
CS = 0;
ADDR = 1;
DI = ADDR_TABLE[channel];
delay(1);
CLK = 0;
delay(1);
CLK = 1;
delay(1);
ADDR = 0;
delay(1);
CLK = 0;
delay(1);
}
uchar ADC0809_Read()
{
uchar i, data;
data = 0;
for(i=0; i<8; i++)
{
CLK = 0;
delay(1);
data <<= 1;
data |= DO;
CLK = 1;
delay(1);
}
return data;
}
void ADC0809_ISR() interrupt 0
{
static uchar channel = 0;
RAM_DATA[channel] = ADC0809_Read();
channel++;
if(channel >= 4)
{
channel = 0;
}
ADC0809_Start(channel);
}
void main()
{
uchar i;
ADC0809_Init();
for(i=0; i<4; i++)
{
RAM_DATA[i] = 0;
}
EA = 1;
ET0 = 1; // 使能定时器0中断
TR0 = 1; // 启动定时器0
ADC0809_Start(0);
while(1);
}
```
阅读全文