02- 模块化编程-001 ADC采样与显示

        周末把单片机的开发环境理顺了,开始模块化编程的实践,先从外围模块开始,先从独立的模块,然后构建复杂一些的综合应用,条件所限,以protues的仿真为主。

1、单片机内置ADC采样与显示电路

2、电路原理简介

该电路主要由单片机(PIC16F877A)、74HC573锁存器和四位七段数码管组成,下面是它的工作原理详细介绍:

1. 系统整体结构

  • 单片机 (U1):负责控制整个电路的工作,读取输入信号并控制输出。
  • 锁存器 (U2, U3):使用74HC573作为数据锁存器,可以缓冲单片机发出的数据,确保稳定输出到数码管。
  • 七段数码管:用于显示数字或字母,通过控制相应的段点亮来显示信息。

2. 电源和基础元件

  • 电源:电路通过提供+5V的电源来工作,接地是重要的参考点。
  • 电阻器 (R2, R5, R8, R9, R10):电阻的作用包括偏置电流、限流等,确保整个电路工作在合理范围内。
  • 电容器 (C3):用来滤波,稳定电源电压,减少干扰。

3. 工作流程

  1. 初始化

    • 单片机启动后,进行自检和初始化,配置I/O端口及其他工作参数。
  2. 数据处理

    • 单片机从外部传感器或其他输入源获取数据,并进行处理。
    • 数据经过逻辑运算后,由单片机控制锁存器(74HC573)的使能端(LE)。
  3. 数据锁存

    • 当使能信号(LE)为高时,锁存器将单片机的数据输入锁存,即使得数据输入保持不变。
    • 锁存器的输出将连接至七段数码管相应的段,从而控制其显示。
  4. 显示输出

    • 七段数码管的各个段通过锁存器的输出控制,显示所需的数字或字母。每个数码管的各个段由相应的输出信号控制,形成完整的显示结果。

3、软件代码

//********************************************************************
//*  文件名:main.c
//*  文件描述:基于PIC单片机的数码管显示A/D转换结果程序
//*  编译环境: Windows XP + MPLAB IDE 8.83 + Picc 9.60
//*  编程者: bianjingyuan
//*  编程日期: 2024-10-30
//*  版本号:1.0
//*  修改记录:无
//*  硬件资源分配表:
//*  端口:   RC0 - DUAN
//*           RC1 - WEI
//********************************************************************
#include "pic.h"// 定义数据引脚
#define DUAN RC0     // 数码管的十位引脚
#define WEI  RC1     // 数码管的位选引脚// 配置字设置
__CONFIG (0X3B31);// 函数声明
void delay(unsigned int x); // 延时函数
void display(unsigned char duan, unsigned char wei); // 显示数字
int get_advalue(); // 获取A/D转换值
void inital(); // 初始化系统配置// 数码管编码表
const char dua_table[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 不带点数码管编码 0~9
const char ddua_table[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; // 带点数码管编码 0~9
const char wei_array[] = {0x01, 0x02, 0x04, 0x08}; // 位选编码// 中断标志
bit AD_FLAG;void main()
{volatile long int tmp;  // 用于存储A/D转换的临时值int advalue;unsigned char digits[4]; // 存储千位、百位、十位和个位unsigned char i;inital();  // 初始化系统ADIE = 1;  // 使能A/D中断PEIE = 1;  // 使能外围中断GIE = 1;   // 使能全局中断ADGO = 1;  // 开始A/D转换// 等待中断标志AD_FLAG被置位while (!AD_FLAG);  // 等待A/D转换完成tmp = get_advalue();  // 读取A/D转换结果advalue = (tmp * 500) >> 10;  // 将AD值转换为相应值// 按位分离,存储到digits数组中digits[0] = advalue / 1000;   // 千位digits[1] = (advalue / 100) % 10; // 百位digits[2] = (advalue / 10) % 10;  // 十位digits[3] = advalue % 10;      // 个位// 显示结果for ( i = 0; i < 4; i++) {display(digits[i], i + 1); // 显示各位数}       
}/********************************************************************** 函 数 名: delay* 功能描述: 控制延时函数* 函数说明: 通过嵌套循环实现延时* 调用函数: 无* 全局变量: 无* 输    入: unsigned int x - 延时循环次数* 返    回: 无* 设 计 者:bianjingyuan                         日期:2024-10-30* 修 改 者:bianjingyuan                         日期:2024-10-30* 版    本:**********************************************************************/
void delay(unsigned int x)
{unsigned char b; while(x--){for (b = 0; b < 18; b++);  // 控制延时}
}/********************************************************************** 函 数 名: display* 功能描述: 显示数字到数码管* 函数说明: 选择带点或不带点的数码管进行显示* 调用函数: delay()* 全局变量: DUAN, WEI* 输    入: unsigned char duan - 数码管要显示的数字*           unsigned char wei - 数码管的位选* 返    回: 无* 设 计 者:bianjingyuan                         日期:2024-10-30* 修 改 者:bianjingyuan                         日期:2024-10-30* 版    本:**********************************************************************/
void display(unsigned char duan, unsigned char wei)
{if (wei == 2)PORTB = ddua_table[duan];  // 显示带点数码管elsePORTB = dua_table[duan];    // 显示不带点数码管 DUAN = 1;                  // 使能DUADUAN = 0;                  // 关闭DUAPORTB = wei_array[wei - 1]; // 设置当前位选WEI = 1;                  // 使能WEIWEI = 0;                  // 关闭WEIdelay(40);                // 延时PORTB = 0;                // 关闭数码管显示WEI = 1;                  // 使能WEIWEI = 0;                  // 关闭WEI
}/********************************************************************** 函 数 名: get_advalue* 功能描述: 读取A/D转换结果* 函数说明: 从高位和低位合并读取A/D值* 调用函数: 无* 全局变量: AD_FLAG* 输    入: 无* 返    回: int - 返回读取的A/D值* 设 计 者:bianjingyuan                         日期:2024-10-30* 修 改 者:bianjingyuan                         日期:2024-10-30* 版    本:**********************************************************************/
int get_advalue()
{unsigned char low;int temp;temp = ADRESH;            // 读取高位low = ADRESL;             // 读取低位AD_FLAG = 0;              // 清除A/D标志return (temp << 8) | low; // 返回合并的A/D值
}/********************************************************************** 函 数 名: get_ad* 功能描述: A/D转换中断服务程序* 函数说明: 检查A/D中断标志并清除标志* 调用函数: 无* 全局变量: AD_FLAG* 输    入: 无* 返    回: 无* 设 计 者:bianjingyuan                         日期:2024-10-30* 修 改 者:bianjingyuan                         日期:2024-10-30* 版    本:**********************************************************************/
void interrupt get_ad()
{if (ADIF)  // 检查A/D中断标志{    ADIF = 0;  // 清除中断标志AD_FLAG = 1;  // 设置A/D标志}
}/********************************************************************** 函 数 名: inital* 功能描述: 初始化系统设置* 函数说明: 设置各个端口的输入输出状态等初始化操作* 调用函数: 无* 全局变量: 无* 输    入: 无* 返    回: 无* 设 计 者:bianjingyuan                         日期:2024-10-30* 修 改 者:bianjingyuan                         日期:2024-10-30* 版    本:**********************************************************************/
void inital()
{TRISA |= 0x01;  // 设置RA0为输入TRISB = 0x00;    // 设置PORTB为输出TRISC = 0x00;    // 设置PORTC为输出PORTB = 0;       // 清空PORTBPORTC = 0;       // 清空PORTC   INTCON = 0;      // 清除中断控制寄存器PIE1 = 0;        // 清除外部中断ADCON1 = 0x8E;   // 配置ADC参考电压和通道ADCON0 = 0x41;   // 使能A/D转换
}

4、代码解析

        该程序的主要功能是基于PIC单片机进行A/D转换,并将转换结果通过数码管显示出来。代码实现了以下主要功能:

  1. 初始化PIC单片机的相关外设和端口。
  2. 通过A/D转换功能采集模拟量输入。
  3. 执行A/D转换操作,并在转换完成后通过中断获取转换结果。
  4. 将A/D转换的结果进行数值处理,转换为实际数值。
  5. 将处理后的数值分离为千位、百位、十位和个位,通过数码管显示出来。

软件流程图:

+------------------------+
|        Start              |
+------------------------+
          |
+------------------------+
|      Initialize        |
+------------------------+
          |
+------------------------+
| Enable A/D Interrupts  |
+------------------------+
          |
+------------------------+
|    Start A/D Convert   |
+------------------------+
          |
+------------------------+
|    Wait for A/D Flag   |
+------------------------+
          |
+------------------------+
|       Read A/D Result  |
+------------------------+
          |
+------------------------+
|  Convert Result to Digits |
+------------------------+
          |
+------------------------+
|     Display on 7-Seg   |
+------------------------+
          |
+------------------------+
|        End             |
+------------------------+
 

5、硬件资源分配表

序号单片机引脚功能定义字符串替代定义功能内容备注
1RC0DUAN-数码管的十位引脚连接数码管
2RC1WEI-数码管的位选引脚连接数码管
3PORTB--数码管显示数据总线连接数码管输出

        基于上述硬件资源分配表,该程序实现了以下主要功能:

  1. 通过A/D转换采集模拟量。
  2. 将A/D转换结果转换为实际数值。
  3. 通过数码管显示转换后的数值。

6、仿真运行结果

 

 

 

 

相关资料:

时钟芯片DS1302及其在数据记录中的应用.pdf

https://pan.baidu.com/s/1uEe3L3PMw6rt3lIgTAqL0A?pwd=88c8 

DS1302时钟.ppt

百度网盘 请输入提取码

基于STC89C52单片机DS1302时钟芯片定时开关的设计与仿真.pdf

 百度网盘 请输入提取码

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode设置系统界面字体

现象&#xff1a; 系统界面字体太大&#xff0c;导致菜单栏字体显示不全&#xff0c;每次使用都要先点然后才能打开终端和帮助 缩小字体应该就可以实现全部都看到的效果 解决步骤 1. “齿轮形状”设置中心---->设置 2.输入zoom 3.用户—>窗口—>修改“Window: Zoom…

C++初阶——类和对象(上)

目录 1、类的定义 1.1 类定义格式 1.2 访问限定符 1.3 类域 2、类的实例化 2.1 实例化的概念 3、this指针 1、类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。…

小北的字节跳动青训营与LangChain系统安装和快速入门学习(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

卷积神经网络实验三:模型优化(1)

作者有话说&#xff1a; 这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试&#xff0c;虽然接触深度学习有一年了&#xff0c;但是对于模型的优化仅仅是局限于理论上。通过这一次的实验&#xff0c;我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问…

信息安全数学基础(42)分式域

一、定义 设R是一个整环&#xff0c;如果有一个域F使得从R到F有一个单的环同态&#xff0c;并且F中的每一个元素都可以表示成σ(a)σ(b)^(-1)的形式&#xff0c;其中a∈R&#xff0c;b∈R*&#xff08;R的非零元构成的乘法群&#xff09;&#xff0c;那么把F称为R的分式域。 二…

HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构

文章目录 什么是 HTML &#xff1f;HTML 的构成 &#xff1f;什么是 HTML 元素&#xff1f;HTML 元素的组成部分HTML 元素的特点 HTML 基本文档结构如何打开新建的 HTML 文件代码查看 什么是 HTML &#xff1f; HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup L…

文本列的性能优化?深入Oracle全文索引

一.什么是全文索引&#xff1f; 全文索引通过分析和处理文本&#xff0c;将文档中的单词分解为词条&#xff08;tokens&#xff09;&#xff0c;然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录&#xff0c;而不必对所有文本逐字匹配。 二…

CentOS7配置静态IP(非解决方法指导,纯笨蛋记录)

一、这篇博客算是记录我终于解决我安装的虚拟机ping不通外网的问题&#xff0c;前前后后我尝试了很多次花了很多时间&#xff0c;最后弄完发现其实都是因为我之前根本不知道什么是虚拟机的网络配置。。。。。 这个链接介绍了vmware虚拟机三种网络模式及配置详解_vmware 特定虚…

数据丢失不用愁!10款必备的数据恢复软件全介绍

现在我们使用微信的频率愈发高涨&#xff0c;不论是生活、工作&#xff0c;甚至是兴趣还好可能都能在这个软件里看到身影。正因为它涉及了我们的生活如果因为病毒或者其他原因导致聊天记录清空&#xff0c;对很多人来说都很麻烦。那么微信聊天记录删了怎样才能恢复呢&#xff0…

国内版Sketchfab平台 - CG美术之家(3D编辑发布篇)

CG美术之家为您提供了一个简便的模型上传流程&#xff0c;让发布您的3D模型变得轻而易举。只需准备好通用的3D模型格式&#xff0c;如OBJ、FBX或STL&#xff0c;您就可以轻松上传并分享您的创作。我们的平台支持在线3D渲染&#xff0c;您只需花费不到一分钟的时间&#xff0c;就…

安防被动红外和主动红外

被动红外探测器是依靠被动的吸收热能动物活动时身体散发出的红外热能进行报警的&#xff0c;也称热释红外探头&#xff0c;其探测器本身是不会发射红外线的。 被动红外探测器中有2个关键性元件&#xff0c;一个是菲涅尔透镜&#xff0c;另一个是热释电传感器。**自然界中任何高…

使用Flask构建RESTful API

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Flask构建RESTful API Flask简介 环境搭建 安装Flask 项目结构 创建应用 路由定义 请求处理 获取查询参数 获取请求体 响应…

知识竞赛活动选手台桌怎么摆放好

知识竞赛活动选手台桌摆放主要根据选手台桌、舞台及和竞赛规则决定&#xff0c;一般有以下几种方案。 一、一字摆放 如果舞台宽度不够&#xff0c;就一字摆放。这样选手就无法看到大屏&#xff0c;选手就要配置看题平板或电脑。也可以在选手前面放置一台大电视。如图&#xf…

SQL之排名窗口函数RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)

现有一张student 表&#xff0c;表中包含id、uname、age、score 四个字段&#xff0c;如下所示&#xff1a; 该表的数据如下所示&#xff1a; 一、ROW_NUMBER() 1、概念 ROW_NUMBER() 为结果集中的每一行分配一个唯一的连续整数&#xff0c;编号从 1 开始。‌ 该函数按照指…

NeurIPS - Ariel Data Challenge 2024

1比赛概述 Ariel数据挑战2024 邀请参赛者开发机器学习模型&#xff0c;解决天文学领域中的一项重大挑战——从即将到来的欧洲航天局&#xff08;ESA&#xff09;Ariel任务的模拟观测中提取微弱的系外行星信号。Ariel任务计划于2029年启动&#xff0c;旨在对银河系邻近的约1,00…

Javaweb 实验4 xml

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验四 XML 目的&#xff1a; 安装和使用XML的开发环境认识XML的不同类型掌握XML文档的基本语法了解D…

CRON组件一个复杂的一个简单的

CRON组件一个复杂的一个简单的 一个是复杂点的一个是简单点。 1.以简单的为例使用&#xff1a; 父组件 import CronSimple from "/views/xxx/components/cron-simple/index.vue";components: {CronSimple}<el-dialog title"调度CRON"v-if"cronV…

乒乓球烧拍日记之三蝴蝶蓝芳碳

朋友给了我个蝴蝶成品拍&#xff0c;要更换胶皮&#xff0c;底板是蓝芳碳磕碰很严重&#xff0c;木材都没了&#xff0c;没法补。淋巴面材&#xff0c;成品拍胶水很牢固非常难去除 把蓝芳碳纤维去除下毛边&#xff0c;然后用乳胶胶水填补缺失部分。(https://img-blog.csdnimg.…

高德地图如何标注店铺名称和位置信息?

在当今数字化和信息化的市场环境中&#xff0c;商家不仅需要提供优质的商品和服务&#xff0c;还需要通过多种方式来提升店铺的线上可见度和顾客体验。其中&#xff0c;在地图上准确标注店铺名称和位置信息已成为商家不可忽视的重要环节。而高德地图作为国内领先的导航和位置服…

构建品牌影响力:知识库工具在市场营销中的创新应用

在当今这个信息爆炸的时代&#xff0c;品牌影响力成为了企业市场竞争力的核心要素。为了有效提升品牌影响力&#xff0c;企业不仅需要精准的市场定位和优质的产品服务&#xff0c;还需要借助高效、智能的知识库工具来优化其市场营销策略。本文将探讨知识库工具在市场营销中的创…