51单片机实验五:A/D和D/A转换
一、实验环境与实验器材
环境:Keli,STC-ISP烧写软件,Proteus.
器材:TX-1C单片机(STC89C52RC)、电脑。
二、 实验内容及实验步骤
1.A/D转换
概念:模数转换是将连续的模拟信号转换为离散的数字信号的过程。模拟信号是连续的,而数字信号是离散的,ADC 的作用就是对模拟信号进行采样和量化,将其转换为数字形式。
需求:用单片机控制ADC0804进行模数转换,当拧动实验板上A/D旁边的电位器Re2时,在数码管的前三位以十进制方式动态显示出A/D转换的数字量(8位A/D转换后数值在0~255变化)。
代码:
#include "reg52.h" // 52系列单片机头文件
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6; // 申明U1锁存器的锁存端
sbit wela=P2^7; // 申明U2锁存器的锁存端
sbit adwr=P3^6; // 定义A/D的WR端口
sbit adrd=P3^7; // 定义A/D的RD端口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};void delayms(uint xms)
{uint i,j;for(i=xms;i>0;i--) // i=xms即延时约xms毫秒for(j=110;j>0;j--);
}void display(uchar bai,uchar shi,uchar ge) // 显示子函数
{dula=1;P0=table[bai]; // 送段选数据dula=0;P0=0xff; // 送位选数据前关闭所有显示,防止打开位选锁存时wela=1; // 原来段选数据通过位选锁存器造成混乱P0=0x7e; // 送位选数据wela=0;delayms(50); // 延时 dula=1;P0=table[shi]; dula=0;P0=0xff; wela=1; P0=0x7d; wela=0;delayms(50);dula=1;P0=table[ge]; dula=0;P0=0xff; wela=1; P0=0x7b; wela=0;delayms(50);
}void main() // 主程序
{uchar a,A1,A2,A3,adval;wela=1;P0=0x7f; // 置CSAD为0,选通ADCS以后不必再管ADCSwela=0;while(1){adwr=1;_nop_(); // 延时一个机器周期adwr=0;_nop_();adwr=1;for(a=10;a>0;a--) //TX-1C实验班A/D工作频率较低,所以启动转换后//要多留点时间用来转换{ //把显示部分放这里的原因也是为了延长转换时间display(A1,A2,A3);}P1=0xff; //读取P1之前先给其写全1adrd=1; //选通ADCS_nop_();adrd=0; //A/D读使能_nop_();adval=P1;adrd=1;A1=adval/100; //分出百,十和个位A2=adval%100/10;A3=adval%10;}}
图2.1.1 模数转化硬件效果1
图2.1.2 模数转化硬件效果2
Proteus仿真图:
图 2.1.3 模数转换proteus仿真图
因为延时过短原因,数码管一闪一闪显示107,我们可以调节变阻器RV1来使它的值变化
仿真视频:
AD转换
2.D/A转换
概念:数模转换是将离散的数字信号转换为连续的模拟信号的过程。DAC 的作用是将数字信号还原为模拟信号。
要求:用单片机控制DAC0832芯片输出电流,让发光二极管D12由灭均匀变到亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警告一声,完成整个周期时间控制再5s左右,循环变化。
代码:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit dawr=P3^6;
sbit dacs=P3^2;
sbit beep=P2^3;void delayms(uint xms)
{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);
}void main()
{uchar val,flag;dula=0;wela=0;dacs=0;dawr=0;P0=0;while(1){if(flag==0){val+=5;P0=val;if(val==255){flag=1;beep=0;delayms(100);beep=1;}delayms(50);}else{val-=5;P0=val;if(val==0){flag=0;beep=0;delayms(100);beep=1;}delayms(50);}}
}
图2.2.1 数模转换(最亮)
图2.2.2 数模转换(暗)
Proteus仿真:
图2.2.3 数模转换仿真图
不存在,有懂的兄弟评论区或私信帮忙一下。
图2.2.4 数模转换仿真图出错
三.简易版
1.A/D
通过 ADC(模数转换器) 读取模拟电压值,并将结果显示在 LCD1602 液晶屏 上。
#include "reg52.h"
sbit start=P3^0;
sbit eoc=P3^1;
sbit oe=P3^2;
sbit rs=P3^3;
sbit rw=P3^4;
sbit e=P3^5;
unsigned int vol=0;
unsigned char t[]={"0123456789"};
unsigned char str[]={"VOLTAGE:"}; // 显示更美观void delay(unsigned int n) // 延时函数
{unsigned int i,j;for(i=0;i<n;i++){for(j=0;j<120;j++);}
}void writedat(unsigned char dat) // 写入数据 lm016
{rs=1;rw=0;e=0;P1=dat;delay(100);e=1;e=0;
}void writecom(unsigned char com)
{rs=0;rw=0;e=0;P1=com;delay(100);e=1;e=0;
}void initlcd()
{writecom(0x38);writecom(0x0c);writecom(0x06);writecom(0x01);
}void adc()
{start=0;start=1;delay(100);start=0;while(eoc!=1);oe=1;vol=P2;oe=0;
}void display()
{unsigned char temp0=0,temp1=0,temp2=0;int i;vol=vol*100/51; // 扩大一百倍显示小数, 5v时显示255,差了51倍。temp0=vol/100;temp1=(vol%100)/10;temp2=(vol%10);for(i=0;i<8;i++){writedat(str[i]);delay(100);}writecom(0x80+0x40+4);delay(100);writedat(t[temp0]);delay(100);writedat('.');delay(100);writedat(t[temp1]);delay(100);writedat(t[temp2]);delay(100);writedat('V');delay(100);
}void main()
{initlcd();while(1){adc();display();}}
proteus仿真:
存在误差
图3.1.1 A/D转换简易仿真图
演示视频:
ADC(模数转换器) 读取模拟电压值简易版AD转换
2.D/A
通过按键控制输出信号,并实现两种不同的输出模式:PWM 方波 和 阶梯波。
#include "reg52.h"
#define uint unsigned int
sbit key0=P1^0;
sbit key1=P1^1;
uint value=100;
uint flag=0;void delay(uint n)
{uint i=0,j=0;for(i=0;i<n;i++){for(j=0;j<120;j++);}
}void key()
{if(key0==0&&flag==0){flag=1;}if(flag==1&&key0==1){value+=50;flag=0; }if(key1==0&&flag==0){flag=1;}if(flag==1&&key1==1){value-=50; flag=0;}
}void PWM() // 方波
{P2=0;delay(100);P2=255;delay(value);
}void stair()
{uint i=0;for(i=0;i<255;i++){P2=i;delay(1);}for(i=255;i>0;i--){P2=i;delay(1);}
}void main()
{while(1){//PWM();stair();key();}}
proteus仿真:
图3.2.1 D/A转换简易版仿真图
参考视频:知弦【Proteus电路仿真及应用(51单片机系列)】这位博主的51仿真视频讲的不错,博主都是从他这参考的。
相关文章:
51单片机实验五:A/D和D/A转换
一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus. 器材:TX-1C单片机(STC89C52RC)、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念:模数转换是将连续的模拟信号转换为离散的数字信…...
重构未来智能:Anthropic 解码Agent设计哲学三重奏
第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…...
MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构
MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构 文章目录 MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构一、MCP协议的技术演进与纳米材料研究的适配性分析1.1 MCP协议的核心架构升级1.2 纳米材料研发的核心挑战与…...
.NET Core 服务实现监控可观测性最佳实践
.NET Core 概述 .Net Core 是一个开源的、跨平台的高性能框架,由微软开发并维护,现由 .NET Foundation 提供支持。它用于构建现代化、可扩展的云端和本地应用程序,支持开发 Web 应用、微服务、API、物联网应用以及移动后端服务,是…...
ios精灵脚本辅助软件,有根和无根roothide越狱区别
最新版本的ios按键精灵app 支持到15-16系统,可以在半越狱环境下和无根越狱环境安装,对于很多用户一直不理解有根和无根之间的差别,今天简单介绍下 最高权限和部分权限的区别 1、有根越狱 – 有系统根目录读写权限(通过越狱软件可…...
ChatGPT-o3辅助学术大纲效果如何?
目录 1 引言 2 背景综述 2.1 自动驾驶雷达感知 2.2 生成模型演进:从 GAN 到 Diffusion 3 相关工作 3.1 雷达点云增强与超分辨率 3.2 扩散模型在数据增广中的应用 4 方法论 4.1 问题定义与总览 4.2 数据预处理与雷达→体素表示 4.3 潜在体素扩散网络&…...
PyCharm 2024.3.5 状态栏添加前进后退按钮
操作路径:Appearance & Behavior -> Menu and Toolbars -> Main Toolbar -> Left -> Add… 按钮位置:Main Menu -> Navigate -> OK 最终效果...
【CPP】死锁产生、排查、避免
一、死锁产生 死锁是指两个或多个线程互相等待对方释放资源,导致程序无法继续执行的现象。在多线程编程中,死锁是一种常见且严重的并发问题。死锁产生必须要四个条件同时满足才会发生: 互斥条件:某些资源只能由一个线程占用。占…...
深入理解 Android Handler
一、引言 Handler 在安卓中的地位是不言而喻的,几乎维系着整个安卓程序运行的生命周期,但是这么重要的一个东西,我们真的了解它吗?下面跟随着我的脚步,慢慢揭开Hanler的神秘面纱吧! 本文将介绍Handler 的运…...
Git 进阶之路:高效协作之分支管理
🌈 个人主页:Zfox_ 🔥 系列专栏:Git 企业级应用 目录 一:🔥 分⽀管理 🦋 理解分⽀🦋 创建分⽀🦋 切换分⽀🦋 合并分⽀🦋 删除分⽀🦋 合…...
LeetCode 2364.统计坏数对的数目:反向统计
【LetMeFly】2364.统计坏数对的数目:反向统计 力扣题目链接:https://leetcode.cn/problems/count-number-of-bad-pairs/ 给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] ,那么我们称 (i, j) 是一个 坏…...
6.Rust+Axum:打造高效 WebSocket 实时通信聊天室
摘要 本文详细介绍 RustAxum 在 WebSocket 实时通信开发中的应用,包括双向通信、状态管理等,实践构建聊天室应用。 一、引言 在当今的 Web 应用开发中,实时通信变得越来越重要。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议&…...
【硬件系统架构】冯·诺依曼架构
一、引言 在计算机科学的广袤领域中,冯诺依曼架构犹如一颗璀璨的恒星,照亮了现代计算机发展的道路。从我们日常使用的个人电脑到强大的数据中心服务器,几乎都基于这一架构构建。它的出现是计算机发展史上的一个重要里程碑,深刻地影…...
Android 13 关闭屏幕调节音量大小
一、问题描述 在Android 13系统中,通过修改frameworks/base/core/res/res/values/config.xml配置文件,实现灭屏状态下调节音量的功能。 二、修改内容 diff --git a/frameworks/base/core/res/res/values/config.xml b/frameworks/base/core/res/res/values/config.xml inde…...
[编程基础] Java · 学习手册
🔥 《Java 工程师修炼之路:从零构建系统化知识体系》 🔥 🛠️ 专栏简介: 这是一个以工业级开发标准打造的 Java 全栈技术专栏,涵盖语言核心、并发编程、JVM 原理、框架源码、架构设计等全维度知识体系。专…...
探索元生代:ComfyUI 工作流与计算机视觉的奇妙邂逅
目录 一、引言 二、蓝耘元生代和 ComfyUI 工作流初印象 (一)蓝耘元生代平台简介 (二)ComfyUI 工作流创建是啥玩意儿 三、计算机视觉是个啥 (一)计算机视觉的基本概念 (二)计算…...
C++ 迭代器失效详解:如何避免 vector 操作中的陷阱
目录 1. 什么是迭代器失效? 2. 哪些操作会导致迭代器失效? 2.1 vector 的插入操作(push_back, insert) 示例:push_back 导致迭代器失效 如何避免? 2.2 vector 的删除操作(erase, pop_back&…...
【fisco bcos】基于ABI调用智能合约
参考官方文档:https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/docs/sdk/java_sdk/assemble_transaction.html 先放一下智能合约: (就是一个很简单的插入和查找嗯) pragma solidity ^0.4.25; pragma experimental…...
【Python学习笔记】Pandas实现Excel质检记录表初审、复核及质检统计
背景: 我有这样一个需要审核的飞书题目表,按日期分成多个sheet,有初审——复核——质检三个环节,这三个环节是不同的同学在作业,并且领到同一个题目的人选是随机的,也就是说,完成一道题的三个人…...
Springboot 自动装配原理是什么?SPI 原理又是什么?
1. Spring Boot 自动装配原理 自动装配是 Spring Boot 简化配置的核心机制,其核心思想是根据类路径中的依赖自动配置 Spring 应用。 关键步骤: 启动注解 SpringBootApplication 该注解组合了 EnableAutoConfiguration,用于激活自动配置。 …...
【英语语法】基本句型
目录 前言一:主谓二:主谓宾三:主系表四:主谓双宾五:主谓宾补 前言 英语基本句型是语法体系的基石,以下是英语五大基本句型。 一:主谓 结构:主语 不及物动词 例句: T…...
扫雷-C语言版
C语言扫雷游戏设计(完整版) 游戏背景 扫雷是一款经典的益智类单人电脑游戏,最早出现在1960年代,并在1990年代随着Windows操作系统而广为人知。游戏目标是在不触发任何地雷的情况下,揭开所有非地雷的格子。玩家需要根…...
【C++初阶】--- list容器功能模拟实现
1.什么是list容器 在 C 标准模板库(STL)中,std::list 是一个非常有用的容器,它是双向链表的实现std::list 是一种序列式容器,它允许在序列内的任意位置进行高效的插入和删除操作。与数组和 std::vector 不同ÿ…...
gRPC 介绍及在嵌入式 Linux 下的成功编译及使用详解
gRPC 是一个高性能、开源和通用的 RPC 框架,由 Google 开发。它支持多种编程语言,并且能够运行在不同的环境中,包括嵌入式系统。本文将详细介绍 gRPC,以及如何在嵌入式 Linux 系统下成功编译 gRPC,并结合 protobuf 和 …...
C语言教程(十):C 语言函数详解
一、引言 在 C 语言中,函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数,不仅能提高代码的可读性、可维护性,还便于代码的复用。无论是简单的数学计算,还是复杂的系统操作,函数都发挥着核心作用。…...
力扣刷题-热题100题-第35题(c++、python)
146. LRU 缓存 - 力扣(LeetCode)https://leetcode.cn/problems/lru-cache/?envTypestudy-plan-v2&envIdtop-100-liked 双向链表哈希表 内置函数 对于c有list可以充当双向链表,unordered_map充当哈希表;python有OrderedDic…...
LeetCode算法题(Go语言实现)_52
题目 给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人: 总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。 在每一轮雇佣中…...
基于尚硅谷FreeRTOS视频笔记——13—HAL库和RTOS时钟源问题
RTOS的时钟源就是系统定时器中断,通俗来说就是系统定时器每中断一次,就扫描一次RTOS,查看RTOS中有没有任务的切换。 但是,系统存在一个HAL_Delay()函数,就是使用的系统定时器中断来执行的函数。 当我们在RTOS中&…...
FPGA入门学习Day1——设计一个DDS信号发生器
目录 一、DDS简介 (一)基本原理 (二)主要优势 (三)与传统技术的对比 二、FPGA存储器 (一)ROM波形存储器 (二)RAM随机存取存储器 (三&…...
JavaScript-立即执行函数(Immediately Invoked Function Expression,IIFE)
立即执行函数(Immediately Invoked Function Expression,IIFE)是 JavaScript 里一种很独特的函数,它在定义后会马上执行。下面会详细介绍它的语法、用途、优点以及注意事项。 一、语法 立即执行函数一般有两种常见的语法形式&am…...
【Leetcode 每日一题 - 补卡】2537. 统计好子数组的数目
问题背景 给你一个整数数组 n u m s nums nums 和一个整数 k k k,请你返回 n u m s nums nums 中 好 子数组的数目。 一个子数组 a r r arr arr 如果有 至少 k k k 对下标 ( i , j ) (i, j) (i,j) 满足 i < j i < j i<j 且 a r r [ i ] a r r [ …...
【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~
Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具,集音视频翻译、配音、语音克隆于一身,支持横竖屏格式输出,确保在所有主流平台(哔哩哔哩,小红书,抖音,视频号,…...
常用绑定事件方式有哪几种
绑定事件分为3种: 1、内联模式:将函数名直接作为标签属性的属性值(注意:这里是带括号的,不带括号不生效,但是在vue中可以加括号也可以不加括号,如果需要穿参数就加括号,不需要传参数可以不加&am…...
数据结构之BFS广度优先算法(腐烂的苹果)
队列这个数据结构在很多场景下都有使用,比如在实现二叉树的层序遍历,floodfill问题(等等未完成)中,都需要借助队列的先进先出特性,下面给出这几个问题的解法 经典的二叉树的层序遍历 算法图示,以下图所示的二叉树为例…...
linux 学习 1.开始学习
准备学习linux记录一下学习内容,只会包含必要的知识,和部分演示 我采用的系统是Ubuntu24.04 初始掌握 学习首先需要掌握如何查看帮助手册 man man # man 加任何命令可以看具体命令的帮助手册 man mkdir进入手册按 d(down):往下翻半页u(u…...
Flink-01学习 介绍Flink及上手小项目之词频统计
flink简介 官网 概述: 学习Flink具体包括四个关键概念:流数据的持续处理,事件时间,有状态流处理和状态快照。 Apache Flink 是一个开源的流处理框架,旨在处理批处理和实时数据处理,具有高吞吐量和低延迟的…...
【Linux我做主】探秘gcc/g++和动静态库
TOC Linux编译器gcc/g的使用 github地址 有梦想的电信狗 前言 在软件开发的世界中,编译器如同匠人的工具,将人类可读的代码转化为机器执行的指令。 对于Linux开发者而言,gcc和g是构建C/C程序的核心工具链,掌握它们的原理和使…...
工控系统前端设计(pyqt)
题目源自:白月黑羽的项目实战四-[工控系统前端] 代码已上传至gitcode https://gitcode.com/m0_37662818/Industrial_Control_System_Front_End 心得体会:直接用组态软件或者js吧 项目亮点 tablemodel的使用,绑定了表格和数据风机自定义ite…...
一台 Master 多节点玩转 Kubernetes:sealos 一键部署实践
文章目录 一台 Master 多节点玩转 Kubernetes:sealos 一键部署实践🔗 参考链接🌐 部署环境📦 安装包说明🔧 前期准备🚀 使用 sealos 安装 Kubernetes✅ 验证集群状态📌 后续可做的优化和拓展&am…...
写书的三驾马车
2019年8月19日23:52:28 先亮出我们的兵器组合: GitBook Git Markdown,享受行云流水一般的写作 个人秀 GitBook : 一个基于 Node.js 的文档格式转换工具,支持 Markdown 和 AsciiDoc 两种语法格式,可以输出 HTML、PDF等格式的…...
科学护理进行性核上性麻痹,缓解病痛提升生活质量
进行性核上性麻痹是一种罕见的神经系统变性疾病,患者常出现姿势平衡障碍、吞咽困难、眼球运动异常等症状。通过科学的健康护理,能在一定程度上减轻患者痛苦,提升生活质量。 日常护理,保障安全舒适 患者日常活动时,需确…...
第七章:7.2求方程a*x*x+b*x+c=0的根,用3个函数,分别求当:b*b-4*a*c大于0、等于0和小于0时的根并输出结果。从主函数输入a、b、c的值
//求方程a*x*xb*xc0的根,用3个函数,分别求当:b*b-4*a*c大于0、等于0和小于0时的根并输出结果。 //从主函数输入a、b、c的值 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> void s1(float a, float b, fl…...
优选算法系列(7.BFS 解决最短路问题)
简介: 先走到A,之后弹出A再把A能走到的地方加进去向外扩展把队列里面的元素(B,C)弹出来,再把B,C能到的地方入队列 一直这样那么最短路程就是扩展的层数。 迷宫中离入口最近的出口(me…...
实现定时发送邮件,以及时间同步
定时发送邮件 部署邮件服务 查看有没有安装mailx,安装了 [root192 ~]# rpm -q mailx mailx-12.5-43.fc38.x86_64去网易拿一下授权码,写到配置文件里 vim /etc/mail.rcset fromxxxxxxx163.com set smtpsmtp.163.com set smtp-auth-userxxxxxxx163.com set smtp-auth-passwor…...
Java反射知识点学习笔记
目录 一、定义 二、获取class对象的三种方式 1、Class.forName("全类名") 2、类名.class 3、对象.getClass() 三、案例 1、获取 class 反射对象三种方式 2、利用反射获取构造方法 3、利用反射获取成员变量 4、利用反射获取成员方法 Java反射是一种强大的编…...
Unity ShaderLab引用HLSL文件找不到其中函数
在写Unity Shader的过程中,常常需要将方法封装到HLSL文件中,今天遇到一个这样的报错, 明明hlsl文件路径引用没问题,却引用不到方法 并且将分散文件中的函数复制过来一切正常,最终定位到HLSL的预编译指令中 这指令的…...
【文献笔记】LLM-based control code generation using image recognition
LLM-based control code generation using image recognition 原文代码 标题翻译:基于图像识别的LLM控制代码生成 1. 内容介绍 1.1. 简介 论文提出了一种基于LLM的新方法,通过图像识别从管道仪表图(Piping and Instrumentation Diagrams,…...
算法之贪心算法
贪心算法 贪心算法核心思想常见应用场景典型案例案例一:找零问题案例二:活动选择问题案例三:货仓选址问题 贪心算法的应用详解霍夫曼编码最小生成树Dijkstra最短路径算法 总结 贪心算法 核心思想 贪心算法(Greedy Algorithm&…...
从“链主”到“全链”:供应链数字化转型的底层逻辑
1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型,是利用新一代数字技术(如工业互联网、人工智能、大数据、云计算、边缘计算等)对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…...
【Windows本地部署n8n工作流自动平台结合内网穿透远程在线访问】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...