51单片机实验五:A/D和D/A转换

一、实验环境与实验器材

环境:KeliSTC-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仿真视频讲的不错,博主都是从他这参考的。

 

 

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

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

相关文章

C++ 常用的智能指针

C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针&#xff08;需包含头文件 <memory>&#xff09;&#xff1a; unique_ptr&#xff1a;独占所有权&#xff0c;不可复制&#xff0c; 可移动shared_ptr&#xff1a;共享所有权&#xff0c;用于引用计数weak_pt…

6.8.最小生成树

一.复习&#xff1a; 1.生成树&#xff1a; 对于一个连通的无向图&#xff0c;假设图中有n个顶点&#xff0c;如果能找到一个符合以下要求的子图&#xff1a; 子图中包含图中所有的顶点&#xff0c;同时各个顶点保持连通&#xff0c; 而且子图的边的数量只有n-1条&#xff0…

Spring Boot 集成金蝶 API 演示

✨ Spring Boot 集成金蝶 API 演示&#xff1a;登录 / 注销 Cookie 保存 本文将通过 Spring Boot 完整实现一套金蝶接口集成模型&#xff0c;包括&#xff1a; ✅ 普通登录✅ AppSecret 登录✅ 注销✅ Cookie 保存与复用 &#x1f4c5; 项目结构 src/ ├── controller/ │…

React 受控表单绑定基础

React 中最常见的几个需求是&#xff1a; 渲染一组列表绑定点击事件表单数据与组件状态之间的绑定 受控表单绑定是理解表单交互的关键之一。 &#x1f4cd;什么是受控组件&#xff1f; 在 React 中&#xff0c;所谓“受控组件”&#xff0c;指的是表单元素&#xff08;如 &l…

基于FPGA的AES加解密系统verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 4.1 字节替换&#xff08;SubBytes&#xff09; 4.2 行移位&#xff08;ShiftRows&#xff09; 4.3 列混合&#xff08;MixColumns&#xff09; 4.4 轮密钥加&#xff08;AddRoundKey&#xff09; 4.…

6.5 GitHub监控系统实战:双通道采集+动态调度打造高效运维体系

GitHub Sentinel Agent 定期更新功能设计与实现 关键词:GitHub API 集成、定时任务调度、Python 爬虫开发、SMTP 邮件通知、系统稳定性保障 1. GitHub 项目数据获取功能 1.1 双通道数据采集架构设计 #mermaid-svg-ZHJIMXcMAyDHVhmV {font-family:"trebuchet ms",v…

Explorer++:轻量级高效文件管理器!!

项目简介 Explorer 是一款专为Windows操作系统设计的轻量级且高效的文件管理器。作为Windows资源管理器的强大替代方案&#xff0c;它提供了丰富的特性和优化的用户体验&#xff0c;使得文件管理和组织变得更加便捷高效。无论是专业用户还是普通用户&#xff0c;都能从中受益&a…

7、生命周期:魔法的呼吸节奏——React 19 新版钩子

一、魔法呼吸的本质 "每个组件都是活体魔法生物&#xff0c;呼吸节奏贯穿其生命始终&#xff0c;"邓布利多的冥想盆中浮现三维相位图&#xff0c;"React 19的呼吸式钩子&#xff0c;让组件能量流转如尼可勒梅的炼金术&#xff01;" ——以霍格沃茨魔法生理…

理解计算篇--正则表达式转NFA--理论部分

空正则表达式转NFA单字符正则表达式转NFA拼接正则表达式转NFA选择正则表达式转NFA重复正则表达式转NFA 正则表达式转NFA–实战部分 空正则表达式转NFA 转换步骤&#xff1a; 构建1个只有1个状态的NFA起始状态也是接受状态没有规则&#xff0c;即规则集为空 单字符正则表达式…

稳态模型下的异步电机调速【运动控制系统】

异步电动机&#xff1a; n1是同步转速&#xff08;电机和磁芯同步时候的转速&#xff09; n&#xff1a;电机的实际转速 异步电动机恒压频比的概念&#xff0c;为什么基频以下可以采取恒压频率&#xff0c;基频以上不可以采用恒压频比&#xff1a; 异步电动机的恒压频比&…

【KWDB 创作者计划】_算法篇---Stockwell变换

文章目录 前言一、Stockwell变换原理详解1.1 连续S变换定义1.2 离散S变换1.3简介 二、S变换的核心特点2.1频率自适应的时频分辨率2.1.1高频区域2.1.2低频区域 2.2无交叉项干扰2.3完全可逆2.4相位保持2.5与傅里叶谱的直接关系 三、应用领域3.1地震信号分析3.2生物医学信号处理3.…

云计算(Cloud Computing)概述——从AWS开始

李升伟 编译 无需正式介绍亚马逊网络服务&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;。作为行业领先的云服务提供商&#xff0c;AWS为全球开发者提供了超过170项随时可用的服务。 例如&#xff0c;Adobe能够独立于IT团队开发和更新软件。通过AWS的服务&…

Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇

目录 引言 一、获取节点信息 1.1 获取属性 1.2 获取文本值 1.3 获取ID、位置、标签名、大小 二、切换Frame 三、延时等待 3.1 隐式等待 3.2 显式等待 四、前进后退 五、Cookies 六、选项卡管理 七、异常处理 引言 这一节我们继续讲解Selenium的使用下篇&#xff0…

容器docker入门学习

这里写目录标题 容器容器的软件厂商 dockerdocker引擎 虚拟化虚拟化技术 docker安装详解1、安装检查2、安装yum相关的工具3、安装docker-ce软件4、查看docker版本5、启动docker服务6、设置docker开机启动7、查看有哪些docker容器运行进程8、查看容器里有哪些镜像9、下载nginx软…

文献总结:NIPS2023——车路协同自动驾驶感知中的时间对齐(FFNet)

FFNet 一、文献基本信息二、背景介绍三、相关研究1. 以自车为中心的3D目标检测2. 车路协同3D目标检测3. 特征流 四、FFNet网络架构1. 车路协同3D目标检测任务定义2. 特征流网络2.1 特征流生成2.2 压缩、传输与解压缩2.3 车辆传感器数据与基础设施特征流融合 3. 特征流网络训练流…

git 出现 port 443 Connection timed out

梯子正常延迟不算严重&#xff0c;但在使用git push时反复出现 fatal: unable to access https://github.com/irvingwu5/xxxx.git/ Error in the HTTP2 framing layer Failed to connect to github.com port 443 after 136353 ms: Connection timed out 将git的网络配置与梯子…

【2025年4月18日】android studiio最新设置沉浸式状态栏教程

&#x1f62b;【2025年4月18日】搞了一整天&#xff0c;终于完美搞定 Android 沉浸式状态栏&#xff08;WebView 本地HTML&#xff09; 最近在做一个个人项目&#xff0c;用 Android 加载本地 HTML 做个小工具。按理说用 WebView 加载页面很简单嘛——结果沉浸式状态栏这个坑…

如何删除 Launchpad 中 Chrome 的图标

有一天突然在 Launchpad 中出现下面的图标&#xff0c;在 Finder 的 Applications 中也没有&#xff0c;不知道如何删除。最终在《How to remove chrome app icons from launchpad?》中找到了答案。中文互联网上并没有搜到相关帖子&#xff0c;遂作记录。 解决办法很简单&am…

PHP8.2.9NTS版本使用composer报错,扩展找不到的问题处理

使用composer install时报错&#xff1a; The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at y our own risk, by setting the ‘disable-tls’ option to true.…