精华内容
下载资源
问答
  • 很多初学者对于程序中ms级延时函数的编写方法比较疑惑,其原理和方式虽然简单,但是却没有相关资料。这里用一个例程详细介绍一下。
  • 参考了51单片机 Keil C 延时程序的简单研究,自己也亲身测试和计算了一些已有的延时函数。
  • 延时函数如何延时

    2019-12-12 13:54:06
    延时函数如何延时 **函数样例 编译软件编译后的 汇编指令 Delay_ms(200); ...

    延时函数如何延时

    **函数样例                                                             编译软件编译后的 汇编指令
    Delay_ms(200);                                         //     1、 0x0000058C 20C8      MOVS     r0,#0xC8
    void Delay_ms(unsigned int time)
    {
        unsigned char  n;
       while(time>0)                                               //       3、0x00000210 2800      CMP      r0,#0x00                                                                             
        {
    			for(n=0;n<4;++n)                                  //      4、 0x00000204 2100      MOVS     r1,#0x00
    			{                                               //   5、 0x00000206 1C49      ADDS     r1,r1,#1
    				;                                           //  6、 0x00000208 B2C9      UXTB     r1,r1
    				                                            // 7、 0x0000020A 2902      CMP      r1,#0x02
    				                                           //    8、 0x0000020C D3FB      BCC      0x00000206
    				                                           //    9、 0x0000020E 1E40      SUBS     r0,r0,#1
    			}
    			time--;                                    //     2、  0x00000202 E005      B        0x00000210
    		}
    }
    
    

    所需要了解的信息
    1、每一条汇编指令需要占用几个时钟周期,方便计算多少时间
    2、时钟周期为1M时,其倒数为时间1us

    文字解释

    程序进入Delay_ms(200)延时函数后,其对应汇编指令运行顺序为1——2——3——4——5——6——7——8——9
    其中的for空循环的汇编指令为5、6、7、8、9这四条,进入for循环这四条指令的运行次数为4(来源于自己设置的n<4)
    本函数中对应的汇编指令一般占用一个时钟周期,其中第2和8条为跳转指令,占用2个时钟周期,本函数程序其硬件时钟设置为22MHz,故延时函数时间为(10+8*(n-1))*(1/22M)us

    展开全文
  • 自己做的小工具,把快捷方式放在启动文件夹中,开机后延时打开程序目录指定2个程序,可通过配置文件配置延时时间、要打开的程序名称和是否打开时最小化程序。资源是MFC工程,VS2015+x86编译,含源码和程序,可直接...
  • 延时毫秒进度条.zip

    2020-04-10 21:08:23
    网上很多进度条使用都不方便,自己用时特弄了一个,非常方便,有延时定义,有颜色定义,自动关闭延时窗口,供大家参考
  • 数显可编程延时接通或延时断开模块简介: 此工业级板的作用是,模块供电后,数码管显示设定时间,倒计时开始,当数码管倒计时到0时,继电器接通或者断开,此模块有三种工作模式,客户可以根据自己的需要进行选型。 三...
  • 自己写的,测试通过。MSP430F149定时器中断延时1s,TimerA,MSP430F149定时器中断延时1s,TimerA,MSP430F149定时器中断延时1s,TimerA
  • NE555延时电路设计

    万次阅读 2017-04-21 18:36:53
    主要是对NE555延时电路的设计和实际电路的测试

    近期设计一个采用NE555来延时的电路,主要想实现输出周期为180ms左右,高电平100ms的电路。


    1、参考NE555芯片规格手册,得到如下信息:

    得到稳定pwm波形的电路如下

    图中可以很清晰的了解到该部分电路该如何设计,主要使用了器件有三个:RA、RB和C,他们三者之间的关系为:f = 1.49/((Ra+Rb)*C)

    这里我们不妨取:Ra = 3k

    Rb = 12k

    C = 10uF

    依照计算公式可得:f = 1.49/((3000+12000)*(10^(-6))= 9.93Hz   T=1/f = 100ms


    2、我们使用NE555频率计算器计算,得到数据如下:

    计算器链接如下:https://bbs.kechuang.org/tool/elc/tool/ne555.html


    由上可知:这组取值(你们也可以自己修改)高电平时间为104ms,低电平为83ms,总周期为187ms。


    3、按如上参数实际搭出的电路,波形如下:

    周期为160ms


    高电平为88ms


    低电平为72ms


    4、由以上数据可知,我们的理论设计与实际存在一定误差,这里我觉得主要是电容正负20%的容差造成,大家实际制作时,可以慢慢调整参数已达到最优!


    展开全文
  • rabbitmq延时队列和四种交换机模式下队列的简单实现,需要自己配置一下属性文件。
  • 程序延时启动bat

    2012-07-19 15:41:25
    一个bat程序,能延时启动程序。延时多少可以自己调整。
  • 本文为建立一个属于自己的AVR的RTOS——第四篇:只有延时服务的协作式的内核。
  • 延时函数

    千次阅读 2020-03-08 21:53:40
    延时函数 什么是延时函数 所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,就会跳出延时函数继续做其他事情了。 为什么要延时 为了使CPU某些芯片的时序而采用的一些...

    延时函数

    什么是延时函数

    所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,就会跳出延时函数继续做其他事情了。

    为什么要延时

    为了使CPU某些芯片的时序而采用的一些机制,比如独立按键、LED灯闪烁等

    单片机时序

    单片机时序就是CPU在执行指令命令时所需控制信号的时间顺序,为了保证各部件间的同步工作,单片机内部电路在唯一的时钟信号下严格的控制时序进行工作。
    振荡周期:为单片机提供定时信号的振荡源的周期又称时钟周期
    状态周期:2个振荡周期为1个状态周期,
    机器周期:1个机器周期含6个状态周期,12个振荡周期。在一个机器周期内,CPU可以完成一个独立的操作。
    指令周期:它是指CPU完成一条操作的所需的全部时间。,它以机器周期为单位

    nop指令

    执行一个_nop_() ,就是一个空操作,占用一个机器周期,也就是12个时钟周期。
    一个机器周期=12/12MHz=1us
    #include<intrins.h>
    Void delay10us() //调用此函数需要执行LACLL指令耗时2个机器周期
    {
    nop();
    nop();
    nop();
    nop();
    nop();
    nop();
    } //结束执行一次RET指令耗时2个机器周期
    Delay10us( )函数中共用了6个NOP ( )语句,每个语句执行时间为1 us。主函数调用Delay10us( )时,先执行个LCALL指令 (2 us),然后执行6个NOP ()语句(6 μs),最后执行了一个RET指令(2μs),所以执行上述函数时共需要10 uS。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时,但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 us。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2μs) , 然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us(),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84μs) ,所以,实际延时时间为86 us。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 us。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

    分号“;”和nop指令

    1、两个语句的相同点是都不会有实质上的控制操作;
    2、两个语句的不同点是nop语句执行了就相当于延时一个机器周期(尽管一个机器周期很短),而;仅仅相当于一个格式上的字符,不会执行任何语句,也不会延时,和没有代码的作用一致。
    注:;含义意指在for和while循环中常用。

    Void delay(u16 i) void delay(u16 i)
    { {
    for(;i>0;i–) for(;i>0;i–)
    nop();
    } }

    keil4精确计算时间

    1.设置成开发板晶振,比如12MHz;
    在这里插 入图片描述
    2.设置断点,进入时间仿真,并把时间复位
    (设置断点时,要把你想仿真的语句的前后两个语句都设置成断点,这就好比,一段绳子,切成三段,而我取的是中间那一段,进入仿真按照截图标号依次点击)
    在这里插入 图片描述
    3.开始运行(断点上的箭头是蓝色时代表未开始运行,当变成黄色时代表已运行一次,黄色箭头所指语句代表还未执行此语句,只是执行了箭头上面的语句)
    在这里插入 图片描述4.再次运行,计算delay的运行时间
    在这里插入 图片描述
    注意:这种计算延时时间有一定的误差,因为每次调用延时函数时会浪费一定的时间,每次执行语句达到的延时效果,还要额外加上调用函数所延时的时间,所以与自己设置的延时时间误差值为调用函数所产生的时间,理想设置延时时间=执行两次延时语句-执行一次延时语句,调用函数时间=执行一次延时语句-理想设置延时时间。通过反汇编也可以计算时间,在前面的nop指令,有简单介绍。

    stc烧录软件延时函数

    可以根据自己的需求设置时间,优点:生成代码速度快精准,缺点:不能在代码上灵活的修改延时的时间。
    在这里插入图片描述

    展开全文
  • * 创建延时任务 (构造函数参数根据自己需求创建) * spring中使用service或mapper时手动getBean或传递进来 * @param memberid 会员ID * @param virtualcurrencyname 币种类型 * @param sourceaddress ...

    功能实现:延迟一段时间再执行一个操作

    参考文章:https://www.cnblogs.com/barrywxx/p/8525907.html

    1. DelayOrderQueueManager

    package cn.zykj.delqueue;
    
    import java.util.concurrent.DelayQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;  
    
    /** 
     * 延时队列管理类,用来添加任务、执行任务 
     *  
     */  
    public class DelayOrderQueueManager {  
    	private final static int DEFAULT_THREAD_NUM = 5;  
    	private static int thread_num = DEFAULT_THREAD_NUM;  
    	// 固定大小线程池  
    	private ExecutorService executor;  
    	// 守护线程  
    	private Thread daemonThread;  
    	// 延时队列  
    	private DelayQueue<DelayOrderTask<?>> delayQueue;  
    	//    private static final AtomicLong atomic = new AtomicLong(0);  
    	//    private final long n = 1;  
    	private static DelayOrderQueueManager instance = new DelayOrderQueueManager();  
    
    	private DelayOrderQueueManager() {  
    		executor = Executors.newFixedThreadPool(thread_num);  
    		delayQueue = new DelayQueue<>();  
    		init();  
    	}  
    
    	public static DelayOrderQueueManager getInstance() {  
    		return instance;  
    	}  
    
    	/** 
    	 * 初始化 
    	 */  
    	public void init() {  
    		daemonThread = new Thread(execute());
    		daemonThread.setName("DelayQueueMonitor");  
    		daemonThread.start();  
    	}  
    
    	private Runnable execute() {  
    		Runnable run = new Runnable() {
    			@Override
    			public void run() {
    				while (true) {  
    					//		            Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();  
    					//		            System.out.println("当前存活线程数量:" + map.size());  
    					//		            int taskNum = delayQueue.size();  
    					//		            System.out.println("当前延时任务数量:" + taskNum);  
    					try {  
    						// 从延时队列中获取任务  
    						DelayOrderTask<?> delayOrderTask = delayQueue.take();  
    						if (delayOrderTask != null) {  
    							Runnable task = delayOrderTask.getTask();  
    							if (null == task) {  
    								continue;  
    							}  
    							// 提交到线程池执行task  
    							executor.execute(task);  
    						}  
    					} catch (Exception e) {  
    						e.printStackTrace();  
    					}  
    				} 
    			}
    		}; 
    		return run;
    	}  
    
    	/** 
    	 * 添加任务 
    	 *  
    	 * @param task 
    	 * @param time 
    	 *            延时时间 
    	 * @param unit 
    	 *            时间单位 
    	 */  
    	public void put(Runnable task, long time, TimeUnit unit) {  
    		// 获取延时时间  
    		long timeout = TimeUnit.NANOSECONDS.convert(time, unit);  
    		// 将任务封装成实现Delayed接口的消息体  
    		DelayOrderTask<?> delayOrder = new DelayOrderTask<>(timeout, task);  
    		// 将消息体放到延时队列中  
    		delayQueue.put(delayOrder);  
    	}  
    
    	/** 
    	 * 删除任务 
    	 *  
    	 * @param task 
    	 * @return 
    	 */  
    	public boolean removeTask(DelayOrderTask task) {  
    		return delayQueue.remove(task);  
    	}  
    }

    2. DelayOrderTask

    package cn.zykj.delqueue;
    
    import java.util.concurrent.Delayed;  
    import java.util.concurrent.TimeUnit;  
    
    /** 
     * 延时队列中的消息体将任务封装为消息体 
     *  
     */  
    public class DelayOrderTask<T extends Runnable> implements Delayed {  
    	private final long time;  
    	private final T task; // 任务类,也就是之前定义的任务类  
    
    	/** 
    	 * @param timeout 
    	 *            超时时间(秒) 
    	 * @param task 
    	 *            任务 
    	 */  
    	public DelayOrderTask(long timeout, T task) {  
    		this.time = System.nanoTime() + timeout;  
    		this.task = task;  
    	}  
    
    	@Override  
    	public int compareTo(Delayed o) {  
    		DelayOrderTask other = (DelayOrderTask) o;  
    		long diff = time - other.time;  
    		if (diff > 0) {  
    			return 1;  
    		} else if (diff < 0) {  
    			return -1;  
    		} else {  
    			return 0;  
    		}  
    	}  
    
    	@Override  
    	public long getDelay(TimeUnit unit) {  
    		return unit.convert(this.time - System.nanoTime(), TimeUnit.NANOSECONDS);  
    	}  
    
    	@Override  
    	public int hashCode() {  
    		return task.hashCode();  
    	}  
    
    	public T getTask() {  
    		return task;  
    	}  
    }

    3. DelayOrderWorker(逻辑处理类)

    spring 框架中如果需要调用 service、mapper 层则需手动 getBean 或当成参数传递进来,才可正常使用,否则报空指针异常

    package cn.zykj.delqueue;
    
    import java.math.BigDecimal;
    
    import cn.zykj.dao.TransactionrecordMapper;
    import cn.zykj.dao.WallettableMapper;
    import cn.zykj.service.impl.WallettableServiceImpl;
    
    /** 
     * 延时执行队列(平台内延时到账)
     * 
     */  
    public class DelayOrderWorker implements Runnable {
    	
    	// 变量根据需求定义
    	public int memberid = 0;
    	public String virtualcurrencyname = "";
    	public String sourceaddress = "";
    	public BigDecimal transactionnumber = BigDecimal.ZERO;
    	public int transactionfundstype = 0;
    	
    	private WallettableServiceImpl wallettableServiceImpl;
    	private WallettableMapper wallettableMapper; 
    	private TransactionrecordMapper transactionrecordMapper;
    	
    	/**
    	 * 创建延时任务 (构造函数参数根据自己需求创建)
    	 * spring中使用service或mapper时手动getBean或传递进来
    	 * @param memberid 会员ID
    	 * @param virtualcurrencyname 币种类型
    	 * @param sourceaddress 来源地址
    	 * @param transactionnumber 交易数量
    	 * @param transactionfundstype 交易资金类型
    	 */
    	public DelayOrderWorker(int memberid, String virtualcurrencyname, String sourceaddress,
    			BigDecimal transactionnumber, int transactionfundstype,
    			WallettableServiceImpl wallettableServiceImpl, WallettableMapper wallettableMapper, TransactionrecordMapper transactionrecordMapper){
    		
    		System.out.println("<----------平台内转账处理中>目标=》会员ID="+memberid+">币种类型="+virtualcurrencyname
    				+">来源="+sourceaddress+">数量="+transactionnumber+">资金类型="+transactionfundstype+"---------->");
    		
    		this.memberid = memberid;
    		this.virtualcurrencyname = virtualcurrencyname;
    		this.sourceaddress = sourceaddress;
    		this.transactionnumber = transactionnumber;
    		this.transactionfundstype = transactionfundstype;
    		
    		this.wallettableServiceImpl = wallettableServiceImpl;
    		this.wallettableMapper = wallettableMapper;
    		this.transactionrecordMapper = transactionrecordMapper;
    	}
    	
        @Override  
        public void run() {  
        	// 逻辑处理
        	wallettableServiceImpl.app_transfer_in(memberid, virtualcurrencyname, sourceaddress, transactionnumber, transactionfundstype, wallettableMapper, transactionrecordMapper);
        }  
    }

    使用方法:

    展开全文
  • 3、此代码可轻松移植到STM32、BCM58101、K21、MH19XX等系列单片机上,实现准确的延时; 4、代码的实现,参照Linux中udelay()、mdelay()的实现方法,用Linux思想去开发单片机,具有极强的参考意义;
  • vxWorks延时函数

    千次阅读 2019-07-11 14:14:17
    在应用编程的时候,通常会碰到需要一个任务在特定的延时之后执行一个指定的动作,如等待外设以确保数据可靠,控制扬声器发声时间以及串口通信超时重发等。这就需要利用定时器机制来计量特定长度的时间段。 vxWorks...
  • STM32延时子程序1ms、1s

    热门讨论 2012-07-26 19:58:03
    STM32延时子程序,延时1ms和1s,软件测试,延时很接近1ms和1s,用软件仿真了挺久的
  • 单片机 软件延时时间控制

    万次阅读 多人点赞 2018-11-01 11:13:14
    单片机 软件延时时间控制 一、简述 记--通过代码方式实现软件延时(不精确延时)。 二、指令周期 单片机需要一个时钟信号送给内部各个电路,才能使它们有节拍地协同工作。时钟信号的频率是由外部震荡电路的...
  • STM32 精准延时

    千次阅读 2019-02-14 20:33:45
    延时,就是停在那,啥都不干,发呆。精准延时,就是发呆多长时间,是精确的。 比如,要求某个IO口维持低...既然延时就是发呆,那我们系统发发呆就得了呗,它执行空代码,执行很多很多很多,就能达到预期的效...
  • 编写延时函数的简单方法

    千次阅读 2019-08-13 10:42:35
    过程参考如下: 在编译器下建立一个新项目,也可以利用已有项目。...编写一段关于延时的函数,主要利用for循环,代码如下: void delay_ms(unsigned int ms) { unsigned int i; unsigned char j; for(i=0...
  • ( C++中的延时函数

    2011-12-30 19:55:40
    自己在网上找得 可以一看 有点小帮助的
  • 单片机延时程序的实现

    千次阅读 2019-11-21 21:03:32
    定义一个内联函数,然后调用这个函数,不过得测一下平台调用内联函数的开销,而不仅仅是nop指令的个数,在自己的测试中,调用大概是9个cycle,而nop指令是1个cycle,所以我假设为9倍的线性关系进行打桩,每个平台会...
  • 怎么LED灯延时1秒

    千次阅读 2017-11-21 00:07:13
    先在keil界面,打开工程设置对话框,在Target标签下的Xtal(MHZ)后面填入自己的单片机的晶振频 率值;keil在编译时,要计算真实时间,就和这个晶振频率有关(关于单片机的四个周期,上篇已经描 述,此文就...
  • 使用STM32F4的SysTick定时器配置延时函数,使用时注意根据自己板子的晶振修改stm32f4xx.h中的HSE_VALUE宏定义和system_stm32f4xx.c中的PLL_M宏定义
  • 延时关机待机等等

    2013-08-19 15:26:35
    自己写的关机待机注销远程关机等等的功能能嗯
  • 延时在很多函数处理中都是一个必不可少的操作,对于很多初学者来说,都知道在代码里加一句delay()就能延时,如果再了解多一点就知道delay_us(xx)就能延时xx微秒,加一句delay_ms(xx)就能延时xx毫秒; ...
  • 笔者在互联网公司从事视频通信...尤其是云游戏行业,更是要求视频实时性在端到端延时低于200ms(毫秒),因此研发视频通信系统就越发艰巨了。笔者在这里就研发现代低延时视频通信系统所走的曲折弯路做一下记录。 ...
  • 013:Redis延时队列

    千次阅读 2019-03-28 21:55:30
    如果考虑到用户体验,可以由前端的代码替代用户自己来进行延时重试控制。它本质上是对当前请求的放弃,由用户决定是否重新发起新的请求。 sleep sleep 会阻塞当前的消息处理线程,会导致队列的后续消息处理出现...
  • 直播延时讲解

    千次阅读 2020-01-26 22:12:31
    到这里推流端的延时原理已经说完了,下面讲一下服务器端是如何造成延时的。 服务器端造成的延时 上面提到,发送端为了应对网络抖动,需要将数据缓存起来,服务器端同样将收到的数据加入缓存。但是服务器端加缓冲...
  • STM8S_002_TIM精确延时(阻塞式)

    千次阅读 2017-04-27 17:17:34
    Ⅰ、写在前面在某些特定场合,需要精确的延时(us级),...不理解的朋友可以自己网上搜索答案。 TIM的种类和功能很多,本文是基础的知识,讲的比较简单,关于定时器更加强大和实用的功能可以关注我后面的文章。 为
  • 一种Cortex-M内核中的精确延时方法

    千次阅读 多人点赞 2018-11-10 20:37:39
    本文介绍一种Cortex-M内核中的精确延时方法 前言 为什么要学习这种延时的方法? 很多时候我们跑操作系统,就一般会占用一个硬件定时器——SysTick,而我们一般操作系统的时钟节拍一般是设置100-1000HZ,也就是1ms...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,547
精华内容 63,018
关键字:

如何让自己延时