当前位置: 首页 > news >正文

1-2 非阻塞延时实现LED闪烁功能(累计定时中断次数)--多路软件定时器的功能实现

单路

#include <reg51.h>
#include "delay.h"#define LED_SHINE_TIME 1000//1sunsigned int g_u16_timer_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time_flag;//时间到的标志
unsigned char g_u8_timer_soft_enable;//定时器的软件开关sbit LED0=P1^0;
sbit LED1=P1^1;void Timer0Init(void);		//1毫秒@12.000MHzvoid main()
{g_u16_timer_cnt=LED_SHINE_TIME;g_u8_timer_soft_enable=1;g_u8_time_flag=0;Timer0Init();while(1){if(g_u8_time_flag==1){g_u8_time_flag=0;LED0=~LED0;g_u16_timer_cnt=LED_SHINE_TIME;}}
}//中断服务函数
void timer0_isr() interrupt 1
{TR0=0;//关定时器if(g_u8_timer_soft_enable){g_u16_timer_cnt--;if(!g_u16_timer_cnt){g_u8_time_flag=1;//代表软件的定时时间到}}TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TR0=1;//开定时器
}//定时器的初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TF0 = 0;		//清除TF0标志ET0=1;EA=1;TR0 = 1;		//定时器0开始计时
}

多路

#include <reg51.h>
#include "delay.h"#define LED1_SHINE_TIME 1000//1s
#define LED2_SHINE_TIME 2000//2sunsigned int g_u16_timer1_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time1_flag;//时间到的标志
unsigned char g_u8_timer1_soft_enable;//定时器的软件开关unsigned int g_u16_timer2_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time2_flag;//时间到的标志
unsigned char g_u8_timer2_soft_enable;//定时器的软件开关sbit LED1=P1^0;
sbit LED2=P1^1;void Timer0Init(void);		//1毫秒@12.000MHzvoid main()
{g_u16_timer1_cnt=LED1_SHINE_TIME;g_u8_timer1_soft_enable=1;g_u8_time1_flag=0;g_u16_timer2_cnt=LED2_SHINE_TIME;g_u8_timer2_soft_enable=1;g_u8_time2_flag=0;Timer0Init();while(1){//LED1if(g_u8_time1_flag==1){g_u8_time1_flag=0;LED1=~LED1;g_u16_timer1_cnt=LED1_SHINE_TIME;}//LED2if(g_u8_time2_flag==1){g_u8_time2_flag=0;LED2=~LED2;g_u16_timer2_cnt=LED2_SHINE_TIME;}}
}//中断服务函数
void timer0_isr() interrupt 1
{TR0=0;//关定时器//LED1if(g_u8_timer1_soft_enable){g_u16_timer1_cnt--;if(!g_u16_timer1_cnt){g_u8_time1_flag=1;//代表软件的定时时间到}}//LED2if(g_u8_timer2_soft_enable){g_u16_timer2_cnt--;if(!g_u16_timer2_cnt){g_u8_time2_flag=1;//代表软件的定时时间到}}TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TR0=1;//开定时器
}//定时器的初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TF0 = 0;		//清除TF0标志ET0=1;EA=1;TR0 = 1;		//定时器0开始计时
}

省略软件开关标志,优化代码,节省空间

#include <reg51.h>
#include "delay.h"#define LED1_SHINE_TIME 1000//1s
#define LED2_SHINE_TIME 2000//2sunsigned int g_u16_timer1_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time1_flag;//时间到的标志
//unsigned char g_u8_timer1_soft_enable;//定时器的软件开关unsigned int g_u16_timer2_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time2_flag;//时间到的标志
//unsigned char g_u8_timer2_soft_enable;//定时器的软件开关sbit LED1=P1^0;
sbit LED2=P1^1;void Timer0Init(void);		//1毫秒@12.000MHzvoid main()
{g_u16_timer1_cnt=LED1_SHINE_TIME;//g_u8_timer1_soft_enable=1;g_u8_time1_flag=0;g_u16_timer2_cnt=LED2_SHINE_TIME;//g_u8_timer2_soft_enable=1;g_u8_time2_flag=0;Timer0Init();while(1){//LED1if(g_u8_time1_flag==1){g_u8_time1_flag=0;LED1=~LED1;g_u16_timer1_cnt=LED1_SHINE_TIME;}//LED2if(g_u8_time2_flag==1){g_u8_time2_flag=0;LED2=~LED2;g_u16_timer2_cnt=LED2_SHINE_TIME;}}
}//中断服务函数
void timer0_isr() interrupt 1
{TR0=0;//关定时器//LED1if(g_u16_timer1_cnt){g_u16_timer1_cnt--;if(!g_u16_timer1_cnt){g_u8_time1_flag=1;//代表软件的定时时间到}}//LED2if(g_u16_timer2_cnt){g_u16_timer2_cnt--;if(!g_u16_timer2_cnt){g_u8_time2_flag=1;//代表软件的定时时间到}}TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TR0=1;//开定时器
}//定时器的初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TF0 = 0;		//清除TF0标志ET0=1;EA=1;TR0 = 1;		//定时器0开始计时
}

硬件定时器不够的时候可以用这种软件定时器的方法,如果不需要哪个软件计时器,设成0即可

这里用的定时计数器,所以定时时间比较准确

相关文章:

1-2 非阻塞延时实现LED闪烁功能(累计定时中断次数)--多路软件定时器的功能实现

单路 #include <reg51.h> #include "delay.h"#define LED_SHINE_TIME 1000//1sunsigned int g_u16_timer_cnt;//在定时器的基础上进行计数 unsigned char g_u8_time_flag;//时间到的标志 unsigned char g_u8_timer_soft_enable;//定时器的软件开关sbit LED0P1…...

数据类型及强制转换

数据类型范围&#xff08;基本&#xff09; 数据类型占内存字节数表示范围数量级char&#xff08;signed char&#xff09;1-128~1272unsigned char10~2552short int&#xff08;signed short int&#xff09;2-32,768~32,7674unsigned short int20~65,5354int&#xff08;sig…...

Python----高阶函数

高阶函数&#xff1a;把函数作为参数传入&#xff0c;这样的函数称为高阶函数&#xff0c;高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。 高阶函数的由来 在Python中&#xff0c;abs()函数可以完成对数字求绝对值计算。 ① 正数的绝对值是它本身 ②…...

Unity地面交互效果——6、地形动态顶点置换和曲面细分

回到目录 Unity置换贴图局部距离曲面细分 大家好&#xff0c;我是阿赵。   这篇文章是我无聊的时候做了一个demo&#xff0c;觉得挺有趣&#xff0c;于是就发上来。这里面包含了4个内容&#xff1a;置换贴图、顶点偏移、局部曲面细分&#xff0c;曲面细分按距离调整强度。 …...

Linux系统服务之一次性服务(2)

接前一篇文章&#xff1a;Linux系统服务之一次性服务&#xff08;1&#xff09; 本文内容参考以下文章&#xff1a; Systemd OneShot 系统启动时运行一次特定的命令或脚本&#xff0c;并在执行完毕后自动退出-CSDN博客 oneshot一次性服务_typeoneshot-CSDN博客 systemd.serv…...

Vue项目解决van-calendar 显示白色空白,需滑动一下屏幕,才可正常显示

问题描述&#xff0c;如图 ipad(平板&#xff09;或者 H5移动端引入Vant组件的日历组件&#xff08;van-calendar&#xff09;&#xff0c;初始化显示空白&#xff0c;需滚动一下屏幕&#xff0c;才可正常显示 解决方法 需在van-calendar上绑定open"openCalendar"事件…...

Linux:可视化管理工具Webmin的安装

一、下载 地址&#xff1a;Webmin官网 我这里下载的是1.700-1版本 二、安装 1、在虚拟机上新建目录并安装软件 mkdir /opt/webmin rpm -ivh webmin-1.700-1.noarch.rpm2、修改webmin的root密码 /usr/libexec/webmin/changepass.pl /etc/webmin root 1234563、修改端口(可…...

WARNING: Access control is not enabled for the database.

MongoDB shell version v3.4.24 WARNING: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted. 1)未启用访问控制 2)读写访问不受限制 D:\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.4.24 c…...

JavaScript编程进阶 – Return语句

JavaScript编程进阶 – Return语句 JavaScript Programming Advanced – Return Statement By JacksonML 就像人们习惯的函数一样&#xff0c;总觉得在函数体最后需要一个return语句&#xff0c;标志着函数的结束,就像下面这个函数 theFunc() 那样。 function theFunc() { re…...

Python与设计模式--备忘录模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…...

04_Flutter自定义Slider滑块

04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…...

服务器数据恢复—EMC存储raid5故障导致上层应用崩溃的数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC某型号存储&#xff0c;8块组建一组raid5磁盘阵列。上层操作系统采用zfs文件系统。 服务器存储故障&分析&#xff1a; raid5阵列中有2块硬盘未知原因离线&#xff0c;raid5阵列崩溃&#xff0c;上层应用无法正常使用。 服务器数据恢…...

7.1 Windows驱动开发:内核监控进程与线程回调

在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举&#xff0c;今天我们将展开一个新的话题&#xff0c;内核监控&#xff0c;我们以监控进程线程创建为例&#xff0c;在Win10系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现&#xff0c;此类函数的原…...

基于ssm的汽车论坛管理系统设计与实现

基于ssm的汽车论坛管理系统设计与实现 摘要&#xff1a;信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题…...

实习开发日志经验总结(一)

文章目录 前言实习日志经验总结 前言 自己之前实习过程中遇到的问题以及相应的解决过程&#xff0c;我都有记录形成比较凌乱的实习日志。故想在整个实习日志的基础上&#xff0c;提炼一些技术知识点或者是解决问题的思路。考虑到实习项目的不方便公开性&#xff0c;所以会隐去…...

【Unity基础】8.简单场景的搭建

【Unity基础】8.简单场景的搭建 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;场景资源 &#xff08;1&#xff09;Import资源包 今天我们将手动去搭一个简单的场景&#xff0c;当…...

傅里叶变换及其在机器学习中的应用

​​​​​​​一、介绍 傅立叶变换是一种数学技术&#xff0c;在各个科学和工程领域发挥着关键作用&#xff0c;其应用范围从信号处理到量子力学。近年来&#xff0c;它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …...

xorm源码学习

文章目录 XORM源码浅析及实践ORMORM vs. SQLXORM软件架构 ORM 引擎 Engine——DBM*core.DB Golang&#xff1a;database/sql 源码基本结构连接复用&#xff0c;提高性能。增加数据库连接池数量连接管理 database/sql主要内容&#xff1a;sql.DB创建数据库连接sql.Open()DB.conn…...

Vue3中的<script setup>和<script>的区别

相同点 在一个 Vue3 单文件组件 (SFC)中&#xff0c;<script setup> 和 <script> 它们各自最多只能存在一个。 不同点 <script setup> 这个脚本块将被预处理为组件的 setup() 函数&#xff0c;这意味着它将为每一个(也可以说每一次)组件实例都执行。 <…...

Docker笔记-Docker搭建最新版zabbix服务端(2023-07-31)

前言 一开始问chartgpt上&#xff0c;搭建的思路是对的&#xff0c;但命令和细节有问题&#xff0c;最后还是依靠StackOverflow解决的。一开始在amd的linux上搭建好docker版的zabbix&#xff0c;但放到arm的机器上就报错了&#xff0c;原因是指令集不匹配&#xff0c;最后跑到…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...