02- 模块化编程-005 MAX1241数码显示
1、MAX1241 芯片介绍
MAX1241 是一款低功耗、12 位串行模数转换器,具有 8 个管脚,工作电压范围为 +2.7~+5.5V。它具有高效的连续 AD 转换能力,最高采样速率可达 73ksps,功耗仅为 37mw(Vdd=3V)。此外,MAX1241 还具有关闭模式,可以降低功耗,但这时传输速率也会降低。
特性
- 单电源供电:
- +2.7V至+3.6V (MAX1240)
- +2.7V至+5.25V (MAX1241)
- 12位分辨率
- 内部2.5V基准电压源(MAX1240)
- 小尺寸:8引脚PDIP/SO封装
- 低功耗:3.7µW(73ksps、MAX1240)
- 3mW(73ksps,MAX1241)
- 66µW(1ksps、MAX1241)
- 5µW(关断模式)
- 内部采样/保持
- SPI/QSPI/MICROWIRE 3线串行接口
- 内部时钟
内部结构
引脚定义
典型电路
应用场景
-
电池供电应用
- 仪器仪表
- 隔离数据采集
- 便携式数据记录
- 过程控制
注意事项
- 在开始加电 20ms 内不要有任何转换工作。
- 将 CS 置低电平后,开始转化。在 CS 的下降沿,采样保持电路进入保持状态,而且转化正式开始,经过一段内部转化时间后,转化结束的标志是 Dout 信号置高。
- 在外部时钟的作用下,数据将依次被传送。在这一操作过程中,需要通过CPU的一个通用I/O接口拉低CS,并保持SCLK在低电平状态。此时,我们需要等待最大转换时间,或者查询DOUT的高电平信号,以判断转换是否已完成。当转换结束后,DOUT的数据输出将在SCLK的下降沿开始。在第13个脉冲时,将CS置为高电平。如果CS继续保持在低电平状态,后续输出的数据将为0。在启动新的转换之前,我们还需等待规定的最小时间tcs,此时CS应保持高电平。
2、仿真电路
3、软件代码
max1241.c
/****************************************************************************
* 文件名:max1241-io.c
* 文件描述:max124的IO模拟时序驱动函数定义
* 创建人:bianjingyuan
* 编程日期:2024-11-05
* 版本号:1.0
* 修改记录:无
****************************************************************************/
#include "pic.h"#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define nop asm("NOP")// 主要引脚的替代
#define dout RC0 // 887引脚输入
#define sclk RC1 // RC1-RC3为887引脚输出
#define cs RC2 // 下降沿启动转换 1-dout呈现高阻
#define SHDN RC3 // 0-器件关闭 1-器件工作// 外部变量引用
extern uint adre_1241;
extern void delayus(uchar a);//*****************************以下为函数和子程序****************************/
//* 名称: max1241_read_io
//* 说明: max1241的IO模拟时序驱动程序
//* 功能: 12位数据AD转换
//* 调用: 无
//* 输入: 无
//* 返回值: adre_1241
//****************************************************************************/
void max1241_read_io() // max1241的IO模拟时序驱动程序
{uchar k;adre_1241 = 0;SHDN = 1; // 使能1241cs = 0; // 开始转换过程,采样保持时间1.5usdelayus(9); // 需要至少7.5us的延时作为转换时间sclk = 1; delayus(1); // 第一个时钟的上升沿无操作sclk = 0; // 时钟周期约6us,fclk必须小于2.1mhzdelayus(1);for (k = 12; k > 0; k--){ sclk = 1; // 从第二个时钟的上升沿开始输出数据delayus(1);adre_1241 |= dout;sclk = 0;delayus(1); adre_1241 <<= 1; // 高位在前移位nop; nop;}adre_1241 >>= 1; // 完成12位数据的移位寄存cs = 1; // 转换终止SHDN = 0; // 关闭1241
}//****************************************************************************/
//* 名称: max1241_init_io
//* 说明: max1241的初始化函数
//* 功能: 单片1241的初始化
//* 调用: send(uchar addres, uchar data);
//* 输入: 无
//* 返回值: 无
//****************************************************************************/
void max1241_init_io()
{ SHDN = 0; // 关闭1241cs = 1; // 转换终止sclk = 0; // 空闲状态为低电平
}
main.c
//* 文件名:main.c
//* 文件描述:单片机主程序,负责系统初始化和电压监测
//* 编译环境: Windows XP + MPLAB IDE 8.83 + Picc 9.60
//* 编程者: bianjingyuan
//* 编程日期: 2024-11-05
//* 版本号:1.0
//* 修改记录:无
//********************************************************************
void main()
{Initial_System(); // 初始化系统设置ad_init();Set_Port_IO(); // 设置端口IO方向max7219_int(); // 初始化MAX7219显示驱动di(); // 禁用全局中断TRISC=1; // RC0为转换结果输入,RC1-RC3为输出max1241_init_io();add3 = 0; add2 = 0; // 显示数据清零add1 = 0; add0 = 0;
redo:counter = 0;for (k = 10; k > 0; k--) // 5.12V电压基准{max1241_read_io();counter = counter + adre_1241;}cal_hex(counter >> 3);// cal_hex(adre_1241);send(0x01, 15);send(0x02, 15);send(0x03, 15);send(0x04, 15);send(0x05, add3 + 128); // 加小数点, X.XXX Vsend(0x06, add2);send(0x07, add1);send(0x08, add0);delay1s();delayms(100); // 延时100毫秒delayus(10); // 延时10微秒delay1s(); // 延时1秒goto redo; // 循环返回到redo标签
}
4、代码解析
该代码主要是用于配置和控制 MAX1241 ADC 的初始化和数据转换。程序通过模拟 SPI 时序控制 MAX1241 的转换过程,并读取转换结果。具体功能包括:
-
初始化 ADC(max1241_init_io):
- 配置为关机模式,设置片选为不选中状态,并将时钟信号置于低电平以节省能耗。
-
读取 ADC 数据(max1241_read_io):
- 启动 ADC 进行模数转换,通过时钟信号同步数据传输。
- 在时钟的上升沿读取数据,将其移位到正确的位置,以得到完整的 12 位结果。
5、硬件资源分配表
序号 | 引脚 | 类别 | 方向 | 功能定义 | 功能内容 | 相关寄存器及配置 |
---|---|---|---|---|---|---|
1 | RC0 | 数字IO | 输入 | dout | 数据输出 | TRISC0 |
2 | RC1 | 数字IO | 输出 | sclk | 时钟信号 | TRISC1 |
3 | RC2 | 数字IO | 输出 | cs | 片选控制 | TRISC2 |
4 | RC3 | 数字IO | 输出 | SHDN | 开关控制 | TRISC3 |
基于上述硬件资源分配表,程序主要实现了以下功能:
- 控制 MAX1241 的开关状态(通过 SHDN 引脚),以降低能耗。
- 使用模拟 SPI 时序,通过 sclk 和 dout 引脚进行数据传输和读取。
- 控制 cs 引脚以启用和禁用 ADC 的转换过程。
- 最终获取 12 位 ADC 转换结果,并将其存储到 adre_1241 变量中。
6、软件流程图
在这个流程图中:
- 开始初始化ADC:流程的起点,开始ADC的初始化过程。
- 关闭ADC并空闲:在初始化之前,确保ADC处于关闭状态,以便进行配置。
- 初始化完成,等待:ADC初始化设置完成后,等待主程序的调用。
- 主程序调用:主程序开始调用ADC转换函数。
- 启动ADC转换过程:根据主程序的调用,启动ADC的转换过程。
- 等待转换完成:等待ADC完成模拟信号到数字信号的转换。
- 通过时钟信号读取12位的ADC数据:转换完成后,通过时钟信号读取ADC转换的结果。
- 完成数据读取并关闭ADC:读取完数据后,关闭ADC以节省能源或为下一次转换做准备。
7、仿真运行结果