51单片机-ADC模数转换实验-电压值

一 主要知识点及分析:

        1.这里是用到的XPT2046芯片,芯片详细说明自行查阅;

        2.这里有两种模式,一般外设的转换用的是单端模式,在使用触摸屏的时候我们选择差分模式;

        3.这张图有就是时序图,读写都需要在这上面进行编写代码,

        3.1 写8位代码:主要是将传入的控制命令进行写入;

        3.2 读12位代码;将模拟数据读出来;

        3.3 AD数据转换代码:

二 源代码:

        2.1 代码的格式:

2.2 main.c文件:

#include "public.h"
#include "smg.h"
#include "xpt2046.h"

//主函数
int main()
{
    u8 acd_buf[3];
    u16 acd_vloue = 0;
    float acd_vol; //ACD电压值

    while(1)
    {
         acd_vloue = xpt2046_read_adc_value(0x94); // 测量电位器    
        acd_vol =5.0 * acd_vloue / 4096; //将读取的 AD 值转换为电压
        acd_vloue = acd_vol*10; //放大10倍,即保留小数点一位
        acd_buf[0] = smg_Buf[acd_vloue/10]|0x80;
        acd_buf[1] = smg_Buf[acd_vloue%10];
        acd_buf[2] = 0x3e;//显示99单位 V
        smg_display(acd_buf,6);
    }
    return 0;
}

2.3 public.c文件:

#include "public.h"

void delay_10us(u16 time_num_us) //延时函数定义, time_num_us=1;延时10us;
{
    while(time_num_us--);
}

void delay_ms(u16 time_num_us) //延时函数定义, time_num_us=1;延时1ms;
{    
    int i = 0;
    int j = 0;
    for(i = 0; i < time_num_us; i++)
        for(j = 101; j > 0; j--);
}

2.4 public.h文件:

#ifndef _public_H
#define _public_H

#include "reg52.h"

typedef unsigned char u8; //将系统默认的数据类型进行重定义
typedef unsigned int u16;
typedef unsigned int u32;

void delay_10us(u16 time_num_us); //10us延时函数声明
void delay_ms(u16 time_num_us);   //1ms延时函数声明

#endif

2.5 smg.c文件:

#include "smg.h"


//定义动态数码管显示0-F数组
u8 smg_Buf[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//动态数码管显示函数定义
void smg_display(u8 dat[], u8 pos)
{
    u8 i = 0;

    u8 pos_temp = pos-1; //将输入的数码管第几位然后减1

    for(i = 0; i < 8; i++)
    {
        switch(i)//位选
        {
            case 0: LSC = 1; LSB = 1; LSA = 1; break;
            case 1: LSC = 1; LSB = 1; LSA = 0; break;
            case 2: LSC = 1; LSB = 0; LSA = 1; break;
            case 3: LSC = 1; LSB = 0; LSA = 0; break;
            case 4: LSC = 0; LSB = 1; LSA = 1; break;
            case 5: LSC = 0; LSB = 1; LSA = 0; break;
            case 6: LSC = 0; LSB = 0; LSA = 1; break;
            case 7: LSC = 0; LSB = 0; LSA = 0; break;
        }

        Nixie_Tube_Port = dat[i-pos_temp];//传送段选数据
        delay_10us(100);//延时一段时间,等待显示稳定
        Nixie_Tube_Port = 0x00;
    
    }    
}
 

2.6 smg.h文件:

#ifndef _smg_H
#define _smg_H

#include "public.h"

#define Nixie_Tube_Port P0//通过宏定义数码管的P0端口

sbit LSA = P2^2; //定义74HC138驱动端口
sbit LSB = P2^3;
sbit LSC = P2^4;

//动态数码管显示函数声明
void smg_display(u8 dat[], u8 pos);

//定义动态数码管显示0-F数组声明
extern u8 smg_Buf[17];
           
#endif 

2.7 xpt2046.c文件:

#include "xpt2046.h"
#include "intrins.h"

//adc写8位函数定义
void xpt2046_adc_write(u8 dat)
{
    u8 i = 0;
    DCLK = 0;
    _nop_();

    for(i = 0; i < 8; i++) //循环 8 次,每次传输一位,共一个字节
    {
        DIN=dat>>7; //先传高位再传低位
        dat <<= 1;  //将低位移到高位

        DCLK = 1;   //CLK 由低到高产生一个上升沿,从而写入数据
        _nop_();
        DCLK = 0;
        _nop_();
            
    }        
}
//adc读12位函数定义
u16 xpt2046_adc_read(void)
{
    u8 i = 0;
    u16 dat = 0;

    DCLK = 0;
    _nop_();
    
    for(i = 0; i < 12; i++) //循环 12 次,每次读取一位,大于一个字节数,所以返回值类型是 u16
    {
        dat <<= 1;
        DCLK = 1;
        _nop_();
        DCLK = 0; //CLK 由高到低产生一个下降沿,从而读取数据
        _nop_();
        dat |= DOUT; //先读取高位,再读取低位。
            
    }
    return dat;
                
}
//XPT2046读AD数据函数定义
u16 xpt2046_read_adc_value(u8 cmd) //u8 cmd这里是传入命令字节
{
    u8 i = 0;
    u16 acd_vloue = 0;

    CS = 0; //先拉低时钟
    xpt2046_adc_write(cmd); //发送命令字节
    for(i = 6; i > 0; i--); //延时等待转换结果
    DCLK = 1;
    _nop_();
    DCLK = 0; //发送一个时钟,清除BUSY
    _nop_();
    acd_vloue = xpt2046_adc_read();
    CS = 1; //关闭xpt2046
    return acd_vloue;        
}

2.8 xpt2046.h文件

#ifndef _xpt2046_H
#define _xpt2046_H

#include "public.h"

sbit DOUT = P3^7;//定义ET20465端口
sbit DIN = P3^4;
sbit CS = P3^5;
sbit DCLK = P3^6;

u16 xpt2046_read_adc_value(u8 cmd);//XPT2046读AD数据函数声明

#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# Solidworks二次开发:相机访问相关API详解

大家好&#xff0c;今天要介绍的API为相机相关的API&#xff0c;这篇文章比较适合女孩子&#xff0c;学会了相机就会拍照了&#xff0c;哈哈。 下面是要介绍的API: &#xff08;1&#xff09;第一个为GetFocalDistance&#xff0c;这个API的含义为获取相机的焦距&#xff0c;…

光速论文靠谱不 #学习方法#笔记

光速论文是一款优秀的论文写作工具&#xff0c;许多学生和学者都对它赞不绝口。那么&#xff0c;光速论文靠谱吗&#xff1f;答案当然是肯定的&#xff01; 首先&#xff0c;光速论文具有强大的查重和降重功能。它能够帮助用户快速检测论文中的抄袭内容&#xff0c;并提供专业的…

小程序变更主体影响使用吗?

小程序迁移变更主体有什么作用&#xff1f;有些小程序开发者&#xff0c;因为业务调整&#xff0c;或者公司更换&#xff0c;需要更换小程序主体&#xff01;但是很多开发者对于小程序更换主体的操作流程并不熟悉&#xff0c;于是我们专门准备了这篇&#xff0c;关于小程序更换…

2024年航海制造工程与海洋工程国际会议(ICNMEME2024)

2024年航海制造工程与海洋工程国际会议(ICNMEME2024) 会议简介 2024年航海制造工程与海洋工程国际会议(ICNMEME2024)旨在将研究人员、工程师、科学家和行业专业人士聚集在一个开放论坛上&#xff0c;展示他们在导航制造工程与海洋工程领域的激励研究和知识转移理念。然而&…

嵌入式MCU BootLoader开发配置详细笔记教程

目录 一、BootLoader基础 二、BootLoader原理及配置 三、BootLoader程序 bootloader.h bootloader.c 四、Application1 用户程序 application1.h application1.c 五、Application2 用户程序 application2.h 六、程序运行效果 七、工程文件Demo 一、BootLoader基础 …

C++ | Leetcode C++题解之第29题两数相除

题目&#xff1a; 题解&#xff1a; class Solution { public:int divide(int dividend, int divisor) {// 考虑被除数为最小值的情况if (dividend INT_MIN) {if (divisor 1) {return INT_MIN;}if (divisor -1) {return INT_MAX;}}// 考虑除数为最小值的情况if (divisor I…

C++ 之 【类与对象】从入门到精通一条龙服务 最终篇(static成员、友元、匿名对象。。。)

&#x1f4b4;到用时方恨早&#xff0c;白首方悔挣的少 车到山前没有路&#xff0c;悬崖勒马勒不住 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 3.explicit关键字 二、Static成员 1.概念 2.特性 三、友元 1.友元函数 2.友元类 四、内部类 五、匿名对象 六、…

项目5-博客系统5+程序部署(Linux基本使用)

1.Linux的基本使用 1.1 Linux 是什么 Linux 是⼀个操作系统. 和 Windows 是 "并列" 的关系. 1.2 Unix & Linux 发展历程图 1.1969−1970 年, ⻉尔实验室的 Dennis Ritchie (左) 和 Ken Tompson (右) 开发了 Unix 操作系统. 2. Unix ⽕了之后, 衍⽣出很多的分⽀…

jvm参数介绍

JVM参数是指在Java应用程序启动时&#xff0c;通过命令行或者配置文件等方式传递给JVM的一些参数和选项。这些参数主要用于配置JVM的内存、垃圾回收、线程等相关参数。下面是一些常见的JVM参数简介&#xff1a; 1. -Xmx&#xff1a;设置应用程序可使用的最大内存量&#xff0c;…

C++ | Leetcode C++题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> findSubstring(string &s, vector<string> &words) {vector<int> res;int m words.size(), n words[0].size(), ls s.size();for (int i 0; i < n && i m …

文献阅读:Viv:在 web 上多尺度可视化高分辨率多重生物成像数据

文献介绍 「文献题目」 Viv: multiscale visualization of high-resolution multiplexed bioimaging data on the web 「研究团队」 Nils Gehlenborg&#xff08;美国哈佛医学院&#xff09; 「发表时间」 2022-05-11 「发表期刊」 Nature Methods 「影响因子」 47.9 「DOI…

GitHub repository - Code - Issues - Pull Requests - Wiki

GitHub repository - Code - Issues - Pull Requests - Wiki 1. Code2. Issues3. Pull Requests4. WikiReferences 1. Code 显示该仓库中的文件列表。仓库名下方是该仓库的简单说明和 URL. 2. Issues 用于 BUG 报告、功能添加、方向性讨论等&#xff0c;将这些以 Issue 形式进…

初识DOM

目录 前言: 1.初识DOM: 1.1DOM树: 1.2节点&#xff08;Node&#xff09;: 1.2.1元素节点&#xff1a; 1.2.2属性节点&#xff1a; 1.2.3文本节点&#xff1a; 1.3Document对象: 2.操作网页元素: 2.1找出元素&#xff1a; 2.1.1document.getElementById(id)&#xff1…

【入门】时钟旋转

时间限制 : 1 秒 内存限制 : 128 MB 时钟上面的时针从m时走到n时旋转了多少度&#xff1f;&#xff08;m<n&#xff0c;且m和n都是1~12之间的整数&#xff09; 输入 2个整数m和n 输出 一个整数代表时针旋转的度数 样例 输入 1 4 输出 90 提示 基础问题 #includ…

2011年认证杯SPSSPRO杯数学建模A题(第二阶段)客机水面迫降时的姿态全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 A题 客机水面迫降时的姿态 原题再现&#xff1a; 2009 年 1 月 15 日下午&#xff08;美国东部时间&#xff09;&#xff0c;US Airways 所属第 1549 航班&#xff08;空中客车 A320 客机&#xff09;在起飞后不久在纽约哈德逊河紧急迫降。经及…

Android MVVM架构学习——ViewModel DataBinding

关于MVVM架构&#xff0c;我并不想花篇幅去做重复性的描述&#xff0c;网上一搜都是一堆讲解&#xff0c;大家可以自行了解&#xff0c;我所做的只是以最简单的例子&#xff0c;最有效的步骤&#xff0c;从零开始&#xff0c;去实现一个相对有点学习参考价值的项目。 先来看本…

鸿蒙开发快速入门

基本概念 ArkTS 因为ArkTS是基于Type Script扩展而来&#xff0c;是Type Script的超集&#xff0c;所以也可以关注一下Type Script的语法来理解ArkTS的语法 ArkUI HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架…

Cohere Command R+:企业级可扩展大模型

Command R 是一种最先进的 RAG 优化模型&#xff0c;旨在处理企业级工作负载&#xff0c;并首先在 Microsoft Azure 上提供 今天&#xff0c;我们推出了 Command R&#xff0c;这是我们最强大、可扩展的大型语言模型 &#xff08;LLM&#xff09;&#xff0c;专为在实际企业用…

Go语言图像处理深入指南:探索 `image/draw` 标准库

Go语言图像处理深入指南&#xff1a;探索 image/draw 标准库 引言基础知识图像类型颜色模型draw 包概览 image/draw 的基本用法创建和操作图像复制和粘贴图像遮罩和图像合成 高级技巧自定义图像处理性能优化多线程图像处理 实战案例图像滤镜实现动态图像生成图像处理工具开发 总…

2024年MathorCup妈妈杯C题终极资料分享(微调后可直接提交的数据结果+多种可视化呈现)

【腾讯文档】2024年妈杯认证杯资料汇总说明 https://docs.qq.com/doc/DSExyRGhNUm1pTHh4 我们直接将我们认为最为合适数据结果以及最好用的运行代码进行了整理以便大家可以在最后一天无法运行代码急需结果或者不会写代码时&#xff0c;提供帮助。、 % 数据加载 data readtab…