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

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

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

    2024年02月04日
    浏览(25)
  • 单片机第一季:零基础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)
  • 单片机——C51实验含Proteus仿真(AD转换器(数字电压表),DA转换器(波形发生器))

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

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

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

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

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

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

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

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

    2024年02月14日
    浏览(15)
  • 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日
    浏览(22)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包