当前位置: 首页 > news >正文

【【51单片机AD转换模块】】

代码是简单的,板子是坏的,电阻是识别不出来的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main.c

#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);				//显示AIN0ADValue=XPT2046_ReadAD(XPT2046_YP);		//读取AIN1,热敏电阻LCD_ShowNum(2,6,ADValue,3);				//显示AIN1ADValue=XPT2046_ReadAD(XPT2046_VBAT);	//读取AIN2,光敏电阻LCD_ShowNum(2,11,ADValue,3);			//显示AIN2Delay(100);}
}

delay.c

void Delay(unsigned int xms)		//@12.000MHz
{while(xms){unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);xms--;
}
}

LCD1602.c

#include <REGX52.H>//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()		//@12.000MHz 1ms
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init(void)
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0C);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{//字符是建立的数字到字符的映射//字符数组是存储字符变量的一个数组//char //想到c语言中的一个重要的问题 就是何为字符串//和何为字符数组 字符串是以\0收尾的//就是不停的判断我输入的最后一个是否是\0如果是就停止//遍历寻找法unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;unsigned char SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData('0'+SingleNumber);}else{LCD_WriteData('A'+SingleNumber-10);}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);}
}

delay.h

#ifndef _DELAY_H__
#define _DELAY_H__
void Delay(unsigned int xms);#endif

LCD1602.h

#ifndef __LCD1602_H_
#define __LCD1602_H_void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif

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

XPT2046.h

#ifndef __XPT2046_H__
#define __XPT2046_H__#define XPT2046_VBAT	0xAC
#define XPT2046_AUX		0xEC
#define XPT2046_XP		0x9C	//0xBC
#define XPT2046_YP		0xDCunsigned int XPT2046_ReadAD(unsigned char Command);#endif

相关文章:

【【51单片机AD转换模块】】

代码是简单的&#xff0c;板子是坏的&#xff0c;电阻是识别不出来的 main.c #include <REGX52.H> #include "delay.h" #include "LCD1602.h" #include "XPT2046.h"unsigned int ADValue;void main(void) {LCD_Init();LCD_ShowString(1,1…...

Longest Divisors Interval(cf)

题意&#xff1a;给定一个正整数n&#xff0c;求正整数的区间[l&#xff0c;r]的最大大小&#xff0c;使得对于区间中的每个i&#xff08;即l≤i≤r&#xff09;&#xff0c;n是i的倍数。给定两个整数l≤r&#xff0c;区间[l&#xff0c;r]的大小为r−l1&#xff08;即&#xf…...

配置文件、request对象请求方法、Django连接MySQL、Django中的ORM、ORM增删改查字段、ORM增删改查数据

一、配置文件的介绍 1.注册应用的 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,app01.apps.App01Config, ]################中间件###############…...

CTF学习路线指南(附刷题练习网址)

前言&#xff1a; PWN,Reverse&#xff1a;偏重对汇编&#xff0c;逆向的理解&#xff1b; Gypto&#xff1a;偏重对数学&#xff0c;算法的深入学习&#xff1b; Web&#xff1a;偏重对技巧沉淀&#xff0c;快速搜索能力的挑战&#xff1b; Mic&#xff1a;则更为复杂&…...

【Rust 基础篇】Rust默认泛型参数:简化泛型使用

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;其设计哲学是在不损失性能的前提下&#xff0c;保障代码的内存安全和线程安全。在Rust中&#xff0c;泛型是一种非常重要的特性&#xff0c;它允许我们编写一种可以在多种数据类型上进行抽象的代码。然而&…...

从源码分析Handler面试问题

Handler 老生常谈的问题了&#xff0c;非常建议看一下Handler 的源码。刚入行的时候&#xff0c;大佬们就说 阅读源码 是进步很快的方式。 Handler的基本原理 Handler 的 重要组成部分 Message 消息MessageQueue 消息队列Lopper 负责处理MessageQueue中的消息 消息是如何添加…...

shell编程 变量作用域

变量 变量赋值不用$&#xff0c;访问值时用$,赋值时两边不留空格&#xff0c;双引号括起来的变量被值替换{}标记变量开始和结束,变量名区分大小写&#xff0c;所有bash变量的值变量不区分类型&#xff0c;统一为字符串 变量类型 环境变量&#xff0c;子进程可以继承父进程环境…...

华为eNSP:isis的配置

一、拓扑图 二、路由器的配置 配置接口IP AR1&#xff1a; <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthe…...

FS.05-SAS-UP-Methodology

FS.05-SAS-UP-Methodology-v9.2.pdf 附录 D 数据处理审核 作为现场数据处理系统和支持流程审核的一部分&#xff0c;受审核方最好在审核日期之前准备一些 SAS 特定的测试数据文件。 本文件提供了建议的方法&#xff1b; 受审核方和审核团队将就每次审核的具体方法达成一致。 …...

Jmeter并发测试

基本步骤 1、新建线程组 测试计划右键——>添加——>线程&#xff08;用户&#xff09;——>线程组 2、 添加HTTP请求 线程组右键——>添加——>取样器——>HTTP请求 3、 添加HTTP信息头管理器 线程组右键——>添加——>配置元件——>HTTP信息头…...

【JVM】浅看JVM的运行流程和垃圾回收

1.JVM是什么 JVM&#xff08; Java Virtual Machine&#xff09;就是Java虚拟机。 Java的程序都运行在JVM中。 2.JVM的运行流程 JVM的执行流程&#xff1a; 程序在执行之前先要把java代码转换成字节码&#xff08;class文件&#xff09;&#xff0c;JVM 首先需要把字节码通过…...

使用低代码开发,需要注意哪些?

低代码平台的历史相对较短&#xff0c;大约始于 2000 年初&#xff0c;源于快速应用程序开发工具。随着低代码平台和工具的日益普及和优势&#xff0c;它不断发展以满足各种领域和角色的需求。 本文将研究各种低代码和无代码应用程序开发方法、业务用例、挑战和未来预测等。 一…...

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁 模拟抢券场景通过下面方法添加Synchronized锁来防止上述情况&#xff0c;如果上面是单体服务没有问题&#xff0c;但是如果项目是集群部署&#xff0c;会出现下面的问题&#xff0c;因为Synchronized是属于本地的锁端口8080和8081同时访问&#xf…...

压力测试-商场项目

1.压力测试 压力测试是给软件不断加压&#xff0c;强制其在极限的情况下运行&#xff0c;观察它可以运行到何种程度&#xff0c;从而发现性能缺陷&#xff0c;是通过搭建与实际环境相似的测试环境&#xff0c;通过测试程序在同一时间内或某一段时间内&#xff0c;向系统发送预…...

IDEA中文UT方法执行报错问题、wps默认保存格式

wps默认保存格式、IDEA中文UT方法执行报错问题 背景 1、wps修改文件后&#xff0c;编码格式从UTF-8-bom变成UTF-8&#xff08;notepad可以查看&#xff09;&#xff1b; 2、IDEA中文UT执行报错&#xff1a; 解决方案 1、语言设置中不要勾选 “Beta版。。。。” 2、cmd中执…...

Vue如何实现编程式导航声明方法,前进和后退导航

编程式导航声明方法&#xff0c;前进和后退导航 在router中设置路由导航跳转函数 只要发生跳转 导航的声明函数 访问控制系统如何形成 就这三种 导航守卫的案例&#xff0c;写一个Main.Vue 和login .Vue 后台主页 如果想要展示后台主页&#xff0c;就用这种方法 想实现路由跳转…...

torch.load 报错 ModuleNotFoundError 或 AttributeError

Python 3.11.3 (main, Apr 7 2023, 19:25:52) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin Type "help", "copyright", "credits" or "license" for more information.正常情况下&#xff0c;我们会使用 torch.save 保存模型的 …...

前端,js , Error in created hook: TypeError ,有bug了

怎么兄弟&#xff0c;遇到bug了&#xff1f;&#xff1f;&#xff1f;你开心吗&#xff0c;哈哈哈哈...

百度文心千帆大模型平台:企业级大模型服务的新航标

随着人工智能和大数据的快速发展&#xff0c;大模型平台正越来越受到各大企业和个人开发者的青睐。本文将以百度最新推出的文心千帆大模型平台为例&#xff0c;深入分析其在国家战略布局&#xff0c;经济发展趋势&#xff0c;市场变化动向和技术研发周期等方面的影响和应用。同…...

uniApp低功耗蓝牙一键开门、多对多查找、数组匹配数组、开锁

文章目录 htmlJavaScript坑 html <view class"m_t_36"><view class"w_50_ h_100 lh_100 m_l_a m_r_a bc_409eff radius_10 color_fff ta_c" click"openBluetoothAdapter()">一键开门</view> </view>JavaScript export…...

现货库存MAX3311EEUB+T由ADI推出的高性能、低功耗RS-232收发器芯片,专为便携式和高可靠性电子设备设计,在工业控制、通信终端及嵌入式系统中表现出色

MAX3311EEUBT‌ 是一款由ADI推出的高性能、低功耗RS-232收发器芯片&#xff0c;专为便携式和高可靠性电子设备设计&#xff0c;在工业控制、通信终端及嵌入式系统中表现出色 。核心性能参数‌协议兼容性‌&#xff1a;完全符合EIA/TIA-232标准&#xff0c;支持RS-232电平转换‌…...

文墨共鸣大模型在网络安全领域的应用:模拟攻击脚本分析与安全报告撰写

文墨共鸣大模型在网络安全领域的应用&#xff1a;模拟攻击脚本分析与安全报告撰写 最近和几个做安全的朋友聊天&#xff0c;他们都在抱怨同一个问题&#xff1a;每天面对海量的告警日志和五花八门的攻击脚本&#xff0c;分析起来耗时费力&#xff0c;写报告更是头疼。技术细节…...

汉码未来提醒大家:为什么说 “保技术” 才是最真的 “保就业”?

市场上很多培训机构宣传 “包就业”“保薪资”&#xff0c;但从行业真实规则来看&#xff0c;如果技术没有真正掌握&#xff0c;任何就业承诺都缺乏实际支撑。原因非常简单&#xff1a;技术面试无法造假。无论简历如何包装&#xff0c;面试官都会通过现场编码、项目细节追问、技…...

Claude Code 源码研究【第二弹】:智能体框架与大模型相互成就

在上一篇“Claude Code 源码研究&#xff1a;一个 while(true) 循环让大模型自己干活”之后&#xff0c;继续我们的研究——01自然语言引导能保证模型每次都听话吗&#xff1f;Claude Code 不靠 if-else 控制模型选哪个工具&#xff0c;而是靠 40 份精心撰写的"工具说明书…...

OpenClaw安全实践:Kimi-VL-A3B-Thinking本地化部署的数据边界保障

OpenClaw安全实践&#xff1a;Kimi-VL-A3B-Thinking本地化部署的数据边界保障 1. 为什么选择本地化部署&#xff1f; 去年夏天&#xff0c;我接手了一个医疗影像分析项目&#xff0c;需要处理大量患者CT扫描图像和诊断报告。最初尝试使用公有云API服务时&#xff0c;每次上传…...

M24LR64E-R双接口NFC标签驱动与嵌入式集成指南

1. 项目概述NFC Tag M24LR6E 是一款面向嵌入式系统的 Arduino 兼容库&#xff0c;专为驱动 Seeed Studio 推出的 Grove - NFC Tag 模块而设计。该模块核心芯片为 STMicroelectronics 的 M24LR64E-R&#xff0c;是一款高度集成的双接口&#xff08;IC RF&#xff09;近场通信标…...

事件驱动:为AI原生应用领域注入新活力

事件驱动&#xff1a;为AI原生应用领域注入新活力关键词&#xff1a;事件驱动、AI原生应用、事件流、实时响应、异步架构、微服务、事件溯源摘要&#xff1a;本文将带你走进「事件驱动」与「AI原生应用」的交叉领域&#xff0c;通过生活案例、技术原理解析和实战代码&#xff0…...

基于MATLAB的车牌识别之旅:模板匹配法实战

基于MATLAB&#xff0c;使用模板匹配法实现车牌的识别 具体包括将原图灰度化&#xff0c;边缘检测&#xff0c;腐蚀操作&#xff0c;车牌区域定位&#xff0c;车牌区域矫正&#xff0c;二值化&#xff0c;均值滤波&#xff0c;切割&#xff0c;字符匹配&#xff0c;最终显示车牌…...

收藏!小白程序员必看:轻松入门大模型核心概念MCP与Skill,解锁AI能力新姿势!

本文通过生活化比喻&#xff0c;深入浅出地解释了AI领域中的MCP和Skill两大核心概念。MCP如同AI世界的“USB接口”&#xff0c;是标准化的连接协议&#xff0c;让AI能调用外部工具&#xff1b;Skill则像“工作手册”&#xff0c;是工作规范/技能模板&#xff0c;告诉AI在不同场…...

别再手动量了!用Python+Open3D给BIM模型做‘CT扫描’,自动揪出施工误差(附完整代码)

BIM模型质量检测革命&#xff1a;PythonOpen3D实现毫米级施工误差智能分析 施工现场的质量控制一直是建筑行业的核心痛点。传统靠人工抽检的方式不仅效率低下&#xff0c;还容易遗漏隐蔽问题。想象一下&#xff0c;如果能把BIM模型当作"数字孪生体"&#xff0c;用三维…...