设计51单片机和ADC0809 的接口,使用中断方式顺序采集八路模拟量,依次存入地址为20~27H的内部RAM中,循环往复,不断采集。 Proteus
时间: 2023-06-18 19:07:05 浏览: 118
首先,将ADC0809与51单片机接口连接。ADC0809的引脚1和引脚20接地,引脚2接入5V电源,引脚3接51单片机的P1.0引脚,引脚4接51单片机的P1.1引脚,引脚5接51单片机的P1.2引脚,引脚6接51单片机的P1.3引脚,引脚7接51单片机的P1.4引脚,引脚8接51单片机的P1.5引脚,引脚9接51单片机的P1.6引脚,引脚10接51单片机的P1.7引脚,引脚11接51单片机的P3.0引脚,引脚12接51单片机的P3.1引脚,引脚13接51单片机的P3.2引脚,引脚14接51单片机的P3.3引脚,引脚15接51单片机的P3.4引脚,引脚16接51单片机的P3.5引脚,引脚17接51单片机的P3.6引脚,引脚18接51单片机的P3.7引脚,引脚19接5V电源。
其次,编写51单片机的程序。程序的主要思路是使用中断方式顺序采集八路模拟量,依次存入地址为20~27H的内部RAM中,循环往复,不断采集。
具体实现方法如下:
1. 定义ADC0809所用的P1口和P3口的IO口地址。
2. 定义ADC0809所用的控制字节。
3. 定义RAM的起始地址。
4. 定义采样计数器。
5. 定义中断服务程序,用于依次采集八路模拟量并存入内部RAM中。
6. 在主程序中初始化ADC0809、RAM、计数器,并开启中断。
7. 进入死循环。
完整代码如下:
```c
#include <reg51.h>
// 定义ADC0809所用的P1口和P3口的IO口地址
#define ADC0809_PORT P1
#define CONTROL_PORT P3
// 定义ADC0809所用的控制字节
#define CONTROL_BYTE 0x80
// 定义RAM的起始地址
#define RAM_ADDRESS 0x20
// 定义采样计数器
unsigned char count = 0;
// 中断服务程序,用于依次采集八路模拟量并存入内部RAM中
void ADC_ISR() interrupt 0
{
// 发送控制字节,选择对应的模拟输入通道
CONTROL_PORT = CONTROL_BYTE | count;
// 等待转换完成
while ((ADC0809_PORT & 0x80) == 0);
// 读取转换结果并存入内部RAM中
*((unsigned char xdata *)(RAM_ADDRESS + count)) = ADC0809_PORT;
// 更新计数器
count = (count + 1) % 8;
}
void main()
{
// 初始化ADC0809
ADC0809_PORT = 0xFF;
// 初始化RAM
*((unsigned char xdata *)RAM_ADDRESS) = 0;
// 初始化计数器
count = 0;
// 开启中断
EA = 1;
ET0 = 1;
// 定时器0初始化,用于产生中断
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x66;
TR0 = 1;
// 进入死循环
while (1);
}
```
最后,在Proteus中进行仿真,可以通过示波器查看模拟量的波形。
阅读全文