【单片机】51单片机,TLC2543,驱动程序,读取adc

news2024/9/27 7:17:42

在这里插入图片描述
TLC2543 是一款 12 位精密模数转换器 (ADC)。

1~9、11、12——AIN0~AIN10为模拟输入端;

15——CS 为片选端;

17——DIN 为串行数据输入端;(控制字输入端,用于选择转换及输出数据格式)

16——DOUT为A/D转换结果的三态串行输出端;(A/D转换结果的输出端。)

19——EOC为转换结束端;

18——CLK为I/O时钟;(控制输入输出的时钟,由外部输入。)

14——REF+为正基准电压端;

13——REF-为负基准电压端;

20——VCC为电源;

10——GND为地。

/***********************************************************************
 * 说明:摇杆实验。摇动摇杆,查看显示屏上AD值变化。
 **********************************************************************/

#include "STC89C5xRC.h"                 /* 此文件中定义了单片机的一些特殊功能寄存器 */
#include "OLED.h"                       /* OLED头文件 */
/* #include "Codedat.h" */
#define uint	unsigned int            /* 对数据类型进行声明定义 */
#define uchar	unsigned char


sbit beep = P2 ^ 4;                     /* 定义蜂鸣器触发脚 */

/**************************************
 *      2543控制引脚宏定义
 *************************************/
sbit	CLOCK	= P3 ^ 5;               /*2543时钟*/
sbit	D_IN	= P4 ^ 0; /*2543输入*/    /* 【注意:此处是口袋实验室连接引脚】 */
sbit	D_OUT	= P0 ^ 2;               /*2543输出*/
sbit	_CS	= P3 ^ 4;               /*2543片选*/


sbit	DIG1	= P0 ^ 0;               /* 数码管位选1 */
sbit	DIG2	= P0 ^ 1;               /* 数码管位选2 */
sbit	key1	= P3 ^ 2;               /* 摇杆A按键 */
sbit	key2	= P3 ^ 3;               /* 摇杆B按键 */

#define led P1                          /* 将P1口定义为led 后面就可以使用led代替P0口 */


/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,本延时函数延时较短,可以较快刷新屏幕
*					 当然也可以使用OLED.h定义的delay_ms()函数
*******************************************************************************/
void delay( int ms )
{
    int ii, jj;
    if ( ms < 1 )
        ms = 1;
    for ( ii = 0; ii < ms; ii++ )
        for ( jj = 0; jj < 500; jj++ )
            ;
}


/*******************************************************************************
* 函 数 名         : read2543
* 函数功能		   : TLC2543驱动模块
* 输    入         : port		通道号
* 输    出         : ad			转换值
* 说    明         :请结合TLC2543芯片手册和下方注释理解
*******************************************************************************/
uint read2543( uchar port )
{
    uint ad = 0, i;
    CLOCK	= 0;
    _CS	= 0;
    port	<<= 4;                          /*选通道。高四位代表AD通道,低四位自动补0 */


    /*这里的for,其实就算_CS变低后,时钟IO_Clock和Data_Input使能,Data_Out脱离高阻状态。
     * 12个时钟信号依次输入。随着时钟信号的输入,控制字从Data_Input一位一位地在时钟信号上升沿时
     * 送入TLC2543(注意:高位先入),这里的控制字是通道选择(port),从A0-A10共11个通道,
     * (分别对应0000至1010,高四位就是存放模拟通道输入选择的数据)
     * 同时,上一周期转换的AD数据,即输出数据寄存器中的数据从Data_Out一位一位地移出(下降沿时)
     * (第一次_CS=0时输出第一位,其他的跟着for内的下降沿输出)*/

    for ( i = 0; i < 12; i++ )              /* 进行12次(12位)的数据推送 */
    {
        if ( D_OUT )
            ad |= 0x01;             /* 相当于每次检出输出1时。最低位就给1,否则给0 */
        D_IN	= (bit) (port & 0x80);  /* 相当于只取最高位进行与运算 */
        CLOCK	= 1;                    /* 电平抬高 */
        delay( 3 );                     /* 延时 */
        CLOCK = 0;                      /* 给低电平 */
        delay( 3 );                     /* 延时。这里是给一个完整周期的脉冲 */
        port	<<= 1;
        ad	<<= 1;                  /* 左移一位,为下一次for循环做准备 */
    }
    _CS	= 1;                            /* 片选端置高,则IO_Clock和Data_Input禁止,Data_Out高阻,EOC置高 */
    ad	>>= 1;                          /*上面最后一次for循环多移了一次现在移回来 */
    return(ad);                             /* 返回转换值 */
}


/*******************************************************************************
* 函 数 名         : ad_number
* 函数功能		   : AD值数值拆分函数
* 输    入         : i	通道   y 显示行坐标
* 输    出         : 无
*******************************************************************************/
void ad_number( uchar i, uchar y )
{
    uint ad;
    ad = read2543( i ); /* 这里得到的是AD值(0~4095) */
    OLED_ShowNum( 63, y, ad, 4, 16 );
}


/*******************************************************************************
* 函 数 名         : Int1Init()
* 函数功能		   : 设置外部中断1    [P3.3]
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int0Init()
{
    /* 设置INT0 */
    IT0	= 1;    /* 跳变沿出发方式(下降沿) */
    EX0	= 1;    /* 打开INT0的中断允许。 */
    EA	= 1;    /* 打开总中断 */
}


/*******************************************************************************
* 函 数 名         : Int1Init()
* 函数功能		   : 设置外部中断1    [P3.3]
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int1Init()
{
    /* 设置INT1 */
    IT1	= 1;    /* 跳变沿出发方式(下降沿) */
    EX1	= 1;    /* 打开INT1的中断允许。 */
    EA	= 1;    /* 打开总中断 */
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main( void )
{
    Int0Init();     /* 外部中断0初始化 */
    Int1Init();     /* 外部中断1初始化 */
    beep	= 0;    /* 蜂鸣器不响 */
    DIG1	= 0;    /* 禁止数码管十位亮 */
    DIG2	= 0;    /* 禁止数码管个位亮 */
    delay( 300 );   /*上电后等待系统稳定 */
    OLED_Init();    /* OLED初始化 */

    OLED_ShowString( 24, 0, "A-X:", 16 );
    OLED_ShowString( 24, 2, "A-Y:", 16 );
    OLED_ShowString( 24, 4, "B-X:", 16 );
    OLED_ShowString( 24, 6, "B-Y:", 16 );

    led = 0xff;     /* LED全灭 */

    while ( 1 )
    {
        ad_number( 7, 4 );

        ad_number( 8, 2 );

        ad_number( 9, 0 );

        ad_number( 10, 6 );
    }
}


/*******************************************************************************
* 函 数 名         : Int0()	interrupt 0
* 函数功能		   : 外部中断1的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Int0()

interrupt 0                     /* 外部中断1的中断函数 */
{
delay( 40 );            /* 延时消抖 */
if ( key1 == 0 )        /* 如果按键按下 */
{
beep = ~beep;   /* 蜂鸣器响/不响 */
}
}


/*******************************************************************************
* 函 数 名         : Int1()	interrupt 2
* 函数功能		   : 外部中断1的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int1() interrupt 2         /* 外部中断1的中断函数 */
{
delay( 40 );            /* 延时消抖 */
if ( key2 == 0 )        /* 如果按键按下 */
{
led = ~led;     /* LED全亮/灭 */
}
}



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

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

相关文章

完全背包问题

题目链接 题意&#xff1a;在01背包的基础上多了每个物品都可以无限取的条件 思路&#xff1a;首先考虑在01背包的基础上的暴力枚举&#xff0c;我们可以在枚举前i件物品最多拿j的容量时再遍历当前物品拿的数量 贴一个暴力tle代码&#xff1a; #include<bits/stdc.h> #d…

线程间的同步、如何解决线程冲突与死锁

一、线程同步概念&#xff1a; 线程同步是指在多线程编程中&#xff0c;为了保证多个线程之间的数据访问和操作的有序性以及正确性&#xff0c;需要采取一些机制来协调它们的执行。在多线程环境下&#xff0c;由于线程之间是并发执行的&#xff0c;可能会出现竞争条件&#xf…

VUE框架:vue2转vue3全面细节总结(2)导航守卫

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

学习源码,模仿编程

一.观察者模式: 1.创建事件 2.发布事件 3.监听事件 4.效果: 二.模板方法模式

【云原生】使用kubeadm搭建K8S

目录 一、Kubeadm搭建K8S1.1环境准备1.2所有节点安装docker1.3所有节点安装kubeadm&#xff0c;kubelet和kubectl1.4部署K8S集群1.5所有节点部署网络插件flannel 二、部署 Dashboard 一、Kubeadm搭建K8S 1.1环境准备 服务器IP配置master&#xff08;2C/4G&#xff0c;cpu核心…

如何下载和编译 Android 源码?

本文为洛奇看世界(guyongqiangx)原创&#xff0c;转载请注明出处。 文章链接&#xff1a;https://blog.csdn.net/guyongqiangx/article/details/132125431 网上关于如何下载 Android 源码和编译的文章很多&#xff0c;其中最常见的就是 Android 官方文档&#xff1a; 下载源代码…

前端js--扩展卡片

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet" href"…

谈一谈Python中的装饰器

1、装饰器基础介绍 1.1 何为Python中的装饰器&#xff1f; Python中装饰器的定义以及用途&#xff1a; 装饰器是一种特殊的函数&#xff0c;它可以接受一个函数作为参数&#xff0c;并返回一个新的函数。装饰器可以用来修改或增强函数的行为&#xff0c;而不需要修改函数本身…

使用JProfiler进入JVM分析

要评测JVM&#xff0c;必须将JProfiler的评测代理加载到JVM中。这可以通过两种不同的方式发生&#xff1a;在启动脚本中指定-agentpath VM参数&#xff0c;或者使用attach API将代理加载到已经运行的JVM中。 JProfiler支持这两种模式。添加VM参数是评测的首选方式&#xff0c;集…

拥抱创新:用Kotlin开发高效Android应用

拥抱创新&#xff1a;用Kotlin开发高效Android应用 引言 在当今数字时代&#xff0c;移动应用已经成为人们生活中不可或缺的一部分。无论是社交媒体、电子商务还是健康管理&#xff0c;移动应用已经深刻地影响了我们的生活方式。随着移动设备的普及和功能的增强&#xff0c;A…

【JAVA】类和对象

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

高项V4.高级PM.项目集set+项目组合portfolio+组织级OPM+量化项目管理+实践模型

PMI &#xff0c; ITSS 、CMMI 和PRINCE2 等为各类信息系统项目管理提供了最佳实践&#xff0c;井提供了对组织的项目管理能力进行持续改进和评估的方法。 第一部分 项目集--《项目集管理标准>> (第4 版) ---实现项目11>2的更大效益 由项目管理协会(PMI) 出版的《…

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 模板匹配文件 主程序(ocr_template_match.py) # 导入工具包 from imutils import contours # 从…

算术逻辑单元(ALU)(数电、加法器)

优先级&#xff1a;与>或 异或电路 依旧需要一级级的传递&#xff0c;后算完才能前传

[oeasy]python0079_控制序列_光标位置设置_ESC_逃逸字符_CSI

光标位置 回忆上次内容 上次我们研究的比较杂 类型转化进制转化捕获异常版本控制生成帮助文档变量的常用类型变量的生命周期控制 数据类型主要研究了两个 字符串 str 整型数字 int 字符串型 和 整型数字型变量 是可以相互转化的 加法运算逻辑 会根据操作变量的不同 而不同…

针对java程序员的了解细节操作系统与进程

一、&#x1f49b; 操作系统&#xff08;浅浅概念&#xff09;&#xff1a;是用来搞管理软件的 1.对下,要管理各种硬件设备 2.对上,要给应用程序提供一个稳定的运行环境 二、&#x1f499; 进程&#xff1a;正在运行的程序&#xff0c;假如程序没有运行就不叫程序&#xff0c;…

如何在终端设置代理(设置jupyter notebook同理)

设置代理 在终端(我用的gitbash)下执行 set HTTP_PROXYhttp://<user>:<password><proxy server>:<proxy port> set HTTPS_PROXYhttp://<user>:<password><proxy server>:<proxy port>其中&#xff1a; user、password&#…

LabVIEW开发3D颈动脉图像边缘检测

LabVIEW开发3D颈动脉图像边缘检测 近年来&#xff0c;超声图像在医学领域对疾病诊断具有重要意义。边缘检测是图像处理技术的重要组成部分。边缘包含图像信息。边缘检测的主要目的是根据强度和纹理等属性识别图像中均匀区域的边界。超声&#xff08;US&#xff09;图像存在视觉…

SpringMVC视图

SpringMVC视图 视图的作用是渲染数据&#xff0c;将模型Model中的数据展示给客户&#xff0c;SpringMVC中视图的种类有很多&#xff0c;默认有转发视图(InternalResourceView)和重定向视图(RedirectView)。 当工程引入jstl的依赖&#xff0c;转发视图会自动跳转jstlView,若使用…

11.物联网操作系统内存管理

一。STM32编译过程及程序组成 STM32编译过程 程序的组成、存储与运行 MDK生成的主要文件分析 1.STM32编译过程 1.源文件&#xff08;Source code&#xff09;--》目标文件&#xff08;Object code&#xff09; .c(C语言)通过armcc生成.o&#xff0c;.s&#xff08;汇编&…