江科大51单片机笔记【16】AD/DA转换(下)

news2025/4/22 12:24:17

写在前言


  此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识

  在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识,主要是为下章节的代码部分打基础。

  我的单片机是24年12月在tb普中买的,型号是STC89C52,在原视频中引脚或接口不对应的我都会改正,保证在我的机子上能运行才发上来的,还有一些文字部分是我的理解,并非照搬,所以可能有理解不到位的现象。

  如有误或交流,敬请指点提问

如果上一节的运放、电路图、结构图看不懂没关系,只需要看懂下面这个时序图就可以写代码实现功能了

一、AD模数转换

先导入之前写好的Delay和LCD1602模块,然后新建XPT2046点c和点h文件

接下来就是对照这个时序把数据读出来

1.先定义引脚

#include <REGX52.H>

sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DIN=P3^4;
sbit XPT2046_DOUT=P3^7;

 2.定义函数

给个参数(控制字),用于选择通道

并且定义一个变量ADAvalue,最后返回出来

 然后是根据上图对每个引脚先后赋值

首先把DCLK置0(初始化),CS置0,DIN赋值参数控制字的最高位
然后再给DCLK置1(上升沿),DIN就把最高位发出去,然后置0(下降沿),查看手册发现上下时间是ns级,所以不用延时

接下来就是同理依次把8个位发出去,用for循环实现

发出去之后就可以读数据了

接下来就是到图中这个位置,先给DCLK一个上升沿,一个下降沿,数据才会过来

进行一个判断,如果Dout为1,就让ADAValue把数据读出来(因为是16位所以或上0x8000)

然后对该过程循环16位,用for循环实现,因为只有12位是有数值的,后面都是零填充的,所以我们要在最后返回ADAValue的时候向右移位(如果选择8位读就移8位,12位读就移4位)

最后再把CS置高,结束这个时序,到这里就写完这个函数了

//XPT2046.c

#include <REGX52.H>

sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DIN=P3^4;
sbit XPT2046_DOUT=P3^7;

unsigned int XPT2046_ReadAD(unsigned char Command)
{
	unsigned char i;
	unsigned int ADValue=0;
	XPT2046_DCLK=0;
	XPT2046_CS=0;
	
	for(i=0;i<8;i++)
	{
		XPT2046_DIN=Command&(0x80>>i);
		XPT2046_DCLK=1;
		XPT2046_DCLK=0;
	}
	for(i=0;i<16;i++)
	{
		XPT2046_DCLK=0;
		XPT2046_DCLK=1;
		if(XPT2046_DOUT){ADValue|=(0x8000>>i);}
	}
	XPT2046_CS=1;
	if(Command&0x08)
	{
		return ADValue>>8;
	}
	else
	{
		return ADValue>>4;
	}
}
}

这里再讲一下命令字怎么写

S就是起始位,给1;A2A1A0是地址,选择通道;MODE就是模式选择位,=0是12位模式,=1是8位模式;SER/DFR也是选择模式,=1是单端模式,=0是差分模式,我们在这用单端模式;PD0和PD1表示掉电和内部参考电压配置的关系,若为11,处于供电状态,若为00,处于低功率模式(当PD1为0时关闭内部参考电压源,为1时打开,内部参考源作用即假设原本测量值是从0-5V,接到这就是2.5-5V)

在这里我们给1 A2 A1 A0 1 1 0 0,A2A1A0的选择要看下图

下图只看前面部分,A2A1A0控制测哪的电压

为了方便写代码,我们把上面这些值给宏定义,这里要根据开发板的原理图对应上图,以及前面教的命令字写出来,因为是要外部调用,所以写在.h文件里 

 我们定义不同的命令字,一个是8位,一个是12位,方便后面选择

8位是0-255,12位是0-4096,更精细

#ifndef __XPT0246_H_
#define __XPT0246_H_

#define XPT2046_XP_8       0X9C
#define XPT2046_YP_8        0XDC
#define XPT2046_VBAT_8        0XAC
#define XPT2046_AUX_8        0XEC

#define XPT2046_XP_12       0X94
#define XPT2046_YP_12       0XD4
#define XPT2046_VBAT_12       0XA4
#define XPT2046_AUX_12       0XE4


unsigned int XPT2046_ReadAD(unsigned char Command);


#endif

因为AUX接到了一个接口上,所以这里我们不读,只读其他三个

//main.c

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

unsigned int ADValue;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"ADJ NTC RG");
	while(1)
	{
 		ADValue=XPT2046_ReadAD(XPT2046_XP_8);
		LCD_ShowNum(2,1,ADValue,3);
 		ADValue=XPT2046_ReadAD(XPT2046_YP_8);
		LCD_ShowNum(2,5,ADValue,3);
 		ADValue=XPT2046_ReadAD(XPT2046_VBAT_8);
		LCD_ShowNum(2,9,ADValue,3);
		Delay(10);
	}
}

这里我需要把DS18B20拔掉才能显示正常,暂时还未找到原因 

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

unsigned int ADValue;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"ADJ  NTC  RG");
	while(1)
	{
 		ADValue=XPT2046_ReadAD(XPT2046_XP_8);
		LCD_ShowNum(2,1,ADValue,3);
 		ADValue=XPT2046_ReadAD(XPT2046_YP_8);
		LCD_ShowNum(2,6,ADValue,3);
 		ADValue=XPT2046_ReadAD(XPT2046_VBAT_8);
		LCD_ShowNum(2,11,ADValue,3);
		Delay(10);
	}
}

 这样就可以调节我们电路板上的电阻,然后会把阻值通过AD转换后输出在LCD上

GR是光敏电阻,NTC是热敏电阻,AD1(ADJ)是可调电阻

二、 DA数模转换

接下是PWM,因为跟之前写过的直流电机调速原理是一样的,所以我们复制过来创建一个新的工程

首先是更改接口

sbit DA=P2^1;

然后是更改命名,可以点这里一键替代

然后把关于按键的部分删掉,在主函数里实现一个呼吸灯的效果

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

sbit DA=P2^1;

unsigned char Counter,Compare;
unsigned char i;

void main()
{

	Timer0_Init();
	while(1)
	{
		for(i=0;i<100;i++)
		{
			Compare=i;
			Delay(10);
		}
		for(i=100;i>0;i--)
		{
			Compare=i;
			Delay(10);
		}
  }
}
void Timer0_Routine() interrupt 1
{
	Key_Loop();
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;
	if(Counter<Compare)
	{
		DA=1;
	}
	else
	{
		DA=0;
	}
}

其他部分都不需要改,这样就实现了呼吸灯的效果。

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

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

相关文章

Podman 运行redis 报错

Podman 运行redis 报错 一、报错内容 find: .: Permission denied chown: changing ownership of .: Permission denied二、问题分析 SELinux 模式 SELinux(Security-Enhanced Linux)是一种安全模块,旨在通过强制访问控制(MAC)来增强 Linux 系统的安全性。SELinux 具有…

基于深度学习的多模态人脸情绪识别研究与实现(视频+图像+语音)

这是一个结合图像和音频的情绪识别系统&#xff0c;从架构、数据准备、模型实现、训练等。包括数据收集、预处理、模型训练、融合方法、部署优化等全流程。确定完整系统的组成部分&#xff1a;数据收集与处理、模型设计与训练、多模态融合、系统集成、部署优化、用户界面等。详…

以太坊AI代理与PoS升级点燃3月市场热情,2025年能否再创新高?

币热网深度报道&#xff1a;以太坊AI代理与PoS升级引爆3月热潮&#xff0c;2025年能否再攀历史新高&#xff1f; 原文来源&#xff1a;币热网 - 区块链信息资讯平台 以太坊升级&#xff0c;市场热情高涨 近期&#xff0c;以太坊市场犹如被一股神秘力量点燃&#xff0c;掀起了…

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…

tomcat应用的作用以及安装,以及tomcat软件的开机自启动。

一.tomcat介绍 1.作用 tomcat是一款用来部署网站服务器的一款软件。 动态网站主流语言&#xff1a; PHP, lamp/lnmp平台 Java语言&#xff0c;运行在tomcat平台。【只要这个网站或者软件是Java语言写的&#xff0c;我们都可以在tomcat平台上去运行这个java程序。】 网站是…

Unity中WolrdSpace下的UI展示在上层

一、问题描述 Unity 中 Canvas使用World Space布局的UI&#xff0c;想让它不被3d物体遮挡&#xff0c;始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试&#xff08;ZTest&#xff09;&#xff0c;强制 UI 始终渲染在最上层。 Shader "Custo…

Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级

一、缓存雪崩&#xff1a; 1、什么是缓存雪崩&#xff1a; 如果缓在某一个时刻出现大规模的key失效&#xff0c;那么就会导致大量的请求打在了数据库上面&#xff0c;导致数据库压力巨大&#xff0c;如果在高并发的情况下&#xff0c;可能瞬间就会导致数据库宕机。这时候如果…

leetcode:728. 自除数(python3解法)

难度&#xff1a;简单 自除数 是指可以被它包含的每一位数整除的数。 例如&#xff0c;128 是一个 自除数 &#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right &#xff0c;返回一个列表&#xff…

vue3-computed计算属性和reactive响应式系统结合使用

1.前言 vue3中使用reactive函数创建一个响应式对象&#xff0c;当对象数据发生变化的时候&#xff0c;依赖这些数据的计算属性和模板会自动的更新。 2.实例 2.1 简写 <template><div><p>用户名: {{ userName }}</p><p>用户名的大写形式: {{ u…

Pycharm 社区版安装教程

找到安装包双击安装文件---点击下一步 一般路径是&#xff1a;C:\Rambo\Software\Development 选择完成后就是如下地址&#xff1a; C:\Rambo\Software\Development\PyCharm Community Edition 2024.3.3 点击上述3个位置就可以了----下一步 等待安装就可以了---完成后点击完成…

Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;六&#xff09;创建、管理和删除本地用戶和组 前言一、用户和组概念用户类型对比表格主要组和补充组对比表格&#xff1a; 二、本地用户账户增删改查三、本地组账户 前言 上篇博客我们详细了解了从红帽和 DNF 软件仓库下载…

分享vue好用的pdf 工具实测

vue3-pdf-app&#xff1a; 带大纲&#xff0c;带分页&#xff0c;带缩放&#xff0c;带全屏&#xff0c;带打印&#xff0c;带下载&#xff0c;带旋转 下载依赖&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类&#xff1a; 创建文件 pdfConfig.ts /…

Markdown Poster – 免费Markdown转图片工具|优雅图文海报制作与社交媒体分享

Markdown Poster是什么 Markdown Poster 是一款高效的 Markdown 转图片工具&#xff0c;利用灵活编辑和实时预览功能帮助用户轻松制作优雅的图文海报。该工具内置丰富的海报模板和多种主题选项&#xff0c;支持导出为图片和 HTML 代码&#xff0c;适用于社交媒体分享、网站集成…

掌握市场先机:9款销售渠道管理工具深度测评

本文主要介绍了以下9款销售渠道管理工具&#xff1a;1.纷享销客&#xff1b; 2.销帮帮&#xff1b; 3.小满CRM&#xff1b; 4.有赞&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

OpenCV图像加权函数:addWeighted

1 addWeighted函数 在OpenCV 里&#xff0c;addWeighted 函数的作用是对两个图像进行加权求和&#xff0c;常用于图像融合、图像过渡等场景。函数如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 参数解释 src1&#xff1a;第一个输入图…

docker桌面版启动redis,解决无法连接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录&#xff0c;里面有个redis.conf文件&#xff0c;内容如下&#xff0c;启动时绑定这个配置文件目…

Scratch 3.0安装包,支持Win7/10/11、Mac电脑手机平板、少儿便编程的启蒙软件。

Scratch是一款由麻省理工学院&#xff08;MIT&#xff09; 设计开发的少儿编程工具。其特点是&#xff1a;使用者可以不认识英文单词&#xff0c;也可以不使用键盘&#xff0c;就可以进行编程。构成程序的命令和参数通过积木形状的模块来实现。用鼠标拖动指令模块到脚本区就可以…

Navicat for Snowflake 震撼首发,激活数据仓库管理全新动能

近日&#xff0c;Navicat 家族迎来了一位全新成员 — Navicat for Snowflake。Snowflake 是一款基于云架构的现代数据仓库解决方案&#xff0c;以其弹性扩展、高性能和易用性著称。这次首发的Navicat for Snowflake 专为简化 Snowflake 数据库管理任务而精心打造。它凭借其直观…

深度学习基础:线性代数本质2——线性组合、张成的空间与基

目录 一、线性组合 1. 用一个有趣的角度看向量坐标 2. 如果我们选择不同的基向量会怎样&#xff1f; 3. 线性组合 4. 张成的空间 ① 二维向量的张成的空间 ② 三维向量的张成的空间​编辑 5.线性相关 6.线性无关 7. 基的定义 一、线性组合 1. 用一个有趣的角度看向量坐…

第五天 Labview数据记录(5.4 EXCEL文件读写)

5.4 EXCEL文件读写 Excel 文件读写在数据处理、自动化办公、数据分析等领域具有重要的意义。以下是 Excel 文件读写的主要应用场景和意义&#xff1a;1. 数据管理和整理&#xff1b;2. 自动化办公&#xff1b;3. 数据分析和可视化&#xff1b;4. 系统集成&#xff1b;5. 报表生…