单片机学习笔记---AD模数转换&DA数模转换

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

目录

AD模数转换

XPT2046.c

XPT2046.h

main.c

DA数模转换

main.c


上一篇博客讲了AD/DA转换的工作原理,也介绍了运算放大器的工作原理,这节开始代码演示!

AD模数转换

新创建一个工程:AD模数转换

第一个工程将用到LCD1602和Delay函数,所以首先将我们之前讲过的代码模块添加进来

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

然后创建主程序main.c,XPT2046.c,XPT2046.h文件。

开始代码讲解:

XPT2046.c

首先根据原理图重定义引脚:

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

#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;

 接下来就根据上一篇博客讲过的这个时序来定义函数

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

将DLCK拉高有立马拉低的过程中,手册上显示这些过程基本都是纳秒级别的,而我们单片机IO口的翻转周期是1微秒这么长,足够操作这些过程了。

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

将命令字节发送结束后时序就完成到这了

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

然后由于下降沿是表示读出,所以我们要读取数据之后首先将DCLK拉高,再来一个下降沿,数据才会过来。

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

unsigned int XPT2046_ReadAD(unsigned char Command)
{
	unsigned char i;//发送/读取的次数
	unsigned int Data=0;//数据
	
	XPY2046_DCLK=0;//片选之前先初始化一下DCLK
	//这一步不写也没关系,因为每次任务结束之后DCLK都会拉低到低电平的。
	
	XPY2046_CS=0;//片选
	
	//反复8次发送命令字的8位数据
	for(i=0;i<8;i++)
	{
		XPY2046_DIN=Command&(0x80>>i);//将命令字8位数据从左往右依次放到DIN线上
		XPY2046_DCLK=1;//DCLK拉高时输入数据
		XPY2046_DCLK=0;//立马拉低这个过程是1us,足够发送一位数据了。
	}
	
	//发送命令字的整个时间肯定超过TACO这个时间了,
	//所以读取之前可以不延时。
	
	//反复16次读取两个字节
	for(i=0;i<16;i++)
	{
		XPY2046_DCLK=1;//下降沿是表示读出,所以首先将DCLK拉高,
		XPY2046_DCLK=0;//再来一个下降沿,数据才会过来
		
		//如果XPY2046_DOUT=1就把1赋值给Data,
		//从左往右依次判断XPY2046_DOUT的16位数据并赋值给Data
		if(XPY2046_DOUT){Data|=(0x8000>>i);}
	}
	XPY2046_CS=1;//释放CS
	if(Command&0x08)//如果命令字的第5位是1表示是在8位转换的模式下
	{
		return Data>>8;//在8位转换的模式下,要把最终的数据右移8位截取低8位的数据
	}
	else
	{
		return Data>>4;//在12位转换的模式下,要把最终的数据右移4位截取低12位的数据
	}
}

在8位转换的模式下,要把最终的数据右移8位截取低8位的数据。

在12位转换的模式下,要把最终的数据右移4位截取低12位的数据。

读取数据时,后面的四位0填充可以不读,那么读取数据时直接i<12,也可以读出来再右移。

最后我们只要调用这个函数就可以得到AD值(范围:8位为0~255,12位为0~4095)。

XPT2046.h

接下来我们看一下命令字怎么写:

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

XPT2046芯片手册上的介绍:

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

PD1还选择内部的参考电压,如果给它1就选择内部参考电压2.5V,它就对2.5V进行等分。但是我们一般不用内部参考电压,我们用外部电压,PD1=0就外部参考电压,就是原理图的上的VREF,为5V。

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

我们的开发板上的这个ADC模块利用的是单端模式,SER/DFR=1

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

A2,A1,A0的配置要看这个表

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

A2,A1,A0组合选择,我们只要主要看表的前半部分就可以

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

PS:YN是-Y,XP是+X,YP是+Y

如果说我们要测+X的话,就把A2,A1,A0置为001或者011

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

如果想测电池电压(电池电压并不是测电池,它也当做是一个通用的AD)就将A2,A1,A0置为010

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

如果我们要测辅助输入的电压,就置为110

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

-Y端(YN)直接接地,不用测,所以直接不用管

如果我们要测YP(+Y),就置为101

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

最后我们配置的控制字一般是:

S=1(起始位)

A2,A1,A0=001或者011测+X(XP),010测VBAT,110测AUXIN,101测+Y(YP)

MODE=1/0 (8位转换和12位转换都可以试一下)

SER/DFR=1(单端模式)

PD1=0(外部参考电压)

PD0=0(低功耗模式)

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

为了方便,我们直接将这8位数据组合起来的命令字加一个宏定义,要用的时候可以直接调用就好了(声明为外部可调用)

#ifndef __XPT2046_H__
#define __XPT2046_H__

//选择8位转换模式
#define XPT2046_VBAT_8	    0xAC
#define XPT2046_AUX_8		0xEC
#define XPT2046_XP_8		0x9C	//0xBC
#define XPT2046_YP_8		0xDC

//选择12位转换模式
#define XPT2046_VBAT_12	      0xA4
#define XPT2046_AUX_12		  0xE4
#define XPT2046_XP_12		  0x94	//0xB4
#define XPT2046_YP_12		  0xD4

unsigned int XPT2046_ReadAD(unsigned char Command);

#endif

main.c

接下来就分别测电位器,热敏电阻和光敏电阻

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

PS:电位器就是可调电阻

我们将定义好的命令字对应传给我们XPT2046_ReadAD()函数,然后它结果显示在LCD1602液晶屏上

#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");
	//第一行显示"ADJ  NTC  GR"分别表示可调电阻,热敏电阻,光敏电阻
	while(1)
	{
		ADValue=XPT2046_ReadAD(XPT2046_XP_12);		//读取AIN0,可调电阻
		LCD_ShowNum(2,1,ADValue,4);				//显示AIN0
		ADValue=XPT2046_ReadAD(XPT2046_YP_12);		//读取AIN1,热敏电阻
		LCD_ShowNum(2,6,ADValue,4);				//显示AIN1
		ADValue=XPT2046_ReadAD(XPT2046_VBAT_12);	//读取AIN2,光敏电阻
		LCD_ShowNum(2,11,ADValue,4);			//显示AIN2
		Delay(100);
		//由于光敏电阻和热敏电阻非常敏感,
		//所以阻值变化非常快,读出来的数字电压变化也非常快
		//延迟是为了读出来的数据能够显示的时间长一点点,
		//这样我们就能看清数据,要不然数据变换更新太快我们都看不清楚。
	}
}

效果请看视频:

AD模数转换

以上就是AD数模转换的代码演示!

DA数模转换

接下来开始演示第二个代码,

新创建一个工程:DA数模转换

DA转换可以直接用PWM来实现,直接把之前写电机那一篇的程序添加进来修改一下。

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

main.c

首先是根据DA的原理图改IO口的定义

单片机学习笔记---AD模数转换&DA数模转换,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

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

sbit DA=P2^1;

然后将所有Motor都改成DA,我们实现一个呼吸灯的效果就好了,所以就不用独立键盘相关的配置了,全部删掉:

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
	}
}

 如果看不懂这里的话可以去看一下我这两篇博客,里面讲了PWM的原理和代码演示:

单片机学习笔记---直流电机驱动(PWM)-CSDN博客

单片机学习笔记---LED呼吸灯&直流电机调速-CSDN博客

 最终效果请看视频:(PS:手机录像的效果会有明显的屏闪)

DA数模转换

以上就是本篇的内容,源码会放在评论区,如有问题可评论区留言!文章来源地址https://www.toymoban.com/news/detail-827563.html

到了这里,关于单片机学习笔记---AD模数转换&DA数模转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 单片机学习笔记---AD/DA工作原理(含运算放大器的工作原理)

    单片机学习笔记---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日
    浏览(8)
  • 51单片机课程设计——基于单片机的AD模数转换设计

    51单片机课程设计——基于单片机的AD模数转换设计

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

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

    单片机第一季:零基础13——AD和DA转换

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

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

    PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

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

    2024年02月05日
    浏览(11)
  • 单片机——C51实验含Proteus仿真(AD转换器(数字电压表),DA转换器(波形发生器))

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

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

    2024年02月08日
    浏览(15)
  • 51单片机(十六)AD/DA

    51单片机(十六)AD/DA

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月05日
    浏览(7)
  • 【【51单片机AD/DA的分析】】

    【【51单片机AD/DA的分析】】

    模数转换 与 数模转换 运算放大器 DA的转换就是利用运算放大器实现的 输出电压v0=-(D7~D0)/256 x (VrefxRfb)/R D7~D0 就是我们控制的按键看输入多少 然后再划分256份 Vref是我们设置的一个基准电压 PWM 这种类型的方波 完全可以看成是一个交流和直流叠加而成的 回忆一下数电的东西

    2024年02月15日
    浏览(14)
  • PIC单片机之AD转换学习记录

    PIC单片机之AD转换学习记录

            首先,简单介绍一下AD原理。ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压,通过数值的方式表现出来。         以PIC16F877芯片为例,它是10位ADC,供电电压是5V,它能检测的电压也是0~5V(参考电压可以自己修改)。这就好理解了,

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

    2024年02月14日
    浏览(12)
  • 51单片机——ADC模数转换实验

    51单片机——ADC模数转换实验

    目录 一、功能描述 二、ADC介绍 2.1 逐次逼近型ADC转换原理 2.2 ADC的主要技术指标 三、XPT2046芯片介绍 3.1 XPT2046外部引脚 3.2 XPT2046的命令字 3.3 XPT2046时序图 四、测试文件test.c 五、实验现象         我们使用的 STC89C51单片机内部不含 ADC 接口,所以需要外接一个 ADC 转换芯片将

    2024年02月06日
    浏览(8)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包