02- 模块化编程-006 ADC0808数码显示对比
1、ADC0808 芯片介绍
ADC0808是一款集成的CMOS设备,包含8位模拟至数字转换器、8通道多路复用器和与微处理器兼容的控制逻辑。8位A/D转换器采用逐次逼近作为转换技术。转换器特点包括高阻抗斩波稳定比较器、256R电压分压器、模拟开关树和逐次逼近寄存器。8通道多路复用器可以直接访问8个单端模拟信号。
该设备消除了外部零点和满量程调整的需要。通过锁存和解码的多路复用器地址输入以及锁存的TTL TRI-STATE®输出,提供了与微处理器的简易接口。
ADC0808的设计通过结合几种A/D转换技术的最理想方面进行了优化。ADC0808和ADC0809提供高速、高精度、温度依赖性小、长期精度和重复性极佳,并且功耗极低。这些特点使得该设备非常适合从过程和机器控制到消费和汽车应用的应用。
特点
-
易于与所有微处理器接口
-
可以比率计量操作或使用5 Vpc或模拟跨度调整的电压参考
-
不需要零点或满量程调整
-
8通道多路复用器,带地址逻辑
-
输入范围0V至5V,单5V电源供电
引脚定义
IN0~IN7:8路模拟量输入端。
D0~D7:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。
ALE:地址锁存允许信号,输入,高电平有效。
START:A/D转换启动信号,输入,高电平有效。
EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。
OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ. REF+、REF-:基准电压输入端。
时序图

典型电路

2、仿真电路

电路中,12位的max1241和adc0808电压采样结果形成对比,红色数码管显示的是 adc0808,蓝色数码管显示的是max1241的采样结果,结果表明,两者误差相差10倍以上。
3、软件代码
ADC0808.c
/********************************************************************** 模块名称: Adc0808.h* 模块名:ADC0808控制模块* 功能描述: 该模块定义了与ADC0808进行通信所需的宏和函数原型* 创 建 人:bianjingyuan * 日期:2024-10-30* 编译环境:Windows XP + MPLAB IDE 8.83 + Picc 9.60* 版本号:1.0* 修改记录:*********************************************************************/
// 数据类型定义
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define nop asm("NOP")
#define sleep asm("sleep")
//**************************新增模块的相关定义**********************************/
// 定义0808通信端口
/*解析:
START、EOC 和 OE 是用于0808通信的端口信号。
TRISD3 = 0 配置RD3为输出,表示在代码中START信号将由微控制器驱动。
TRISD4 = 1 配置RD4为输入,表示在代码中EOC信号为微控制器从外部设备读取的信号。
TRISA0 = 0 配置RA0为输出,表示在代码中OE信号将由微控制器驱动。
*/
#define START RD3 // RD3作为输出
#define EOC RD4 // RD4作为输入
#define OE RA0 // RA0作为输出// 宏定义 - 这里定义了PORTC为某个特定的硬件寄存器
#define ADC_DATA_PORT PORTC//**************************本模块的函数定义**********************************/
uchar ad_result=0;
extern void delayus(uchar a);// 延时10us最准
/********************************************************************** 函数名: Adc0808_Read* 功能描述: 读取ADC0808的转换结果* 调用函数: delayus()* 全局变量: ad_result, START, EOC, OE* 输 入: 无* 返 回: ADC转换结果(无符号字符)*********************************************************************/
uchar Adc0808_Read(void)
{// 首先是START信号,由低变高再变低START = 0;START = 1; // 清空ADC0808的内部寄存器值delayus(10);START = 0; // 下降沿开始AD转换// 然后看EOC信号,由高到低while (EOC == 0); // 等待EOC信号为0,表示转换完成// OUTPUT ENABLE(OE)信号变高,然后读取输出信号OE = 1; // 使能输出ad_result = ADC_DATA_PORT; // 使用宏定义来读取数据OE = 0; // 关闭输出return ad_result; // 返回ADC转换结果
}
main.c
//********************************************************************
//* 文件名:main.c
//* 文件描述:单片机主程序,负责系统初始化和电压显示
//* 编译环境: Windows XP + MPLAB IDE 8.83 + Picc 9.60
//* 编程者: bianjingyuan
//* 编程日期: 2024-11-06
//* 版本号:1.0
//* 修改记录:无
//********************************************************************
void main()
{Initial_System(); // 初始化系统设置ad_init(); // 初始化AD转换功能Set_Port_IO(); // 设置端口IO方向max7219_int(); // 初始化MAX7219显示驱动di(); // 禁用全局中断TRISD0 = 1; // RD0为转换结果输入TRISD4 = 1; // 配置RD4为输入TRISC = 0b11111111; // 配置RC端口为输入max1241_init_io(); // 初始化MAX1241模块add3 = 0; add2 = 0; // 清除显示数据add1 = 0; add0 = 0;redo:counter = 0;for (k = 10; k > 0; k--) // 进行10次采样,以获得5.115V电压基准{max1241_read_io(); // 读取MAX1241转换结果counter = counter + adre_1241; // 累加转换结果}cal_hex(counter >> 3); // 计算结果并转为十六进制send(0x05, add3 + 128); // 发送小数点相关数据,用于显示电压send(0x06, add2);send(0x07, add1);send(0x08, add0);counter = 0;for (k = 20; k > 0; k--) // 进行20次采样,以获得ADC0808转换结果{Adc0808_Read(); // 读取ADC0808的转换结果counter = counter + ad_result; // 累加ADC转换结果}cal_hex(counter); // 计算并转为十六进制send(0x01, add3 + 128); // 发送ADC结果send(0x02, add2);send(0x03, add1);send(0x04, add0);delay1s(); // 延时1秒delayms(100); // 延时100毫秒delayus(10); // 延时10微秒delay1s(); // 再次延时1秒goto redo; // 循环返回到redo标签
}
4、代码解析
该代码实现了对 ADC0808 的控制与数据读取。ADC0808 是一种8位模数转换器,具有8通道的多路复用输入。代码通过定义宏、设置引脚以及实现读取函数,实现与 ADC0808 的通信。模块的主要功能包括:
-
定义数据类型及控制信号:
- 使用宏定义了一些常用的数据类型缩写及控制信号,如
START、EOC和OE,分别用于启动转换、检测转换结束和使能数据输出。 - 定义
ADC_DATA_PORT为数据读取端口。
- 使用宏定义了一些常用的数据类型缩写及控制信号,如
-
读取转换结果:
Adc0808_Read()函数用于执行模数转换并读取转换结果。通过控制引脚信号顺序,实现对 ADC0808 的启动、转换完成检测,以及数据读取。
5、硬件资源分配表
| 序号 | 引脚 | 类别 | 方向 | 功能定义 | 功能内容 | 相关寄存器及配置 |
|---|---|---|---|---|---|---|
| 1 | RD3 | 数字IO | 输出 | START | 启动信号 | TRISD3 = 0 |
| 2 | RD4 | 数字IO | 输入 | EOC | 转换完成信号 | TRISD4 = 1 |
| 3 | RA0 | 数字IO | 输出 | OE | 输出使能信号 | TRISA0 = 0 |
| 4 | PORTC | 数据端口 | 输入 | ADC_DATA_PORT | 读取ADC数据 | 数据端口(PORTC) |
6、软件流程图

在这个流程图中:
- 启动ADC转换过程:流程的起点,开始ADC的转换过程。
- 设置START信号由低变高再变低:设置ADC的START信号,通常是一个脉冲信号,用于启动ADC转换。
- 等待EOC信号变高:等待转换结束信号EOC(End of Conversion)变为高电平,表示转换完成。
- 使能输出(OE)读取转换结果:使能输出使能信号(OE),准备读取转换结果。
7、仿真运行结果



相关文章:
02- 模块化编程-006 ADC0808数码显示对比
1、ADC0808 芯片介绍 ADC0808是一款集成的CMOS设备,包含8位模拟至数字转换器、8通道多路复用器和与微处理器兼容的控制逻辑。8位A/D转换器采用逐次逼近作为转换技术。转换器特点包括高阻抗斩波稳定比较器、256R电压分压器、模拟开关树和逐次逼近寄存器。8通道多路复…...
又发现了Mac妙控鼠标的新使用方法
我一直是不爱用妙控鼠标的,因为用起来怪怪的,但是今天发现BettreAndBetter支持妙控鼠标的修改,于是就找出了闲置了许久的妙控鼠标试了一下 优化后的妙控鼠标使用起来就没有任何不适应的地方了,三指按下模拟中键,而且还…...
Webserver(4.6)poll和epoll
目录 pollclient.cpoll.c epollepoll.cclient.c epoll的两种工作模式水平触发边沿触发 poll poll是对select的一个改进 select的缺点在于每次都需要将fd集合从用户态拷贝到内核态,开销很大。每次调用select都需要在内核遍历传递进来的所有fd,这个开销也…...
LVGL 与 QT
LVGL 与 QT LVGL 适用于嵌入式、资源受限设备,尤其是在需要高效图形渲染和小型显示屏的场景下非常合适。它具有轻量级、模块化的特点,适用于内存和计算能力有限的硬件。 Qt 是一个功能强大的跨平台框架,适合开发桌面应用以及较为复杂的嵌入式…...
如何选择最适合的项目管理软件?2024年大厂首选7款工具盘点
选择最适合的项目管理软件对于提升团队效率、优化工作流程至关重要。2024年,各大厂在项目管理上逐渐趋向于使用更加智能化、集成化和协作性的工具。以下是如何选择最适合的项目管理软件,并对2024年大厂首选工具进行盘点。 选择适合的项目管理软件的关键…...
【数据结构】选择排序——选择排序 和 堆排序
选择排序 和 堆排序 一、选择排序选择排序的思路及其代码选择排序的弊端 二、堆排序三、速度对比同时排10000个数同时排100000个数同时拍500000个数堆排 1 亿个数 一、选择排序 选择排序的思路及其代码 选择排序思路很简单 就是经过将数组遍历选择最小值 将最小值位置的数与数…...
P11229 [CSP-J 2024] 小木棍
[CSP-J 2024] 小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。 现在小 S 希望拼出一个正整数,满足如下条件: 拼出这个数…...
【学习笔记】SAP ABAP——OPEN SQL(一)【SELECT语句】
SELECT语句简介 SELECT <lines> <columns> FROM <db> WHERE <condition>其中代表查询的件数,代表查询的字段名 SELECT SINGLE SELECT SINGLE <cols> FROM <db> WHERE <condition>该语句用于从数据库表中查询单条数据 …...
SQL注入(1)
1.数字型注入 例如PHP代码 “ Select username from users where id”.$_GET[id] 可以注意到,用户的输入ID字段没有任何过滤的,被直接拼接在了SQL查询语句中,由于ID没有被引号包裹ÿ…...
在AI时代,如何解决人的工作岗位被AI替代的问题?
在AI时代,工作岗位被AI替代的问题确实是一个重要的社会课题。随着技术的不断进步,许多传统的工作变得自动化,这带来了效率的提升,但也引发了就业方面的挑战。要应对这一问题,我们可以从以下几方面入手: 促进…...
Linux命令--paste
简介 paste命令用于合并文件行 参数说明 -d: 自定义间隔符,默认为tab -s:串行处理,非并行 示例 将两个文件,按照行合并 demo1.conf内容如下: name domain ip area user password roledemo2.conf内容如下 test t…...
数据结构模拟题[九]
数据结构试卷(九) 一、选择题 (30 分) 1.下列程序段的时间复杂度为( )。 for(i0 ; i<m ; i) for(j0 ; j<t ; j) c[i][j]0 ; for(i0 ; i…...
2024年10月国产数据库大事记-墨天轮
本文为墨天轮社区整理的2024年10月国产数据库大事件和重要产品发布消息。 目录 2024年10月国产数据库大事记 TOP102024年10月国产数据库大事记(时间线)产品/版本发布代表厂商大事记信创数据库上市公司2024年Q3财报 达梦数据:2024年前三季度…...
Andon 业务流程业务开发陷阱----从真实用户与管理者视角逻辑差异
Q : Andon 问题识别归类(就是问题的3层细化),是在事中,还是在事后? A : 不存在事中就细化归类,有悖于生产问题解决流程。 从操作员的角度来看,他们在事中可能只能识别出存在质量问题,但无法进行具体的质量问题编号…...
Python闭包|你应该知道的常见用例(上)
引言 在 Python 编程语言中,闭包通常指的是一个嵌套函数,即在一个函数内部定义的另一个函数。这个嵌套的函数能够访问并保留其外部函数作用域中的变量。这种结构就构成了一个闭包。 闭包在函数式编程语言中非常普遍。在 Python 中,闭包特别有…...
printf影响单片机中断速度
printf是我们常用的调试程序的手段,在第一版程序中,经常会使用printf来验证程序是否工作正确。这样的调试手段应该在正式版的程序发布前注释掉或者删除。而且不当地使用printf也会带来某些功能性问题,例如,在某项目中,…...
JavaScript 23种经典设计模式简介
23种JavaScript经典设计模式 JavaScript经典设计模式 通过之前的学习,我们知道设计模式是一种解决代码组织、代码复用和代码可维护性等问题的技术方法。它通过将代码以特定的方式组织起来,使代码结构更加清晰、可读性更高、易于维护和扩展。为了在开发…...
位运算相关算法
一、异或运算介绍 1、性质介绍 异或运算(XOR,Exclusive OR)是一种位运算符。对于两个位进行异或操作,当且仅当这两个位不同时,结果为 1;如果相同,则结果为 0。 A B A^B00001 1 101110 任何数…...
解决:无法在此设备上激活Windows因为无法连接到你的组织的激活服务器
问题: 桌面右下角会出现这个东西👇 在设置里查看激活状态就会看到👇 解决方法 : 1.打开CMD 搜索CMD,然后以管理员身份运行 2.设置 KMS服务器 1)命令行输入: slmgr /skms kms.03k.org 然后…...
【Spring】——SpringBoot项目创建
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:介绍 二:Spring Boot项目创建 0:项目目录 1:…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

