当前位置: 首页 > 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;最后跑到…...

C++ 编译器优化参数解析

C编译器优化参数解析&#xff1a;提升性能的关键 在C开发中&#xff0c;编译器优化是提升程序性能的重要手段。通过调整编译器的优化参数&#xff0c;开发者可以在不修改代码的情况下显著提高程序的运行效率、减少内存占用或缩短启动时间。不同的优化选项适用于不同的场景&…...

提升Adobe Illustrator开发效率的自动化脚本工具集

提升Adobe Illustrator开发效率的自动化脚本工具集 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 在设计开发流程中&#xff0c;重复性操作、多文件管理和格式标准化往往消耗大量时…...

旧设备升级指南:用OpenCore Legacy Patcher让Mac重获新生的5个实用步骤

旧设备升级指南&#xff1a;用OpenCore Legacy Patcher让Mac重获新生的5个实用步骤 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着苹果系统的不断更新&a…...

3个技巧让百度网盘下载提速10倍:突破限速的完整技术方案

3个技巧让百度网盘下载提速10倍&#xff1a;突破限速的完整技术方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘解析工具 baidu-wangpan-parse 是一款专为解决百度…...

OFA图像语义蕴含模型在网络安全中的应用:虚假图片内容识别

OFA图像语义蕴含模型在网络安全中的应用&#xff1a;虚假图片内容识别 每天都有数百万张图片在社交媒体上传播&#xff0c;其中有多少是经过PS处理的虚假内容&#xff1f;当图片与文字描述自相矛盾时&#xff0c;我们该如何快速识别其中的猫腻&#xff1f; 1. 虚假图片识别的挑…...

7个关键步骤!Triton推理服务灾备演练与故障注入测试全指南

7个关键步骤&#xff01;Triton推理服务灾备演练与故障注入测试全指南 【免费下载链接】server The Triton Inference Server provides an optimized cloud and edge inferencing solution. 项目地址: https://gitcode.com/gh_mirrors/server117/server Triton Inferen…...

3个实用方案解决百度网盘限速问题:高效下载工具使用指南

3个实用方案解决百度网盘限速问题&#xff1a;高效下载工具使用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘作为国内主流云存储服务&#xff0c;其资源分享功…...

基于PLC的五自由度抓取机械手设计

P13-基于PLC的五自由度抓取机械手设计 资料包含&#xff1a; PLC梯形图和HMI组态运行画面&#xff0c;I/O分配、CAD原理图、硬件设备清单、软件安装包、运行讲解视频、设计报告说明等&#xff0c;解难问题&#xff0c;全套资料通俗易懂非常适合新手PLC编程学习参考 功能介绍&am…...

NotaGen古典音乐生成:5分钟快速上手,小白也能创作贝多芬风格钢琴曲

NotaGen古典音乐生成&#xff1a;5分钟快速上手&#xff0c;小白也能创作贝多芬风格钢琴曲 1. 前言&#xff1a;AI音乐创作新时代 想象一下&#xff0c;你坐在电脑前&#xff0c;轻点几下鼠标&#xff0c;就能生成一段贝多芬风格的钢琴曲。这不是科幻电影&#xff0c;而是Not…...

如何通过QtScrcpy实现跨平台键鼠映射?4个技术要点让PC精准操控Android游戏

如何通过QtScrcpy实现跨平台键鼠映射&#xff1f;4个技术要点让PC精准操控Android游戏 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy QtScrcpy作为一款开源的Android设备投屏与控制…...