51单片机(十六)AD/DA

这篇具有很好参考价值的文章主要介绍了51单片机(十六)AD/DA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

本节主要介绍学习AD/DA的相关知识,包括AD/DA基础知识、AD/DA通俗解释、硬件电路模型、运算放大器、AD/DA性能指标、AD/DA原理、XPT2046、本节目标等;并利用两个小实验来写程序进行练习,分别是AD模数转换以及 DA数模转换,最后附上相关代码。

一、AD/DA和本节目标

1.1 AD/DA基础知识

1.1.1 AD/DA的通俗解释

参考自:https://zhuanlan.zhihu.com/p/431750381

在信号这个大家族中,有两兄弟特别引人注目,就是“模拟”和“数字”。

什么是“模拟”?

“模拟”是“数字”的兄长。

“模拟”是对我们生活的实体的一种表达方式。
51单片机(十六)AD/DA

比如说你在看一本书,白纸黑字映入你的眼帘,在你的大脑中就会有反应,你从书中知道了一些东西,我们说印在纸上的字是一种“模拟”。与此相类似,你用笔在纸上记下的一个电话号码或是写下的一首诗歌,还有刻在石头上的古代碑文,这些都是“模拟”。除了文字以外,我们在生活中还能见到许多“模拟”的东西,比如说一幅风景画,又比如说你在电视上或是电影院的屏幕上看到听到了孩子们的欢歌笑语,你在电话里听到了朋友的声音。
“模拟”需要载体或是信息的存储媒体,比如说一张白纸,又比如说是一盒胶卷。
“模拟”需要工具,比如说你有一台电视机,那么电视机的荧光屏和喇叭都属于模拟设备。
“模拟”需要传播方式,比如说你可以和一个十几米外的朋友说话,但是如果你的朋友在几百公里以外,你就不得不需要电话,电话网通过“模拟信号”将你的声音传到了几百公里甚至几千公里以外。

什么是“数字”?
类似于“模拟”,数字也是我们生活中的实体的一种表达方式。
你可以用笔在纸上记下一个电话号码,也可以把这个电话号码输入你的计算机存储器;你可以看一本印刷成册的书,也可以看存储在CD-ROM中的电子出版物;你可以听收音机播放的音乐,也可以听一盘音乐光盘(CD)。
数字信息的最小度量单位叫做“比特”,有时也叫“位”,意即二进制的一位。在媒体中传输的讯号是以比特的电子形式组成你的数据。

51单片机(十六)AD/DA

比特的定义是:比特是一种存在的状态:开或关,真或伪,上或下,入或出,黑或白。出于实用的目的,我们把比特想成1或0。
应该说这个定义相当准确,但一个在电脑和英语方面知识程度不高的人仍然没有弄懂“比特”究竟是什么。
“比特”是英语bit一词的音译。bit一词是由binary(二进制的)和digit(数字)两个词压缩而成的,所以bit即“二进制数字”,亦即0和1。“数字时代”准确的意思是“二进制数字时代”或“比特时代”那么这0和1到底是什么意思呢?我们从一个简单的例子说起。
在使用电脑的时候,我们可以根据我们的需要和喜好,通过一些位于显示器底部的旋钮来调节显示图形,在这些旋钮下面,分别写着center(居中度)、size(大小)、brightness(亮度)、contrast(对比度)。这些调节都有一定的可调幅度,我们可能在这个幅度内任意选择哪一种居中度、大小等。
除这些旋钮外,还有一个“机关”却不是这样,这个机关的两边分别写着0和1。这就是显示屏的开关。它没有调节幅度,通过它我们只能选择非此即彼的两种状态:开(on)和关(off)。显示屏的亮度、对比度等都有两个极点,在这两个极点之间的“值”是多值性的。而开关的周期只有两个值,即它的两个极点。“进制”的“进”,就是周期所包含的“值”。比如“十进制”数字,就是一个变化周期里包含十个“值”数字。同样道理,二进制数字就是变化周期里包含二个值的数字。我们采用何种“进制”对一种事物的存在状态计数,表面上,要看衡量事物状态的“值”的多少,其实“进制”与事物的状态值并无必然的、唯一的关联。
事实上,电脑完全可以用0和1这两个数字将多进制状态的“值”表示或“翻译”出来。数是抽象的,但数的观念却源于人的具体的感觉经验。我们对于十进制计数方法习以为常。当一个人说“一年有12个月”这句话时,他可能觉得“12”这个数字唯一正确地表示了一年的月份数。进而他可能会认为,数字与事物的数量同样都是客观的–除了说一年有12个月,你还能说一年有多少个月?
这是对于数字本质的一种似是而非的看法。极端地说,对于“一年有多少个月”这个问题,可以有很多不同的“答案”。这样说听起来简直荒唐透顶,细究起来却并不然。当我们采用不同进制来表示事物的数量时,我们对事物的数量就可以说出不同的“答案”,而且这些“答案”都是对的。
比如可以说一人有65岁,也可说他有01000001岁。只是后一种说法我们听起来相当别扭,因为我们早已习惯了用十进制数字来表达数量。如果采用“六进制”数字(世界上似乎还没有哪个民族采用过这种进制的数字),那么就可以说一年有二“六”个月。如果螃蟹有朝一日进化到与人接近的水平,它们很可能采用“八进制数字”来计数,那么在它们看来,一年就有一“八”又四个月。
这样说并非完全是开玩笑。我只是想说明,“数字”其实并非我们通常所认为的那样“客观”。说到底,它是人对于客观事物的数量的主观映象。
除了“比特”(bit),我们还经常会遇到几个数字信息度量单位。字节(byte)是一种比“比特”更抽象或是高级的度量单位,一般来说,一个字节有8位,即8个比特。还有三个缩写,“K”、“M”和“G”。1K=1024,在中文里我们通常叫它“千”;1M=1024×1K,在中文里我们通常叫它“兆”;1G=1024×1M,在中文里我们通常叫它“千兆”或者“吉”。
比特(位)通常用于数据在网络上传输的情况下,比如我们一般都说这条电话线一秒钟可以传送9600比特的二进制流,而不是说1200字节。字节通常用在数据的存储系统中,比如说这个文件的大小是2M,这里指的是字节而不是比特,又比如是1.44M软盘、20G硬盘,指的也是字节。
模拟信号和数字信号有着很大的区别。模拟信号是用连续变化的数值来表示要说明的信息;数字信号是用有限个“0”和“1”的代码来表示信息中某一个字符,当很多字符组合起来时,才能表达完整的信息。

1.1.2 AD/DA基础知识介绍

1.1.2.1 AD/DA介绍

51单片机(十六)AD/DA

1.1.2.2 硬件电路模型

51单片机(十六)AD/DA
AD转DA的过程(下图左边部分),模拟量(电阻的阻值0-5V)经过AD转换后,和数字量(数字0-255)一一对应,成正比关系的;对于DA转AD的过程(下图右边部分),数字量(数字0-255)和模拟量(电阻的阻值0-5V)也是一一对应成正比关系的;如下图所示

51单片机(十六)AD/DA

硬件电路

51单片机(十六)AD/DA

1.1.2.3 介绍运算放大器

51单片机(十六)AD/DA
运算放大器的特性:
1、运算放大器的输入阻抗非常大;就当于桐乡输入端和反向输入端既不流入电流,也不流出电流;
2、因为运放内部有功率输出,所以输出端是有驱动能力;
3、调节放大倍数的方法:加一个负反馈,则内部的放大系数由负反馈决定
51单片机(十六)AD/DA

下面介绍运算放大器的四个经典电路:

1.1.2.3.1 电压比较器

51单片机(十六)AD/DA

电压比较器会比较同向输入端和反向输入端两个输入端电压的差值,当正向输入端的电压高于反向输入端电压时,OUT输出VCC(即最高电压);反之,当反向输入端的电压高于正向输入端电压时,OUT输出GND(0);

1.1.2.3.2 反向放大器

51单片机(十六)AD/DA
在反向放大器中,输出OUT和输入IN之间的关系如上图公式所示;放大系数就是R2与R1的比值的相反数;

其内部实现原理如下:

51单片机(十六)AD/DA

假如输入的电压IN是0.1V,由于电压比较器的性质,最终负极和正极最终都会稳定的0V左右,像是短路了一样,称为虚短;另外由于正极和负极是无法通过电流的,像断路一样,称为虚断;看上图,电阻R1左边的电压为0.1V,即IN;电阻R1右边的电压为0V;所以流过R1的的电流I(0.1-0)/ R1,由于虚断的性质,负极那里是断开的,则流过电阻R2的电流也为I,所以R2两端的电压就为IR2,也就是(0.1-0)/ R1 * R2,R2左边是正极,右边是负极,而R2左边电压是0V,所以右边电压就是0 -(0.1-0)/ R1 * R2;最终经过化简,可以得到公式V_out=-R2/R1 *V_IN

因为反向放大器最终输出的电压时反向放大的,比如输入时正电压,则输出就是放大后的负电压;有时候很不方便,为了使其输入正电压,可以接上双电源;
51单片机(十六)AD/DA
或者使用下面一种电路:同向放大器;

1.1.2.3.3 同向放大器

51单片机(十六)AD/DA
图中可以看到最终结论:V_out=(1+R2/R1)* V_IN

其原理推理过程如下:

51单片机(十六)AD/DA

可以看到上图的正向放大电路也是负反馈电路,满足虚短和虚断的机制,正极+的输入电压为V_IN,由虚短原理,+-之间是短路的,则正极+负极-的电压是相同的,所以负极-的电压也是V_IN;R1左侧是GND,电压为0,右侧的电压是IN,所以流过R1的电流I就是(V_IN-0)/ R1;由虚断可知,负极-正极+之间是断开的,则R2的电流也是I,所以R2两端的电压就是I*R2 也就是 (V_IN-0)/ R1 * R2;而R2的左侧是负极,右侧是正极,所以R2两侧的电压为右-左,右边是OUT,左边是负极-的电压也就是IN,所以V_OUT - V_IN = (V_IN-0)/ R1 * R2;化简后就是V_out=(1+R2/R1)* V_IN

同向发达器的优点就是,放大的方向是同向的,即如果IN是正电压,则OUT也是正电压;很方便;

1.1.2.3.4 电压跟随器

51单片机(十六)AD/DA

电压跟随器的特点就是输入电压等于输出电压;虽然电压没有变化,但是驱动能力会增强;

1.1.2.4 AD/DA的原理

DA的原理

51单片机(十六)AD/DA

DA转换器就是将数字信号转换为模拟信号;那么上述电路实现的功能就是将输入的8位数字量电压转换为模拟电压信号输出;

上述公式中(D7~D0)表示输入的8位二进制组成的最终数字转换成十进制;D7为最高位,D0为最低位;

具体原理写起来不方便,直接参考视频:

https://www.bilibili.com/video/BV1Mb411e7re?p=35&vd_source=e2638d12685eef84cda913d9d67be0a9第50分钟位置;

PWM型的DA转换器原理

51单片机(十六)AD/DA
优点是比较节省i/o口,一个输入一个输出就可以;且精度比较高;缺点是比较消耗单片机资源;

AD的原理
51单片机(十六)AD/DA

上述公式中(D7~D0)表示输出的结果取整后的十进制数转换成8位二进制;D7为最高位,D0为最低位;

具体原理写起来不方便,直接参考视频:

https://www.bilibili.com/video/BV1Mb411e7re?p=35&vd_source=e2638d12685eef84cda913d9d67be0a9第1小时08分钟的位置;

1.1.2.5 AD/DA性能指标

51单片机(十六)AD/DA

1.2 XPT2046

XPT2046 也是一款AD转换器;电阻式触摸屏控制器;

51单片机(十六)AD/DA

XPT2046 时序

51单片机(十六)AD/DA

1.3 本节目标

目标1:AD模数转换
LCD1602上分别显示可调电阻、热敏电阻和光敏电阻的AD值,如下图所示
51单片机(十六)AD/DA

三个硬件在开发板上的位置如下图:
51单片机(十六)AD/DA

调节可调电阻时,LCD1602上显示的可调电阻的发声变化,最小0,最大255:,如下图

51单片机(十六)AD/DA

51单片机(十六)AD/DA

同样的,热敏电阻和光敏电阻的阻值发生变化时,LCD1602上显示的也发生变化;

目标2:DA数模转换

使开发板上DA输出的LED灯呈现呼吸灯的状态:

51单片机(十六)AD/DA

二、AD模数转换

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\16-1 AD模数转换

具体代码:文章来源地址https://www.toymoban.com/news/detail-446260.html

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "XPT2046.h"

unsigned int ADValue;

void main(void)
{
	LCD_Init();
	LCD_ShowString(1,1,"ADJ  NTC  GR");
	while(1)
	{
		ADValue=XPT2046_ReadAD(XPT2046_XP);		//读取AIN0,可调电阻
		LCD_ShowNum(2,1,ADValue,3);				//显示AIN0
		ADValue=XPT2046_ReadAD(XPT2046_YP);		//读取AIN1,热敏电阻
		LCD_ShowNum(2,6,ADValue,3);				//显示AIN1
		ADValue=XPT2046_ReadAD(XPT2046_VBAT);	//读取AIN2,光敏电阻
		LCD_ShowNum(2,11,ADValue,3);			//显示AIN2
		Delay(100);
	}
}

XPT2046.c:

#include <REGX52.H>
#include <INTRINS.H>

//引脚定义
sbit XPY2046_DIN=P3^4;
sbit XPY2046_CS=P3^5;
sbit XPY2046_DCLK=P3^6;
sbit XPY2046_DOUT=P3^7;

/**
  * @brief  ZPT2046读取AD值
  * @param  Command 命令字,范围:头文件内定义的宏,结尾的数字表示转换的位数
  * @retval AD转换后的数字量,范围:8位为0~255,12位为0~4095
  */
unsigned int XPT2046_ReadAD(unsigned char Command)
{
	unsigned char i;
	unsigned int Data=0;
	XPY2046_DCLK=0;
	XPY2046_CS=0;
	for(i=0;i<8;i++)
	{
		XPY2046_DIN=Command&(0x80>>i);
		XPY2046_DCLK=1;
		XPY2046_DCLK=0;
	}
	for(i=0;i<16;i++)
	{
		XPY2046_DCLK=1;
		XPY2046_DCLK=0;
		if(XPY2046_DOUT){Data|=(0x8000>>i);}
	}
	XPY2046_CS=1;
	return Data>>8;
}

三、DA数模转换

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\16-2 DA数模转换

具体代码:

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

sbit DA=P2^1;

unsigned char Counter,Compare;	//计数值和比较值,用于输出PWM
unsigned char i;

void main()
{
	Timer0_Init();
	while(1)
	{
		for(i=0;i<100;i++)
		{
			Compare=i;			//设置比较值,改变PWM占空比
			Delay(10);
		}
		for(i=100;i>0;i--)
		{
			Compare=i;			//设置比较值,改变PWM占空比
			Delay(10);
		}
	}
}

void Timer0_Routine() interrupt 1
{
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;	//计数值变化范围限制在0~99
	if(Counter<Compare)	//计数值小于比较值
	{
		DA=1;		//输出1
	}
	else				//计数值大于比较值
	{
		DA=0;		//输出0
	}
}

到了这里,关于51单片机(十六)AD/DA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机——C51实验含Proteus仿真(AD转换器(数字电压表),DA转换器(波形发生器))

    分为两部分:AD转换器实现数字电压表,DA转换器实现波形发生器(在仿真部分详细说明) 所用到的原理图:  AD转换器实现数字电压表部分         需要打开main函数中LCD_init(),ADC(),display()三个注释其中电压的输出显示用到了LCD1602关于这部分详情见(96条消息) 单片机——

    2024年02月08日
    浏览(27)
  • 【单片机】15-AD和DA转换

    1.什么是AD转换? A(A,analog,模拟的,D,digital,数字的) 现实世界是模拟的,连续分布的,无法被分成有限份; 计算机世界是数字的,离散分布的,可以被分成有限份的 AD转换就是把一个物理量从模拟的转换成数字的。 2.AD转换的意义 想要计算机来实现现实世界 3.什么情

    2024年02月07日
    浏览(23)
  • 【【51单片机DA转换模块】】

    2024年02月14日
    浏览(15)
  • 单片机学习笔记---AD模数转换&DA数模转换

    目录 AD模数转换 XPT2046.c XPT2046.h main.c DA数模转换 main.c 上一篇博客讲了AD/DA转换的工作原理,也介绍了运算放大器的工作原理,这节开始代码演示! 新创建一个工程:AD模数转换 第一个工程将用到LCD1602和Delay函数,所以首先将我们之前讲过的代码模块添加进来 然后创建主程序

    2024年02月19日
    浏览(19)
  • 单片机第一季:零基础13——AD和DA转换

    51 单片机系统内部运算时用的全部是数字量,即0 和1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列0 和1 组成的二进制代码表示某个信号大小的量。用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多

    2024年02月13日
    浏览(22)
  • PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

    目录 1、PCF8591的引脚介绍  2、用IIC发送或接收字节              发送的第一个字节         发送的第二个字节   发送第三个字节     3.发送和接收的字节转换  4.全部代码 IIC部分 接收电压数据 发送电压数据                      在和单片机实际应用中它的

    2024年02月05日
    浏览(17)
  • 单片机学习笔记---AD/DA工作原理(含运算放大器的工作原理)

    目录 AD/DA介绍 硬件电路模型 硬件电路 运算放大器 DA原理 T型电阻网络DA转换器 PWM型DA转换器 AD原理 逐次逼近型AD转换器 AD/DA性能指标 XPT2046 XPT2046时序 AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号。有时候我们也把AD叫做ADC(C是转换器conv

    2024年02月22日
    浏览(23)
  • (十六)51单片机——红外遥控

    目录 学习目标 成果展示  硬件知识 简介 硬件电路 NEC编码 遥控器键码 外部中断  中断号 寄存器 代码  红外调控  直流电机 总结            本节知识我们来学习关于红外遥控的部分,重点要学习的是NEC编码和外部中断的知识,好了,让我们开始今天的学习吧! 红外遥

    2023年04月09日
    浏览(19)
  • 【【51单片机AD转换模块】】

    2024年02月15日
    浏览(18)
  • 51单片机课程设计——基于单片机的AD模数转换设计

    一、功能简介 1.A/D 是模拟量到数字量的转换,依靠的是模数转换器(AnalogtoDigitalConverter),简称ADC。D/A是数字量到模拟量的转换,依靠的是数模转换器(DigitaltoAnalogConverter),简称DAC。它们的道理是完全一样的,只是转换方向不同,因此我们讲解过程主要以A/D为例来讲解。

    2024年02月04日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包