登录/注册

at89c52ad采集

更多

好的!针对 AT89C52AD 这款单片机(AT89C52芯片的带模数转换器版本),进行 采集(通常指模拟信号采集) 的基本步骤如下和示例代码:


核心要点:

  1. AT89C52AD 的ADC
    • 具有 8通道、10位精度 的模数转换器 (ADC)。
    • 模拟输入引脚是 P1.0 - P1.7
    • 相关特殊功能寄存器是 ADC_CONTR
  2. 基本流程
    1. 初始化ADC:设置ADC控制寄存器 (ADC_CONTR)。
    2. 选择通道:指定要采集哪个P1.x引脚。
    3. 启动转换:设置ADC_CONTR中的启动位。
    4. 等待转换完成:查询ADC_CONTR中的转换完成标志位 (ADC_FLAG)。
    5. 读取结果:从ADC_RESADC_RESL读取10位转换结果。
    6. 清除标志:清除转换完成标志位。

示例代码 (C语言, 适用于 Keil C51)

#include <reg52.h>   // 包含AT89x52.h 或类似定义寄存器的头文件
#include <intrins.h> // 可能需要用到_nop_()

// 定义ADC_CONTR寄存器位 (具体地址请查阅官方手册,通常为0xC5或0xDE等, 此处为示例地址)
sfr ADC_CONTR = 0xC5; // ADC控制寄存器地址 (根据你的头文件或手册确认!)
sbit EOC = ADC_CONTR^4; // 假设转换完成标志在第4位 (查询法常用)
sbit ADC_START = ADC_CONTR^6; // 假设启动位在第6位
sbit ADC_FLAG = ADC_CONTR^4;  // 假设完成标志位在第4位

sfr ADC_RES = 0xC6;   // ADC结果高8位寄存器地址 (根据手册确认!)
sfr ADC_RESL = 0xC7;  // ADC结果低2位寄存器地址 (根据手册确认!)

#define CH0 0x00      // P1.0 通道
#define CH1 0x01      // P1.1 通道
// ... 定义其他通道 CH2 到 CH7

// 初始化ADC
void Init_ADC() {
    ADC_CONTR = 0x80;    // 示例:打开ADC电源(POWER_ON),设置低速转换,不启动,选择通道0(仅作初始默认值)
    _nop_();             // 延时等待ADC电源稳定 (重要!)
    _nop_();
}

// 读取指定通道ADC值 (10位)
unsigned int Read_ADC(unsigned char ch) {
    unsigned int adc_val;

    ADC_CONTR &= 0xF0;         // 清除之前的通道选择位
    ADC_CONTR |= ch;           // 设置新通道 (低4位选择通道)
    ADC_CONTR |= 0x08;         // 示例:启动转换 (START=1, 具体位请按手册设置)
    // ADC_START = 1;          // 如果已定义 START 位,可用这条

    while (!(ADC_CONTR & 0x10)); // 等待转换完成 (查询 EOC/ADC_FLAG 位为1)
    // while (!ADC_FLAG);        // 如果已定义 ADC_FLAG, 可用这条

    adc_val = ADC_RES;         // 读取高8位
    adc_val <<= 2;             // 左移2位,为低2位腾出空间
    adc_val |= (ADC_RESL & 0x03); // 读取低2位并组合 (假设ADC_RESL低2位有效)

    ADC_CONTR &= ~0x10;        // 清除转换完成标志位 (ADC_FLAG=0)
    // ADC_FLAG = 0;           // 如果已定义 ADC_FLAG, 可用这条

    return adc_val;            // 返回10位ADC值 (0-1023)
}

void main() {
    unsigned int sensorValue;

    Init_ADC();          // 初始化ADC

    while (1) {         // 主循环
        sensorValue = Read_ADC(CH0); // 采集通道0 (P1.0) 的电压
        // 此处可以处理sensorValue (显示、传输、计算等)

        // 简单延时 (实际项目用定时器)
        for (int i = 0; i < 30000; i++);
    }
}

关键说明:

  1. 寄存器地址ADC_CONTR, ADC_RES, ADC_RESL 的具体地址 必须 查阅 AT89C52AD 的 官方数据手册。不同编译器的头文件定义可能不同。
  2. 延时要求
    • 电源稳定:在 Init_ADC() 中打开 ADC 电源后 (ADC_CONTR |= 0x80;),需要插入几个 _nop_(); (空操作) 等待电源稳定(具体时间看手册,通常几个微秒)。
    • 采样时间:在某些应用中,可能需要更精确的采样时间控制。
  3. 通道选择ch 参数应为 0x00 (CH0/P1.0) 到 0x07 (CH7/P1.7)。代码中使用了位操作选择通道。
  4. 启动转换:示例中使用 ADC_CONTR |= 0x08; 启动转换,启动位的具体位置需按手册设置(有时是第6位 START=1)。
  5. 等待完成
    • 示例使用查询法 (while (!(ADC_CONTR & 0x10));) 等待转换完成标志 (ADC_FLAG/EOC)。也可以用中断法,需开启 ADC 中断并编写中断服务程序(ISR)。
    • 标志位的位置 (这里假设是位4,0x10) 需按手册确认。
  6. 读取结果
    • 10 位结果通常分成两个寄存器:ADC_RES (高 8 位) 和 ADC_RESL (低 2 位在低位)。读取后需组合成一个16位整数。
    • ADC_RES 左移 2 位,再和 ADC_RESL 的低 2 位 (& 0x03) 进行 OR 操作。
  7. 清除标志:读取结果后,必须手动清除转换完成标志位 (ADC_CONTR &= ~0x10;ADC_FLAG = 0;) 以便下一次转换。
  8. 时钟设置:ADC 的转换速度和精度与系统时钟频率有关。请参考手册确保设置合理。
  9. 实际应用:示例中只有读取,实际应用中需将采集到的 sensorValue 进行处理(如显示在LCD、通过串口发送、计算实际物理量等)。循环中的 for 延时仅用于演示,实际应用应使用定时器。

? 强烈建议: 务必参考 Microchip/Atmel 官方提供的 AT89C52AD 数据手册(Datasheet) 以获取最准确的寄存器定义、时序要求和电气特性。

您需要我解释哪一部分或帮助实现特定的功能(如串口发送采集值、计算电压值、使用中断方式)吗?

AT89C52:一款经典的8位微控制器

AT89C52:一款经典的8位微控制器 在嵌入式控制应用领域,AT89C52这款8位微控制器凭借其出色的性能和丰富的功能,一直是众多工程师的选择。尽管现在它已不推荐用于新设计(建议使用AT

2026-04-06 09:10:12

AT89C52怎么选择外部存储器?

大家有谁知道AT89C52怎么选择外部存储器,我之前用的是P89V51,选择外部存储器是定义AUXR=0x02;,但是现在想用AT89C52单片

2023-10-26 06:11:25

基于STC89C52单片机的智能交通灯设计

本设计基于STC89C51/52(与AT89S51/52、AT

2023-09-04 09:52:03

基于STC89C52单片机智能小车设计

基于STC89C52单片机智能小车设计方法介绍。

资料下载 姚小熊27 2021-05-28 10:57:46

单片机AT89C52控制的智能小车的设计

单片机AT89C52控制的智能小车的设计方法。

资料下载 姚小熊27 2021-05-27 11:26:23

基于STC89C52RC单片机的智能定时开关电源

基于STC89C52RC单片机的智能定时开关电源

资料下载 佚名 2021-05-25 11:50:31

AT89C52中文数据资料

AT89C52中文数据资料分享。

资料下载 姚小熊27 2021-04-13 10:29:53

单片机89C51与89C52有什么区别

区别如下:1、RAM 空间增大:AT89C51 有128 字节的内部 RAM,AT89C52 的内部 RAM 扩展为 256 字节; 2、内部FLASH变大:AT

资料下载 佚名 2019-07-23 17:37:00

如何利用STC89C52单片机实现多路温度采集系统的设计?

如何利用STC89C52单片机实现多路温度采集系统的设计?

2022-02-17 06:06:23

如何制作一个基于STC89C52单片机的温度采集系统

DS18B20无线测温所做的工作主要包括:1.利用DS18B20 温度传感器采集温度;2.制作一个基于STC89C52 单片机的温度采集系统,并

2021-12-02 08:48:39

STC89C52名字是什么意思呢?

STC89C52单片机,STC89C52STC89C52看到涛哥这篇文章了,纪念一下还在搞嵌入式的我们!硬件实物图实物抽象化的图为:这个STC89C52

2021-12-02 07:43:57

如何解决STC89C52更换为STC89C52RC芯片出现无法烧录的问题?

如何解决STC89C52更换为STC89C52RC芯片出现无法烧录的问题?

2021-10-26 07:03:59

STC89C52/80C52芯片的内部结构是怎样构成的

STC89C52/80C52芯片的内部结构是怎样构成的?STC89C52/80C52

2021-08-20 07:18:15

基于STC89C52RC单片机与MATLAB的PM2.5数据采集系统设计

摘要:本文设计了基于STC89C52RC单片机与MATLAB的PM2.5数据采集系统。通过STC89C52RC单片机与夏普GP2Y1010AUO

2021-07-20 06:12:09

stc89c52rc型号烧不进程序

前几天发现自己的单片机烧不进程序了,芯片是stc89c52rc 40i 的。就把舍友的stc89c52rc 35i 换到自己的单片机上试了下,当时自己的数据线不在身旁,用舍友的数据线,发现是可以烧

2020-03-12 04:35:53
7天热门专题 换一换
相关标签