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

news2024/11/26 18:36:04

基于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组引脚
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 Vin;//声明外部输入电压变量
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转换器数字结果变量
    //Vin = VCC * 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开关
  }

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

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

相关文章

算法题:870. 优势洗牌

该算法是临时想出来的&#xff0c;Java代码的实现在时间上不占优&#xff0c;之后有时间要优化一下&#xff0c;目前就是给大家提供一下思路。 解题思路&#xff1a;田忌赛马的思想 贪心法。 Step1. 对两个数组进行排序。 Step2. 同时遍历排序后的nums2和nums1&#xff0c;将…

RAM和ROM的区别(详解)

RAM和ROM的区别 RAM&#xff08;随机存取存储器&#xff09;和ROM&#xff08;只读存储器&#xff09;都是计算机中常见的存储器类型&#xff0c;它们在计算机系统中有不同的作用和特性。 RAM&#xff08;随机存取存储器&#xff09;&#xff1a; 作用&#xff1a; 用于临时存储…

鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

一、鸿蒙Liteos读源码教程 鸿蒙的源码是放在openharmony文件夹下&#xff0c;openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。 内核是操作系统的核心部分&#xff0c;所以像负责&#xff1a;资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在…

利用maven的dependency插件将项目依赖从maven仓库中拷贝到一个指定的位置

https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html 利用dependency:copy-dependencies可以将项目的依赖从maven仓库中拷贝到一个指定的位置。 使用默认配置拷贝依赖 如果直接执行mvn dependency:copy-dependencies&#xff0c;是将项目…

解决方案中word中分页符的使用

在投标方案中要善于使用“分页符”&#xff0c;尽可能少使用分节符号&#xff0c;没有分页符前&#xff0c;你每次修改你的标书或者文件&#xff0c;增加或者修改内容后。你的格式字段前后都是会发生变化&#xff0c;如何稳定的保证结构呢&#xff0c;那就是分页符的使用&#…

如何提高Python图像表格数据提取的准确率?

Python图像表格数据提取 1、数据来源2、目标图像3、图像文本提取4、图像灰度化与二值化可以提高识别准确率吗1、数据来源 国家统计局:http://www.stats.gov.cn/sj/ 数据来源:国家统计局中国统计年鉴2022年人口数及构成 2、目标图像 数据(部分)如下: 数据形式:http://www…

【触想智能】4U触摸工控机具有哪些优势?

工控机也叫工控主机&#xff0c;和我们常见的普通电脑主机是一样的&#xff0c;都是由CPU、主板、内存、硬盘、电源以及机箱组成的。 工控机有很多分类&#xff0c;有无风扇工控机、嵌入式工控机、上架式工控机、4U触摸工控机等。上架式工控机在市场上是比较受欢迎的&#xff0…

【数据结构】树家族

目录 树的相关术语树家族二叉树霍夫曼树二叉查找树 BST平衡二叉树 AVL红黑树伸展树替罪羊树 B树B树B* 树 当谈到数据结构中的树时&#xff0c;我们通常指的是一种分层的数据结构&#xff0c;它由节点&#xff08;nodes&#xff09;组成&#xff0c;这些节点之间以边&#xff08…

Web自动化测试 —— cookie复用

一、cookie简介 cookie是一些数据&#xff0c;存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时&#xff0c;在链接关闭后&#xff0c;服务端不会记录用户信息 二、为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入若用例需要经常执行&…

nodejs+vue+python+php在线购票系统的设计与实现-毕业设计

伴随着信息时代的到来&#xff0c;以及不断发展起来的微电子技术&#xff0c;这些都为在线购票带来了很好的发展条件。同时&#xff0c;在线购票的范围不断增大&#xff0c;这就需要有一种既能使用又能使用的、便于使用的、便于使用的系统来对其进行管理。在目前这种大环境下&a…

你渲染的3ds Max效果图为什么这么假?原来问题出在这!

有许多设计新手刚开始做效果图时&#xff0c;常常抱怨自己的作品看起来太假了&#xff0c;但又不知道怎么改。根据我的经验总结&#xff0c;我整理了以下几点可能导致你的3ds Max渲染效果图显得不够真实的原因。 1.三维模型不精致 如果模型细节不够精细&#xff0c;渲染出来的…

QT学习之QT概述

1.1 什么是QT&#xff1f; Qt是一个跨平台的C图形用户界面应用程序框架。 QT特点&#xff1a; 跨平台&#xff0c;几乎支持所有的平台接口简单&#xff0c;容易上手&#xff0c;学习QT框架对学习其他框架有参考意义。一定程度上简化了内存回收机制开发效率高&#xff0c;能够…

【Linux】 ps 命令使用

ps &#xff08;英文全拼&#xff1a;process status&#xff09;命令用于显示当前进程的状态&#xff0c;类似于 windows 的任务管理器。 语法 ps [选项] ps命令 -Linux手册页 著者 ps最初由布兰科兰克斯特撰写<lankestefwi.uva.nl>。迈克尔K约翰逊<johnsonmred…

Proteus仿真--12864LCD显示计算器键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的12864LCD液晶显示电话拨号键盘按键实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计主要介绍计算器键盘仿真&#xff0c;按键按下后在12864液晶上显示对应按键键值 仿真运行视频 Proteus仿真--12864LCD显示计算器…

3.20每日一题(分部积分、换元求定积分)

类型多项式的n次幂&#xff1a; 方法一&#xff1a; 展开然后求积分 方法二&#xff1a; 换元&#xff0c;令x-1t&#xff0c;再展开 方法三&#xff1a; 把一个整体凑到dx&#xff0c;再分部积分&#xff1b;如把&#xff08;x-1&#xff09;的n次幂凑到dx&#xff0c;分部…

Docker学习——②

文章目录 1、Docker是什么1.1 Docker本质1.2 Docker的引擎迭代1.3 Docker和虚拟机的区别1.4 Docker 为什么比虚拟机资源利用率高&#xff0c;启动快&#xff1f;1.5 Docker 和 JVM 虚拟化的区别&#xff1f; 2、Docker架构3、Docker生态3.1 新时代软件诉求3.2 Docker 解决方案 …

第二章 01Java基础-注释、关键字、字面量、变量以及计算机的存储数据

文章目录 前言一、注释二、关键字三、字面量四、变量五、计算机中的存储数据总结前言 今天我们学习Java基础,注释、关键字、字面量、变量以及计算机的存储数据 一、注释 1.注释是在程序指定位置添加说明性信息,简单理解为就是对代码的一种解释 2.注释分为单行注释、多行注…

Java编程--多线程/多线程的构造/多线程的属性/线程中断/线程的状态/线程等待

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 进程与线程 什么是进程&#xff1f; 答&#xff1a;进程是操作系统分配资源的最小单元&#xff0c;它是运行中的程序的实例&#xff0c;或者说&#xff0c;是应用程序的一次动态执行。…

阿里云双11活动时间、活动入口、优惠政策详细解读

阿里云2023年双11推出了金秋云创季活动&#xff0c;作为年终最大的一次优惠促销活动&#xff0c;活动力度还是很不错的&#xff0c;可以领取上云满减券礼包&#xff0c;百科产品满减折上折&#xff0c;2核2G3M云服务器1年99元&#xff0c;新老同享&#xff0c;续费同价&#xf…

【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…