设计51单片机和ADC0809 的接口电路,使用中断方式顺序采集4路模拟量,依次存入内部RAM的4个单元中,循环往复,不断采集。 资源分配: (1)、线选地址线:P2.0 (2)、 模拟量: IN0---IN3 (3)、内部RAM地址: 48H --4BH 1-2 画出电路 1-3 用C51,编写程序
时间: 2023-06-19 19:04:39 浏览: 60
1-2 画出电路:
![51单片机和ADC0809的接口电路](https://img-blog.csdnimg.cn/2021121415172876.png)
1-3 用C51,编写程序:
```c
#include <reg52.h>
sbit CS = P2^0; // ADC0809片选引脚
sbit OE = P2^1; // ADC0809输出使能引脚
sbit CLK = P2^2; // ADC0809时钟引脚
unsigned char code ADDR[] = {0x48, 0x49, 0x4a, 0x4b}; // 内部RAM地址
unsigned char xdata DATA[4]; // 存放采集到的模拟量数据
unsigned char index = 0; // 当前采集数据的下标
void delay(unsigned int i) // 延时函数
{
unsigned int j, k;
for(j = i; j > 0; j--)
for(k = 125; k > 0; k--);
}
void init_adc0809() // 初始化ADC0809
{
CS = 1; // 禁用片选
OE = 1; // 禁用输出
CLK = 0; // 初始时钟为低电平
}
void start_adc0809(unsigned char addr) // 向ADC0809发送启动转换命令
{
CS = 0; // 使能片选
OE = 0; // 使能输出
P1 = addr; // 发送内部RAM地址
CLK = 1; // 发送启动转换命令
delay(100); // 等待转换结束
CLK = 0; // 停止时钟
OE = 1; // 禁用输出
CS = 1; // 禁用片选
}
void main()
{
unsigned char i;
init_adc0809(); // 初始化ADC0809
while(1)
{
start_adc0809(ADDR[index]); // 启动转换并发送内部RAM地址
DATA[index] = P1; // 读取转换结果并存入DATA数组中
index = (index + 1) % 4; // 更新下标
for(i = 0; i < 4; i++)
P0 = DATA[i]; // 将采集到的4路模拟量数据依次显示在P0口
delay(1000); // 延时1秒
}
}
```
说明:
此程序使用轮询的方式循环采集4路模拟量数据,并依次存入内部RAM的4个单元中,然后将采集到的4路模拟量数据依次显示在P0口。其中,start_adc0809()函数用于向ADC0809发送启动转换命令并读取转换结果,delay()函数用于延时。程序中的数组DATA用于存放采集到的模拟量数据,index变量用于记录当前采集数据的下标。