进行c语言编程,以AT89C51单片机为核心,ADC0808为AD转换器,采用中断方式,对0~5V的模拟电压进行循环采集,采集的数据送LED数码管显示,并存入内存,超过5V界限指示灯闪烁
时间: 2024-06-11 10:07:51 浏览: 130
at89c51与ad0808实现电压采集
4星 · 用户满意度95%
本题需要对AT89C51单片机进行编程,实现ADC0808的采集、LED数码管的显示和内存存储功能,并在超过5V界限时闪烁指示灯。具体实现步骤如下:
1. 确定ADC0808的工作方式和连接方式。ADC0808是一款8位串行输出的AD转换器,具有8个输入通道和单端或差分方式的输入。在本题中,需要将ADC0808的VCC和GND分别接到单片机的5V和GND,将CLK、CS和INTE分别接到单片机的P3.5、P3.4和P3.3,将A、B、C和OUT分别接到单片机的P1.0~P1.7。ADC0808的工作流程如下:
(1) 通过CS引脚使能ADC0808;
(2) 根据需要设置A、B、C引脚,选择要转换的通道;
(3) 通过CLK引脚提供时钟信号,开始转换;
(4) 当转换完成时,ADC0808通过OUT引脚输出转换结果;
(5) 通过INTE引脚产生中断请求,通知单片机转换完成。
2. 初始化单片机和ADC0808。在程序中需要先进行相关的初始化设置,包括中断向量表、端口方向、计时器、ADC0808的工作模式等。
3. 编写中断服务程序。当ADC0808完成一次转换后,会产生中断请求,单片机需要在中断服务程序中对转换结果进行处理。具体步骤如下:
(1) 读取ADC0808的转换结果,并将其保存到变量中;
(2) 将转换结果转换为LED数码管显示的格式;
(3) 将转换结果存入内存;
(4) 判断转换结果是否超过5V界限,如果超过则闪烁指示灯。
4. 主程序循环采集。在主程序中需要不断循环采集ADC0808的转换结果,并将其显示在LED数码管上,周期性地进行内存存储。
下面是一份可能的代码实现,供参考:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit INTE = P3^3; // ADC0808中断请求引脚
sbit CS = P3^4; // ADC0808片选引脚
sbit CLK = P3^5; // ADC0808时钟引脚
sbit LED = P2^0; // 超过5V界限指示灯
sbit D1 = P2^1; // LED数码管位选引脚
sbit D2 = P2^2; // LED数码管段选引脚
uchar code Table[] = { // 数码管显示表
0x3F, 0x06, 0x5B, 0x4F,
0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C,
0x39, 0x5E, 0x79, 0x71
};
uchar ADC_Value; // ADC0808转换结果
uint Count; // 计数器,用于定时存储
uchar Memory[256]; // 存储数组,用于存储转换结果
void Timer0_Init() // 定时器0初始化函数
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时1ms
TL0 = 0x66;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void ADC_Init() // ADC0808初始化函数
{
CS = 1; // 禁止ADC0808
INTE = 0; // 禁止ADC0808中断
CLK = 0; // 初始化时钟引脚
}
void ADC_Start() // 启动一次ADC转换
{
CS = 0; // 使能ADC0808
CLK = 1; // 提供时钟信号
CLK = 0;
CS = 1; // 禁止ADC0808
}
void ADC_ISR() interrupt 0 // ADC0808中断服务程序
{
ADC_Value = P1; // 读取ADC0808转换结果
D1 = 0; // 数码管位选
D2 = Table[ADC_Value >> 4]; // 数码管段选
D1 = 1;
D1 = 0;
D2 = Table[ADC_Value & 0x0F];
D1 = 1;
Memory[Count++] = ADC_Value; // 存储转换结果
if (ADC_Value > 0xAF) // 判断超过5V界限
{
LED = ~LED; // 闪烁指示灯
}
ADC_Start(); // 启动下一次转换
}
void main()
{
Timer0_Init(); // 定时器0初始化
ADC_Init(); // ADC0808初始化
EA = 1; // 允许中断
while (1)
{
if (Count == 256) // 定时存储
{
Count = 0;
// 存储Memory数组
}
}
}
```
阅读全文