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

在这里插入图片描述
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 charsbit 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.rhkb.cn/news/81535.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity进阶--使用PhotonServer实现服务端和客户端通信--PhotonServer(一)

文章目录 Unity进阶--使用PhotonServer实现服务端和客户端通信服务器的安装和配置添加日志客户端的配置客户端和服务器的通信Dlc 出现vscode引用不好使的时候 Unity进阶–使用PhotonServer实现服务端和客户端通信 服务器的安装和配置 Photon的地址&#xff1a;https://www.ph…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

RESTful

RESTful 简介 REST&#xff08;Representational State Transfer&#xff09;:表现层资源状态转移 ①资源 资源是一种看待服务器的方式&#xff0c;即&#xff0c;将服务器看作是由很多离散的资源组成。每个资源是服务器上可命名的抽象概念。因为资源是一种抽象概念&#xff0…

vue3获得url上的参数值

1、引入 import { useRoute } from vue-router2、获得const route useRoute() console.log(route.query.number)

el-table实现指定列合并

table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组&#xff0c;第一个元素代表rowspan&#xff0c;第二个元素…

HTML 初

前言 HTML的基本骨架 HTML基本骨架是构建网页的最基本的结果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

conda install 和pip install有什么区别?

本篇为分享贴&#xff0c;截图部分选自知乎&#xff0c;部分选自csdn&#xff0c;文字内容是结合自己实践进行总结。 环境引用的包在哪&#xff1f; 首先&#xff0c;一条命令&#xff1a; python -m site 这条命令可以定位引用的包在哪里 &#xff0c;当然也可以自己设置默认…

Java课题笔记~ 关于错误与异常

非检查异常(unckecked exception)&#xff1a;Error 和 RuntimeException 以及他们的子类。javac在编译时&#xff0c;不会提示和发现这样的异常&#xff0c;不要求程序员必须处理这些异常。在运行阶段&#xff0c;倘若发生Error则虚拟机几乎崩溃&#xff0c;倘若发生RuntimeEx…

mysql的主从复制和读写分离

目录 一、mysql的主从复制和读写分离的相关知识 1&#xff09;什么是读写分离? 2&#xff09;为什么要读写分离呢? 3&#xff09;什么时候要读写分离? 4&#xff09;主从复制的优点 5&#xff09;主从复制与读写分离 6&#xff09;mysql支持的复制类型 STATEMENT和r…

Maven的安装与配置(包含所有细节)

一、idea版本和maven配对 这里是很多新手都会遇到的大坑&#xff0c;一定要先将自己的idea版本和maven进行版本配配对。 Maven3.6.3版本兼容问题 注意&#xff1a;针对一些老项目 还是尽量采用 3.6.3版本&#xff0c;针对idea各个版本的兼容性就很兼容 IDEA 2022 兼容maven 3.8…

vue中vuex的五个属性和基本用法,另加js-cookie的使用

VueX 是一个专门为 Vue.js 应用设计的状态管理构架&#xff0c;统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 Vuex有五个核心概念&#xff1a; state, getters, mutations, actions, modules。 1. state&#xff1a; vuex的基本数据&…

HDFS中snapshot快照机制

HDFS中snapshot快照机制 介绍作用功能实现相关命令和操作相关命令 介绍 snapshot是数据存储的某一时刻的状态记录&#xff0c;备份&#xff08;backup&#xff09;则是数据存储的某一个时刻的副本HDFS snapshot快照是整个文件系统或某个目录在某个时刻的镜像&#xff0c;该镜像…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期&#xff0c;在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&#xff1a;192.168.116.40&#xff0c;修改配置将采集到的日志转发给kafka&#xff1b; kafka集群&#xff…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【数据分享】2023年我国省市县三级的上市公司数量(Excel/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;在众多公司企业中&#xff0c;上市公司堪称明珠&#xff0c;上市公司通常经济规模大、影响力强、员工多。哪个城市的上市公司更多&#xff0c;往往这个城市的经济实力越强&…

使用罗技鼠标后 弹出当前页面的脚本发生错误AppData/Local/Temp/LogiUI/Pak/js/jquery-1.3.2.min.js解决

使用的台式机&#xff0c;没有蓝牙驱动&#xff0c;在用logi无线鼠标时&#xff0c;把鼠标连接插入台式机后弹出的如上图所示这个提示&#xff0c;无论是点是/否&#xff0c;还是X掉上图提示&#xff0c;电脑右下角的图依然存在。不习惯这丫的存在。 我重启还是有&#xff0c;然…

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

如何将jar包部署到宝塔

尝试多种方式上传&#xff0c;但启动一直失败&#xff0c;这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided&#xff0c;如果是固定的版本号会出现问题 之后就可以打包啦&#xff0c;直接点击maven中的package 找到打包文件的位置&#xff…

C语言 用数组名作函数参数

当用数组名作函数参数时&#xff0c;如果形参数组中各元素的值发生变化&#xff0c;实参数组元素的值随之变化。 1.数组元素做实参的情况&#xff1a; 如果已经定义一个函数&#xff0c;其原型为 void swap(int x,int y);假设函数的作用是将两个形参&#xff08;x,y&#xf…

ChatGPT访问流量下降的原因分析

​自从OpenAI的ChatGPT于11月问世以来&#xff0c;这款聪明的人工智能聊天机器人就席卷了全世界&#xff0c;人们在试用该工具的同时也好奇该技术到底将如何改变我们的工作和生活。 但近期Similarweb表示&#xff0c;自去ChatGPT上线以来&#xff0c;该网站的访问量首次出现下…