单片机的省电模式及策略

目录

一、单片机省电的核心策略

二、单片机IO口的几种模式

三、单片机的掉电运行模式

       (1) 浅谈cpu运行为什么会需要时钟?

(2)STC15系列单片机内部可以配置时钟

(3)分频策略,降低功耗

(4)STC15系列单片机的省电模式

四、设置不同运行条件IO口的模式,进一步降低功耗


       

对于所有的单片机产品,无一例外的都需要电池的供应,虽然随着科技的日益发展,电池的容量已经越来越高,有的甚至能维持几年的工作,但是对于一般的小型干电池而言,电池的容量仍然需要我们省着利用,否则就可能让单片机每隔一段时间都需要换一次电池,所以本篇文章我们来讲讲单片机(基于STC15系列单片机)是如何省电的。

一、单片机省电的核心策略

        (1)单片机产品的省电需要硬件和软件相互配合着完成

        (2)硬件部分:

                a.硬件设计需要考虑低功耗,就需要选择低功耗的芯片

                b.硬件设计的相关电路也需要考虑低功耗设计(比如加大电阻等等)

                c.和单片机相关的需要和软件工程师配合调试

        (3)软件部分:

                a.没有用到的IO口需要按照芯片手册来进行配置(因为STC系列的单片机内核都是一样的,只不过不同种类的芯片的引脚引出不一样罢了,但是内核芯片都是含有这些的)

                b.通过配置寄存器,让单片机进入低功耗模式

                c.结合硬件设计在不同情况下配置成不同的IO口模式

二、单片机IO口的几种模式

        在这里我们可以看到,每一个IO口都有4种模式,而这4种模式是通过两个寄存器来配置的---PxM0和PxM1,两个寄存器的每一位都对应着IO口的相应位,一共有2*2=4种模式,依次为:准双向口;推挽输出;高阻输入;开漏模式

        我们可能看到了上面的描述后仍会比较懵,下面我们来看看简化图片,尝试着理解一下

通过这张图,我们可以很明显的看到,准双向IO口和推挽输出模式好像仅仅只有接入的电阻大小不一样诶因为推挽输出需要的电流比较大,所以对应的电阻也就比较小;相反的因为准双向IO口需要的电流很小,对应的电阻也就比较大了!
值得注意的是开漏模式,我们看到在文档的描述中,开漏模式的内部上拉电阻断开了,即内部不能够给这个IO口提供电压,所以一旦需要电压,就需要在IO口外部连接一个上拉电阻,而且这个电阻的阻值是由我们自己来决定的,只需要保证电压和电阻匹配即可

三、单片机的掉电运行模式

       (1) 浅谈cpu运行为什么会需要时钟?

(2)STC15系列单片机内部可以配置时钟

        传统的8051单片机的晶振是固定好的,我们不能修改其频率,最多也只能使用分频策略来改变其时钟频率,但是STC15系列的单片机给了我们这个权利,让我们自主选择时钟频率,这就给了我们更多的创造性

(3)分频策略,降低功耗

        分频的操作就是将频率降低,原来一秒钟震动12次,经过12分频后一秒钟就只震动1次了,可以类比我们生物,动的频率降低了,那么消耗的能力是不是也会减少呢

(4)STC15系列单片机的省电模式

        我们这里为了极大程度上的减少单片机的电流以达到省电的目的,我们会把单片机配置成掉电模式(停机模式),在停机模式下,由于内部的时钟停振,所以在main函数运行到这一句代码的时候就会关闭时钟,让程序停滞在这一行,等到外部中断上升沿或者下降沿触发唤醒的时候,继续从这一行开始执行程序,所以就极大程度的降低了功耗

(于是我们的代码就成了这样)

四、设置不同运行条件IO口的模式,进一步降低功耗

(1) 需要结合硬件设置单片机的GUAN   KAI 端口的IO模式
(2) 电池低压后,需要调整IO的工作模式。
在之前的文章中,我们曾分析过:
关门时:GUAN引脚为低电平
开门时:KAI引脚为低电平
但是从原理图中我们看到,关门时,由于VCC和GUAN引脚之间有电压差,所以会形成一个电流,造成功耗的升高,在开门时,GUAN引脚是默认的准双向IO口,与VCC之间没有电压降,所以不会形成电流,于是我们就明白了:
关门时,将GUAN引脚配置成开漏模式,KAI引脚配置成准双向IO口模式
同理:
开门时,KAI引脚配置成开漏模式,GUAN引脚配置成准双向IO口模式

到了这里我们的所有代码就已经完成啦!

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

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

相关文章

机器学习——有监督学习和无监督学习

有监督学习 简单来说,就是人教会计算机学会做一件事。 给算法一个数据集,其中数据集中包含了正确答案,根据这个数据集,可以对额外的数据希望得到一个正确判断(详见下面的例子) 回归问题 例如现在有一个…

vue3的常用功能

文章目录 一、前言二、自动注册全局组件2.1、自动注册components目录下所有vue组件并以组件的文件名为组件的名称2.2、使用这个插件2.3、为全局组件添加类型提示 三、函数式图片预览四、手动封装 svgIcon 组件五、封装拖拽钩子函数六、vscode 中 vue3 代码片段七、最后 一、前言…

vue3:25—其他API

目录 1、shallowRef和shallowReactive 2、readonly与shallowReadonly readonly shallowReadonly 3、toRaw和markRaw toRaw markRaw 4、customRef 1、shallowRef和shallowReactive shallowRef 1.作用:创建一个响应式数据,但只对顶层属性进行响应式处理。2…

[Vulnhub靶机] DriftingBlues: 4

[Vulnhub靶机] DriftingBlues: 4靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues4_vh.ova 靶机地址:192.168.67.23 攻击机地址:192.168.67.3 一、信息收集 …

Python数据可视化库之mplfinance使用详解

概要 Python 是一种强大的编程语言,拥有众多用于数据可视化的库和工具。其中之一是 mplfinance(Matplotlib Finance),它是基于 Matplotlib 的库,专门用于创建金融图表和交互式金融数据可视化。本文将深入介绍 mplfinance,包括其基本概念、功能特性以及如何使用示例代码创…

“手把手教你玩转函数递归,建议收藏!“

目录 1. 什么是递归 2. 递归的限制条件 3. 递归的举例 4. 递归与迭代 正⽂开始 1. 递归是什么? 递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃…

阿里云服务器多少钱?2024年阿里云服务器租用费用表大全

2024年阿里云服务器租用价格表更新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

免费生成ios证书的方法(无需mac电脑)

使用hbuilderx的uniapp框架开发移动端程序很方便,可以很方便地开发出移动端的小程序和app。但是打包ios版本的app的时候却很麻烦,官方提供的教程需要使用mac电脑来生成证书,但是mac电脑却不便宜,一般的型号都差不多上万。 因此&a…

java_error_in_pycharm.hprof文件是什么?能删除吗?

java_error_in_pycharm.hprof文件是什么?能删除吗? 🌵文章目录🌵 🌳引言🌳🌳hprof格式文件介绍🌳🌳java_error_in_pycharm.hprof文件什么情况下能删除🌳&…

C#静态数组删除数组元素不改变数组长度 vs 动态数组删除数组元素改变数组长度

目录 一、使用的方法 1.对静态数组删除指定长度并不改变数长度的方法 (1)静态数组 (2)对静态数组删除元素不得改变其长度 2.对动态数组删除指定长度并改变数长度的方法 (1)动态数组 (2&a…

故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab) 模型描述 时间卷积神经网络(TCN)是一种用于序列数据建模和预测的深度学习模型。它通过卷积操作在时间维度上对序列数据进行特征提取,并且可以处理可变长度的输入序列。 要使用TCN进行…

L1-080 乘法口诀数列

一、题目 二、解题思路 三、代码 #include<iostream> using namespace std; int main() {int a1,a2,n;cin>>a1>>a2>>n;if(n1){cout<<a1;return 0; }int a[n*2];cout<<a1<<" "<<a2;a[0]a1;a[1]a2;for(int i2,j2;i&l…