基于STC12C5A60S2系列1T 8051单片机A/D转换器应用

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用

  • STC12C5A60S2系列1T 8051单片机管脚图
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
  • STC12C5A60S2系列1T 8051单片机A/D转换器介绍
  • STC12C5A60S2系列1T 8051单片机A/D转换器的结构
  • 基于STC12C5A60S2系列1T 8051单片机A/D转换器的特殊功能寄存器列表
    • 基于STC12C5A60S2系列1T 8051单片机A/D转换器用到的特殊功能寄存器
      • A/D转换器P1口模拟功能控制寄存器P1ASF
      • A/D转换器控制寄存器ADC_CONTR
      • A/D转换器控制寄存器ADC_RES ADC_RESL
      • A/D转换器中断寄存器
      • 基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为量化数字

STC12C5A60S2系列1T 8051单片机管脚图

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

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

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

STC12C5A60S2系列1T 8051单片机A/D转换器介绍

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

STC12C5A60S2系列1T 8051单片机A/D转换器的结构

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

基于STC12C5A60S2系列1T 8051单片机A/D转换器的特殊功能寄存器列表

在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机A/D转换器用到的特殊功能寄存器

A/D转换器P1口模拟功能控制寄存器P1ASF

在这里插入图片描述作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器模拟输入通道

A/D转换器控制寄存器ADC_CONTR

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器以下功能
(1)、设置A/D转换器电源
(2)、设置A/D转换器转换速度
(3)、设置A/D转换器转换结束标志位
(4)、设置A/D转换器转换启动
(5)、设置A/D转换器模拟输入通道

A/D转换器控制寄存器ADC_RES ADC_RESL

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器保存转换的结果

A/D转换器中断寄存器

在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器中断

基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为量化数字

#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚
#define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚
//#define SinglechipVoltage 5.000//自定义单片机电压为5V
uchar Code NixieTubeBitCodeArray = [0xfe,0xfd,0xfb,0xf7];//定义数码管位码数组变量
uchar NixieTubeDisplayDataArray[0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00];//定义数码管显示0~F数据及符号“—”及熄灭数组变量
uchar NixieTubeCacheDataArray[];//定义数码管缓存数据数组变量
uchar AdcChangeResult;//声明A/D转换器转换结果变量
uchar AdcLowBitResult;//声明A/D转换器低位转换结果变量
uchar AdcChangeOverFlag = 0;//定义A/D转换器转换结束标志位清0 
uint AdcDataResult;//声明A/D转换器数字结果变量
//float InputVoltage;//声明外部输入电压变量
void AdcInit();//A/D转换器初始化函数
void AdcChangeResult();//A/D转换器转化结果函数
void NixieTubeDisplayDataSplit();//数码管显示数据分解函数
void NixieTubeDisplayData();//数码管显示数据函数  
void Timer0Init(void);//定时器0初始化函数
  void main(void)//主函数
{
   Timer0Init();//定时器0初始化函数 
   AdcInit();//A/D转换器初始化函数
   while(1)//主循环
  {
    AdcDataResult = AdcChangeResult();//A/D转换器转化结果赋给A/D转换器数字结果变量
    //InputVoltage = SinglechipVoltage * AdcDataResult / 1023;//计算输入电压 
   }
  }
  void AdcInit()//A/D转换器初始化函数
 {
   P1ASF= 0x01;//设置P1.0端口为A/D转换器模拟输入通道
   AUXR1 = 0x00;//设置A/D转换器转换结果寄存器CON_RES存放高八位A/D转换器转换结果 CON_RESL存放低二位A/D转换器转换结果 
   AD_CONTR= 0x80;//打开A/D转换器电源
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   AD_CONTR = 0xe1;//设置A/D转换器转换速度为最高 选P1.0端口作为A/D转换器模拟输入通道 A/D转换器转换结束标志位清0 A/D转换器转换启动控制位清0
   AD_CONTR= 0x08;//启动A/D转换器
  }
  uint AdcChangeResult()//A/D转换器转化结果函数
 {
   while(AdcChangeOverFlag = 0)//当A/D转换器转换结束标志位为0
  {
    AdcChangeOverFlag = AD_CONTR & 0x10;//判断A/D转换器转换是否结束 当AdcChangeOverFlag = 0x10表示A/D转换器转换结束 跳出while()循环
   }
   AD_CONTR & = 0xe7;//A/D转换器转换结束后 A/D转换器结束标志位与转换启动控制位都清0
   AdcChangeResult = ADC_RES;//A/D转换器高位A/D转换结果寄存器高八位存放值赋给A/D转换器转换结果变量
   AdcChangeResult << = 2;//A/D转换器转换结果左移2位变成高八位和空出低二位
   AdcLowBitResult = ADC_RESL;//A/D转换器低位A/D转换结果寄存器低二位存放值赋给A/D转换器低位转换结果变量
   AdcLowBitResult & = 0x03;//保留A/D转换器低位A/D转换结果寄存器低二位存放值 屏蔽A/D转换器低位A/D转换结果寄存器其他位
   AdcChangeResult |= AdcLowBitResult;//A/D转换器高位A/D转换结果寄存器高八位存放值或上A/D转换器低位A/D转换结果寄存器低二位存放值组成一个十位数据
   return AdcChangeResult;//返回A/D转换器转换结果
  }
  void NixieTubeDisplayDataSplit()//数码管显示数据分解函数
 {
   uchar NixieTubeQianWei,NixieTubeBaiWei,NixieTubeShiWei,NixieTubeGewei;//声明数码管千位、百位、十位、个位变量
   NixieTubeQianWei = AdcDataResult / 1000 ;//数码管千位分解
   NixieTubeBaiWei = AdcDataResult / 100 % 10;//数码管百位分解
   NixieTubeShiWei = AdcDataResult / 10 % 10 ;//数码管十位分解
   NixieTubeGeWei = AdcDataResult % 10 ;//数码管个位分解
   if(AdcDataResult < 1000 )
  {
    NixieTubeCacheDataArray[0] = 0x00;//数码管千位不显示
   }
   else 
  {
    NixieTubeCacheDataArray[0] = NixieTubeQianWei;//数码管千位显示数据
   }
   if(AdcDataResult < 100 )
  {
    NixieTubeCacheDataArray[1] = 0x00;//数码管百位不显示
   }
   else 
  {
    NixieTubeCacheDataArray[1] = NixieTubeBaiWei;//数码管百位显示数据
   }
   if(AdcDataResult < 10 )
  {
    NixieTubeCacheDataArray[2] = 0x00;//数码管十位不显示
   }
   else 
  {
    NixieTubeCacheDataArray[2] = NixieTubeShiWei;//数码管十位显示数据
   }
   NixieTubeCacheDataArray[3] = NixieTubeGeWei;//数码管个位显示数据
  }
  void NixieTubeDisplayData()//数码管显示数据函数  
 {  
   static uchar i = 0;//定义静态数码管位变化变量
   switch(i)//数码管位变化筛选
  {
    case 0 ://数码管千位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[0]];//数码管千位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[0];//数码管千位码显示
            i++;//数码管位变化自加1
            break;//跳出
    case 1 ://数码管百位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[1]];//数码管百位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[1];//数码管百位码显示
            i++;//数码管位变化自加1
            break;//跳出 
    case 2 ://数码管十位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[2]];//数码管十位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[2];//数码管十位码显示
            i++;//数码管位变化自加1
            break;//跳出
    case 3 ://数码管个位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[3]];//数码管个位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[3];//数码管个位码显示
            i = 0;//数码管位变化清0
            break;//跳出
    default:break;//跳出
   }
  }
  void Timer0Init(void)//定时器0定时1ms初始化函数 晶振为12MHz
 {
   TMOD &= 0xf0;//设定定时器/计数器工作模式清0
   TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1
   TH0 = 0xfc;//设定定时器0高8位初值 
   TL0 = 0x18;//设定定时器0低8位初值
   TF0 = 0;//定时器0溢出中断标志位清0
   ET0 = 1;//打开定时器中断开关
   EA = 1;//打开定时器中断总开关
   TR0 = 1//打开定时器0开关
  } 
  void Timer0(void) interrupt 1//定时器0定时1ms中断函数 晶振为12MHz
 {
   TR0 = 0;//关定时器0开关
   NixieTubeDisplayData();//数码管显示数据函数
   TH0 = 0xfc;//设定定时器0高8位初值
   TL0 = 0x18;//设定定时器0低8位初值
   TR0 = 1;//开定时器0开关
  }

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

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

相关文章

xlua源码分析(二)lua Call C#的无wrap实现

xlua源码分析&#xff08;二&#xff09;lua Call C#的无wrap实现 上一节我们主要分析了xlua中C# Call lua的实现思路&#xff0c;本节我们将根据Examples 03_UIEvent&#xff0c;分析lua Call C#的底层实现。例子场景里有一个简单的UI面板&#xff0c;面板中包含一个input fie…

3.线性神经网络-3GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 线性回归基础优化算法一、线性回归1、买房案例2、买房模型简化3、线性模型4、神经网络5、损失函数6、训练数据7、参数学习8、显示解9、总结 二、 基础优化算法1、梯度下降2、学习率3、小批量随机梯度下降4、批量大小5、…

Qt 中model/View 架构 详解,以及案例实现相薄功能

model/View 架构 导读 ​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…

HNU程序设计 练习五-函数

1.小熊买糖果 【问题描述】 小熊去到商店&#xff0c;选择了一种它非常喜欢的糖果&#xff0c;其单价为 k 元&#xff0c;假定商店里有无穷多的这种糖果。 它的父亲允许它花费任意多的10元硬币和一个 r 元硬币去购买&#xff0c;但不能找零&#xff0c;请帮助小熊确定它能购买…

EMC Unity存储系统如何查看SSD的使用寿命

为什么要写这个博客&#xff1f; 客户对老的EMC unity的存储系统要扩容&#xff0c;如何确定SSD磁盘是全新的还是拆机二手的&#xff1f;很多时候客户还有一个奇葩的要求&#xff0c;就是要和5年前的磁盘PN一致&#xff0c;甚至要求固件版本一致&#xff0c;最关键的还要求是全…

Leetcode刷题详解——反转链表

1. 题目链接&#xff1a;206. 反转链表 2. 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1…

【java学习—十二】io流(1)

文章目录 1. 主要内容2. File类3. 练习题4. Java IO原理 1. 主要内容 java.io.File 类的使用&#xff08;计算机操作系统中的文件和文件夹&#xff09; IO原理及流的分类。 IO即input和output。 流的解释&#xff1a;     比如&#xff1a;通过程序把图片放到某一个文件…

pycharm 断点调试python Flask

以flask框架为例&#xff0c;其启动命令为 python app.py runserver 后面需要拼接runserver 点击开始断点 参考&#xff1a;https://www.cnblogs.com/bigtreei/p/14742015.html

Mac -- zsh-最新全网超详细的个性化终端(Terminal)颜色及vim颜色配置(亲测可行)

转自 Mac -- zsh-最新全网超详细的个性化终端(Terminal)颜色及vim颜色配置(亲测可行)_mac zsh-CSDN博客 以下都是苹果 设置&#xff0c;这是简化版的&#xff0c;详细的看我引用的 个性化终端颜色背景设置 显示检查器 打开终端&#xff0c;鼠标在终端中&#xff0c;右击&…

[PyTorch][chapter 60][强化学习-2-有模型学习2]

前言&#xff1a; 前面我们讲了一下策略评估的原理,以及例子. 强化学习核心是找到最优的策略&#xff0c;这里 重点讲解两个知识点&#xff1a; 策略改进 策略迭代与值迭代 最后以下面环境E 为例&#xff0c;给出Python 代码 。 目录&#xff1a; 1&#xff1a; 策略改进 2&…

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库&#xff0c;它使用图形模型来存储数据&#xff0c;并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库&#xff0c;本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…

防止重复提交请求

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 axios 实现请求 loading 效果 用一个数组保存当前请求的 url&#xff0c;此时还未响应。如果再次发起同样请求&#xff0c;比对 url 发现已经存在数组中&#xff0c;则拦截请求&a…

【PyQt学习篇 · ⑨】:QWidget -控件交互

文章目录 是否可用是否显示/隐藏是否编辑是否为活跃窗口关闭综合案例信息提示状态提示工具提示“这是什么”提示 焦点控制单个控件角度父控件角度 是否可用 setEnabled(bool)&#xff1a;该函数用于设置QWidget控件的可用性&#xff0c;参数bool为True表示该控件为可用状态&…

Spring底层原理(六)

Spring底层原理(六) 本章内容 介绍AOP的实现方式、JDK代理的模拟实现与源码 AOP的实现方式 使用代理模式 jdk动态代理cglib动态代理 使用aspectj的编译器&#xff0c;该编译器会直接对字节码进行修改&#xff0c;可以实现静态方法增强 使用javaagent,在jvm option中指定-…

FlinkCDC系列:通过skipped.operations参数选择性处理新增、更新、删除数据

在flinkCDC源数据配置&#xff0c;通过debezium.skipped.operations参数控制&#xff0c;配置需要过滤的 oplog 操作。操作包括 c 表示插入&#xff0c;u 表示更新&#xff0c;d 表示删除。默认情况下&#xff0c;不跳过任何操作&#xff0c;以逗号分隔。配置多个操作&#xff…

概念解析 | 神经网络中的位置编码(Positional Encoding)

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…

Zygote进程通信为什么用Socket而不是Binder?

Zygote进程是Android系统中的一个特殊进程&#xff0c;它在系统启动时被创建&#xff0c;并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源&#xff0c;以提高应用启动的速度。 在Android系统中&#xff0c;常用的进程通信方式有以下几种&#xff1a; Intent…

ABAP简单的队列设置QRFC

场景&#xff1a;用job的方式在接口里启用job&#xff0c;如果接口调用比较频繁&#xff0c;存在同一时间启动相同job的情况&#xff0c;会导致锁表锁程序这种情况。 查阅job函数&#xff0c;发现在JOB_CLOSE函数里自带了类似队列的参数&#xff0c;但是因为是接口&#xff0c…

文件夹还在,里面文件没了?问题这样解决

文件夹还在但文件无故消失怎么办&#xff1f;文件的消失对于我们来说可能是个令人沮丧且困惑的问题。有时候&#xff0c;我们可能会发现文件夹依然存在&#xff0c;但其中的文件却消失了。在这篇文章中&#xff0c;我们将探讨为什么电脑文件会无故消失的原因&#xff0c;并提供…

这个超实用的门禁技巧,让办公楼安全更简单高效!

门禁监控是现代社会中不可或缺的一部分&#xff0c;用于确保安全和管理进出某个区域的人员。随着科技的不断发展&#xff0c;门禁监控已经远离了传统的机械锁和钥匙&#xff0c;变得更加智能化和高效。 客户案例 企业办公大楼 无锡某大型企业在其办公大楼内部部署了泛地缘科技…