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

news2025/5/13 13:02:33

一、实验环境与实验器材

环境: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以后不必再管ADCS
	wela=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之前先给其写全1
		adrd=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.coloradmin.cn/o/2338251.html

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

相关文章

使用VHD虚拟磁盘安装双系统,避免磁盘分区

前言 很多时候&#xff0c;我们对现在的操作系统不满意,就想要自己安装一个双系统 但是安装双系统又涉及到硬盘分区,非常复杂,容易造成数据问题 虚拟机的话有经常用的不爽,这里其实有一个介于虚拟机和双系统之间的解决方法,就是使用虚拟硬盘文件安装系统. 相当于系统在机上…

Kafka消费者端重平衡流程

重平衡的完整流程需要消费者 端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。在消费者端&#xff0c;重平衡分为两个步骤&#xff1a;分别是加入组和等待领导者消费者&#xff08;Leader Consumer&#xff09;分配方案。这两个步骤分别对应两类…

Django之modelform使用

Django新增修改数据功能优化 目录 1.新增数据功能优化 2.修改数据功能优化 在我们做数据优化处理之前, 我们先回顾下传统的写法, 是如何实现增加修改的。 我们需要在templates里面新建前端的页面, 需要有新增还要删除, 比如说员工数据的新增, 那需要有很多个输入框, 那html…

云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》

2025年4月8日至9日&#xff0c;中国人工智能产业发展联盟&#xff08;以下简称AIIA&#xff09;第十四次全体会议暨人工智能赋能新型工业化深度行&#xff08;南京站&#xff09;在南京召开。工业和信息化部科技司副司长杜广达&#xff0c;中国信息通信研究院院长、中国人工智能…

写论文时降AIGC和降重的一些注意事项

‘ 写一些研究成果&#xff0c;英文不是很好&#xff0c;用有道翻译过来句子很简单&#xff0c;句型很单一。那么你会考虑用ai吗&#xff1f; 如果语句太正式&#xff0c;高级&#xff0c;会被误判成aigc &#xff0c;慎重选择ai润色。 有的话就算没有用ai生成&#xff0c;但…

AI 编程工具—如何在 Cursor 中集成使用 MCP工具

AI 编程工具—如何在 Cursor 中集成使用 MCP工具 这里我们给出了常用的MCP 聚合工具,也就是我们可以在这些网站找MCP服务 这是一个MCP Server共享平台,用户可以在上面发布和下载MCP Server配置。在这里可以选择你需要的MCP 服务。 如果你不知道你的mcp 对应的server 名称也不…

《软件设计师》复习笔记(12.2)——成本管理、配置管理

目录 一、项目成本管理 1. 定义 2. 主要过程 3. 成本类型 4. 其他概念 真题示例&#xff1a; 二、软件配置管理 1. 定义 2. 主要活动 3. 配置项 4. 基线&#xff08;Baseline&#xff09; 5. 配置库类型 真题示例&#xff1a; 一、项目成本管理 1. 定义 在批准…

Spring 中的 @Cacheable 缓存注解

1 什么是缓存 第一个问题&#xff0c;首先要搞明白什么是缓存&#xff0c;缓存的意义是什么。 对于普通业务&#xff0c;如果要查询一个数据&#xff0c;一般直接select数据库进行查找。但是在高流量的情况下&#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的…

settimeout和setinterval区别

1. setTimeout&#xff1a;单次延迟执行 语法&#xff1a; const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能&#xff1a;在指定的 delay&#xff08;毫秒&#xff09;后&#xff0c;执行一次 callback 函数。 参数&#xff1a; callback&#x…

Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制

本报告对Microsoft最新推出的Recall功能进行了全面隐私与安全分析。Recall是Windows 11 Copilot电脑的专属AI功能&#xff0c;允许用户以自然语言搜索曾在电脑上查看过的内容。该功能在初次发布时因严重隐私和安全问题而备受争议&#xff0c;后经微软全面重新设计。我们的分析表…

Thymeleaf简介

在Java中&#xff0c;模板引擎可以帮助生成文本输出。常见的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf 和 JSP比较&#xff1a; Thymeleaf目前所作的工作和JSP有相似之处&#xff0c;Thyme…

o3和o4-mini的升级有哪些亮点?

ChatGPT是基于OpenAI GPT系列的高性能对话生成AI&#xff0c;经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中&#xff0c;OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本&#xff0c;为不同使用场景提供灵活选择。​ 随着用户需求向更高效、更精准的推理和视觉…

MATLAB 控制系统设计与仿真 - 36

鲁棒工具箱定义了个新的对象类ureal,可以定义在某个区间内可变的变量。 函数的调用格式为&#xff1a; p ureal(name,nominalvalue) % name为变量名,nominalValue为标称值&#xff0c;默认变化值为/-1 p ureal(name,nominalvalue,PlusMinus,plusminus) p ureal(name,nomin…

Spring数据访问全解析:ORM整合与JDBC高效实践

目录 一、Spring ORM集成深度剖析 &#x1f31f; ORM模块架构设计 核心集成特性&#xff1a; 整合MyBatis示例配置&#xff1a; 二、Spring JDBC高效实践指南 &#x1f31f; 传统JDBC vs Spring JDBC对比 &#x1f31f; JdbcTemplate核心操作示例 批量操作优化&#xf…

【HCIA】使用Access port实现简易的VLAN间通信

前言 当我们拥有一台三层交换机与两个vlan&#xff0c;我们可以使用简易的Vlanif配置实现VLAN间通信。 文章目录 前言1. 拓扑图2. 配置交换机3. 配置PC1与PC2的网络4. port link-type后记修改记录 1. 拓扑图 2. 配置交换机 <Huawei>system-view [Huawei]undo info-cent…

6.VTK 颜色

文章目录 概念RGB示例HSV示例 概念 RGB颜色系统&#xff1a;通过红(R)、绿(G)、蓝(B)三个颜色分量的组合来定义颜色。每个分量的取值范围是0到1&#xff0c;其中(0, 0, 0)代表黑色&#xff0c;而(1, 1, 1)代表白色。可以使用vtkProperty::SetColor(r, g, b)方法为Actor设置颜色…

shiro使用

shiro是apache提供的一种安全框架。他可以将登录&#xff0c;权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…

光谱相机的成像方式

光谱相机的成像方式决定了其如何获取物体的空间与光谱信息&#xff0c;核心在于分光技术与扫描模式的结合。以下是主要成像方式的分类解析&#xff1a; ‌一、滤光片切换型‌ ‌1. 滤光片轮&#xff08;Filter Wheel&#xff09;‌ ‌原理‌&#xff1a;通过旋转装有多个窄带…

算法-链表

小细节 初始化问题 我们这样子new一个ListNode 它里面的默认值是0&#xff0c;所以我们不能这样 如果我们为空&#xff0c;我们要返回null 节点结束条件判断&#xff08;多创建节点问题&#xff09; 参考示例3217 解析&#xff1a; 我的答案是多了一个无用节点 这是因为我每…

3.8/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Regional and National Burden of Traumatic Brain Injury and Spinal Cord Injury in North Africa and Middle East Regions, 1990-2021: A Systematic Analysis for The Global Burden of Disease Study 2021 DOI&#xff1a;10.1007/s44197-025-00372-…