精华内容
下载资源
问答
  • 这是一个很小的利用中断延时的小程序,但对于初步接触单片机中断的人来说,这不为是一个很好的例题。
  • 实现功能:定时器产生延时1秒程序 使用芯片:STC15F104E 晶振:12MHZ 波特率:9600 编译环境:Keil
  • 在学单片机时我们第一个例子就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们可以用定时器来...
  • 自己写的,测试通过。MSP430F149定时器中断延时1s,TimerA,MSP430F149定时器中断延时1s,TimerA,MSP430F149定时器中断延时1s,TimerA
  • STM32学习记录之定时器中断代替延时函数实现更精准计时(延时延时在很多函数处理中都是一个必不可少的操作,对于很多初学者来说,都知道在代码里加一句delay()就能延时,如果再了解多一点就知道delay_us(xx)就能...

    STM32学习笔记---------------------------普通延时与定时器延时哪个更好

    不知不觉距离上一次发文已经过了两个月了,期间经历了很多事情,也学到了很多知识点,本文也是继上一篇文章之后的学习记录,希望有不足之处能得到各位大神指点!

    简要介绍延时

    对于初学者来说,延时是一个很简单却又不简单的功能,对于一些普通的延时函数我了解到的大概有以下这些:

    //毫秒级延时
    void delay_ms(u16 time)//这个time是你自定义的时间长度,比如2ms时time = 2;3ms时time = 3等,以此类推
    {
    	u16  time_cnt_ms  = 0;//这里定义一个变量,计数
    	while(time --)
    	{
    		time_cnt_ms   = 10000;//这个值可以通过示波器或者逻辑分析仪抓,实在不行自己掐着表用LED显示来判断
    		while(time_cnt_ms  --);
    	}
    }
    
    //微秒级延时
    void delay_us(u16 time)
    {
    	u16  time_cnt_ms  = 0;
    	while(time --)
    	{
    		time_cnt_ms   = 8;//这个我是按8位记一次随便定义的,最好根据逻辑分析仪或者示波器自己抓了再自定义
    		while(time_cnt_ms  --);
    	}
    }
    

    以上是普通的延时函数,在实际项目中其实这样做有很大的忌讳,第一这样做其实不太精准,当你调用上面延时函数多了用示波器或者逻辑分析仪抓就知道时间会有一定的误差,而以后的学习中对整个程序的运行时间可控性考虑是成为高级程序员必不可少的经理;第二这样做就相当于空耗CPU资源,让他停在这个递减计数中循环,后果严重点可能会直接烧毁元器件啥的。
    所以我们有了一种精准一点的延时,既能精准计数,又能处理别的事情而不占用CPU太多资源。没错,我要说的就是利用定时器中断延时,下面贴出我对这方面的程序运用:

    //首先我们要了解什么是系统时钟--------建议网上直接搜索,最好看你所用的芯片型号的规格书
    //首先还是一如既往地固定套路   定时器初始化 ---> 定时器中断优先级--->定时器中断处理函数
    void TIM3_init(u16 arr,u16 psc)//这里是定时器的初始化函数,初学者最好理解透(看规格书、看视频找资料等)   固定的套路
    {
    	*( volatile unsigned int *) 0x4002101C |= 1<<1;  //这里直接操作寄存器地址,当初为了更好的理解下面写法的道理找了很久
     	TIM3->ARR=arr;  	//设定计数器自动重装值 
    	TIM3->PSC=psc;  	//预分频器设置
    	TIM3->DIER|=1<<0;   //允许更新中断				
    	TIM3->CR1|=0x01;    //使能定时器3
    	NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2		//这里中断优先级配置							 
    }
    
    uint16_t time = 0;//这个要在对应的头文件里设置外部能调用 extern uint16_t  time;
    u8 flag_1ms = 0;//这个要在对应的头文件里设置外部能调用 extern u8  flag_1ms;
    //定时器3中断服务程序	 
    void TIM3_IRQHandler(void)
    { 		
    	if(TIM3->SR&0X0001)//溢出中断
    	{	                                         
    			time++;
    			flag_1ms = 1;
    	}	
    		
    	TIM3->SR&=~(1<<0);//清除中断标志位 	    
    }
    
    void mission_1ms(void)//你可以定一个1ms的标志位,把1ms执行一次的函数都放到这里面来
    {
    	//1ms做一次某任务
    	if(flag_1ms)
    	{
    		zuoaizuodeshi();
    		jiaopeijiaoderen();
    		tingxiangtingdege();
    		kanxiangkandedianying();
    		//.......等等;
    	}
    }
    
    void mission_anytime(void)//也可以任意定时间做某事
    {
    	if(time >= 1)//每隔1ms做某事
    	{
    		time  = 0;//计数累加到某一个值清零一次
    		zuoaizuodeshi();
    		jiaopeijiaoderen();
    		tingxiangtingdege();
    		kanxiangkandedianying();
    		//.......等等;
    	}
    
    		//注意以下情况:time用过一次了。上面已经把time清零了,所以下面的函数怎么加也加不到10,下面的函数是错误示范(不能同时用一个time,那么你可以在中断处理函数中再加一个time1,不过不能加太多,这样也会导致定时器中断处理任务太多超过定时的1ms)
    		if(time >= 10)//每隔10ms做某事
    	{
    		time  = 0;//计数累加到某一个值清零一次
    		zuoaizuodeshi();
    		jiaopeijiaoderen();
    		tingxiangtingdege();
    		kanxiangkandedianying();
    		//.......等等;
    	}
    }
    
    int main (void)
    {
    	TIM3_init(1000-1,72-1);//这里根据对应定时器的自动重装载值和预分频值得到每1毫秒执行一次TIM3中断里的事情
    	/*这个主要看你芯片的规格和晶振的那个,
    	我的是72MHz的频率:那么720000/预分频值 = 10000Hz,也就是每秒频率变化10k次(从10000递减到0),那么每毫秒频率变化多少次?(1秒 = 1000毫秒,那么1ms的重装载值是多少?1000嘛,但是计数应该是从(1000-1)递减到0)*/
    	while(1)
    	{
    		zuoaizuodeshi();
    		jiaopeijiaoderen();
    		tingxiangtingdege();
    		kanxiangkandedianying();
    		//.......等等;
    		mission_1ms();//这里注意要在主函数中调用1ms任务函数
    	}
    }
    
    

    夜深了,先简要介绍这两种常用的延时吧,预知后事如何,请听下回分解!!
    以上就是作者现在对定时器的大致理解,或许理解还不到位或者还没见识到更高级的处理,需要大家多多指出和相互交流,最后送大家一副对联吧:有志者,事竟成,百二秦关终属楚;苦心人,天不负,三千越甲可吞吴。
    本文不足之处希望大家多多指出,非常感谢。

    展开全文
  • 所以,中断程序中不要写调用延时程序中断程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断程序中设置一个标志位,在主程序中查这个标志位,当...

    A回答:
    通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。

    所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。

    首先,对于CPU频率的理解,1Mhz的频率CPU周期就是1us(1 / 1000000秒)
    B回答:
    1、既然1Mhz对应1us(也就是1us对应一个指令周期,不考虑流水线的单指令周期),这样,一个指令周期就对应一条指令。

    2、假设每条指令都有2个字节大小(16位指令),这样,1ms时间内1Mhz的CPU可以大约运行2KB的代码。因此如果中断处理函数的代码越接近2KB,则越容易对中断。

    3、假设一个10Khz外设,中断处理程序允许的最大安全尺寸是多少?

    易Cortex M3为例,支持16/32位指令操作(大部分为单周期指令),假设主频为72Mhz,100Khz相当于100us 。

    则如果是16位指令(前面算过1ms 2KB代码),72 * 100 * 2到72 * 100 * 4之间(14.4~28.8),去最小14.4KB。

    展开全文
  • 本文介绍的是PIC单片及定时器溢出中断的设计思路及程序设计
  • 实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。...本程序中假设使用频率为12 MHz的...

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

    1 使用定时器/计数器实现精确延时

    单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

    在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

    2 软件延时与时间计算

    在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。

    2.1 短暂延时

    可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

    void Delay10us( ) {

    _NOP_( );

    _NOP_( );

    _NOP_( );

    _NOP_( );

    _NOP_( );

    _NOP_( );

    }

    Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。  可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

    2.2 在C51中嵌套汇编程序段实现延时

    在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

    如:#pragma asm

    汇编语言程序段

    #pragma endasm

    延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:

    ◆ #pragma asm、#pragma endasm不允许嵌套使用;

    ◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;

    ◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;

    ◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;

    ◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。

    将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

    展开全文
  • STC系列51单片机延时程序汇总

    千次阅读 2020-07-15 09:08:03
    答应大家得福利来啦,这一期我就给大家分享一下STC系列51单片机得延时程序汇总。 11.0592MHz晶振(延时1ms): (1)Y1指令集 适用于SCT89C系列,STC90C系列、STC89LE系列、STC90LE系列 void Delay1ms() //11.0592...

    答应大家得福利来啦,这一期我就给大家分享一下STC系列51单片机得延时程序汇总。
    11.0592MHz晶振(延时1ms):
    (1)Y1指令集
    适用于SCT89C系列,STC90C系列、STC89LE系列、STC90LE系列

    void Delay1ms()		//11.0592MHz
    {
    	unsigned char i, j;
    
    	_nop_();
    	i = 2;
    	j = 199;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    (2)Y3指令集
    适用于STC12C系列、STC12LE系列、STC11F系列、STC11L系列、STC10F系列、STC10L系列、STC15F104E、STC15L104E、STC15F104EA、STC15L104EA

    void Delay1ms()		//11.0592MHz
    {
    	unsigned char i, j;
    	_nop_();
    	i = 11;
    	j = 190;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    (3)Y5指令集
    STC15F系列、STC15L系列、STC15W系列,但是不包Y3中的

    void Delay1ms()		//11.0592MHz
    {
    	unsigned char i, j;
    	_nop_();
    	_nop_();
    	_nop_();
    	i = 11;
    	j = 190;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    (4)Y6指令集合
    适用于STC8F系列、STC8A系列

    void Delay1ms()		//11.0592MHz
    {
    	unsigned char i, j;
    	i = 15;
    	j = 90;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    11.0592MHz晶振(延时1us):
    (1)Y1指令集
    适用于SCT89C系列,STC90C系列、STC89LE系列、STC90LE系列
    这个没有得哦
    (2)Y3指令集
    适用于STC12C系列、STC12LE系列、STC11F系列、STC11L系列、STC10F系列、STC10L系列、STC15F104E、STC15L104E、STC15F104EA、STC15L104EA

    void Delay1us()		//@11.0592MHz
    {
    	_nop_();
    } 
    

    (3)Y5指令集
    STC15F系列、STC15L系列、STC15W系列,但是不包Y3中的

    void Delay1us()		//@11.0592MHz
    {
    	_nop_();
    	_nop_();
    	_nop_();
    }
    

    (4)Y6指令集
    适用于STC8F系列、STC8A系列

    void Delay1us()		//@11.0592MHz
    {
    	unsigned char i;
    	_nop_();
    	_nop_();
    	i = 1;
    	while (--i);
    }
    

    然后就是答应大家得12MHz晶振得延时程序
    12MHz晶振(延时1ms):
    (1)Y1指令集
    适用于SCT89C系列,STC90C系列、STC89LE系列、STC90LE系列

    void Delay1ms()		//@12.000MHz
    {
    	unsigned char i, j;
    	i = 2;
    	j = 239;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    (2)Y3指令集
    适用于STC12C系列、STC12LE系列、STC11F系列、STC11L系列、STC10F系列、STC10L系列、STC15F104E、STC15L104E、STC15F104EA、STC15L104EA

    void Delay1ms()		//@12.000MHz
    {
    	unsigned char i, j;
    	_nop_();
    	_nop_();
    	i = 12;
    	j = 168;
    	do
    	{
    		while (--j);
    	} while (--i);
    } 
    

    (3)Y5指令集
    STC15F系列、STC15L系列、STC15W系列,但是不包Y3中的

    void Delay1ms()		//@12.000MHz
    {
    	unsigned char i, j;
    	i = 12;
    	j = 169;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    (4)Y6指令集合
    适用于STC8F系列、STC8A系列

    void Delay1ms()		//@12.000MHz
    {
    	unsigned char i, j;
    	i = 16;
    	j = 147;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    12MHz晶振(延时1us):
    (1)Y1指令集
    适用于SCT89C系列,STC90C系列、STC89LE系列、STC90LE系列

    _nop_();
    

    直接一个空指令就可以了
    (2)Y3指令集
    适用于STC12C系列、STC12LE系列、STC11F系列、STC11L系列、STC10F系列、STC10L系列、STC15F104E、STC15L104E、STC15F104EA、STC15L104EA

    void Delay1us()		//@12.000MHz
    {
    	_nop_();
    	_nop_();
    } 
    

    (3)Y5指令集
    STC15F系列、STC15L系列、STC15W系列,但是不包Y3中的

    void Delay1us()		//@12.000MHz
    {
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    }
    

    (4)Y6指令集
    适用于STC8F系列、STC8A系列

    void Delay1us()		//@12.000MHz
    {
    	unsigned char i;
    	i = 2;
    	while (--i);
    }
    
    展开全文
  • 由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢?  一般情况下,都认为...
  • 本文为单片机12m晶振延时10ms程序,希望对你的学习有所帮助。
  • 延时中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机...
  • 使用51单片机实现延时中断,采样,A\D转换,代码移植性高
  • 怎么编写单片机晶振为6MHz,编写100ms延时程序?设主频12MHz的51单片机,编一个100ms二重循环的延时程序如下,供参考。其它汇编可以类似编程。SSSS:MOV R0,#99;本指令是单周期指令,用时1usKKKK0:DJNZ R0,KKKKK;2...
  • 单片机定时器延时程序

    千次阅读 2021-05-19 16:54:11
    单片机定时器延时程序单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR...
  • 用定时器中断控制流水灯延时时间,用外部中断0控制按键实现切换流水灯延时时间,外部中断1控制实现切换流水灯方向;
  • 但对于绝大多数人,我们在最最初让灯闪烁起来时大约都会用到阻塞延时实现,会像如下代码的样子: while(1) { LED=OFF; Delay_ms(500); LED=ON; Delay_ms(500); } 然后,在我们接触到定时器,我们会发现...
  • 网上的s3c6410定时器大多都不行,自己经过3天的摸索,总算可行了,自己使用的是tiny6410的板子,LED的IO口不一样,如果是OK6410,自己稍微修改下。代码自己亲自测试过的,保证可行!万分激动,发上来共享,方便大家...
  • 51单片机中断嵌套,定时器延时

    千次阅读 2021-01-08 11:24:28
    51单片机中断嵌套,定时器延时前言一、如何做到定时器延时?二、如何做到外部中断?三、如何合并1.引入库2.读入数据总结 前言 这里讲的是中断嵌套,具体的话是用定时器延时,外部中断触发,不断切换 提示:以下是...
  • 新手在单片机开发应用过程中,时而出现延时中断的问题,那该怎么解决呢?一些人会把单片机中断延时概念搞混,首先我们先来理清楚单片机中断延时的概念。中断是停止当前正执行的任务,转而去执行中断任务,等...
  • 基于单片机条件跳转指令DJNZ在延时程序中的应用.pdf
  • 应用中断,精确的c语言延时程序,可以精确到mS,时间长度可调,程序整体结构严谨易懂,可移植性好,让你不再为延时而苦恼
  • 延时函数程序

    2014-05-14 16:10:25
    /修正了中断中调用出现死循环的错误 //防止延时不准确,采用do while结构! ////////////////////////////////////////////////////////////////////////////////// static u8 fac_us=0;//us延时倍乘数 static u16 ...
  • 但对于绝大多数人,我们在最最初让灯闪烁起来时大约都会用到阻塞延时实现,会像如下代码的样子:然后,在我们接触到,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断一次,让灯亮或灭,其余的时间...
  • msp432延时程序,可修改对应mpu频率(中断方式)
  • 微机汇编一秒延时程序,比较难得的资源 ,单片机上延时一秒容易,微机上比较困难
  • KeilC51程序设计中几种精确延时方法

    千次阅读 2021-05-24 01:45:50
    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。...本程序中假设使用频率为12 MHz的...
  • 但对于绝大多数人,我们在初让灯闪烁起来时大约都会用到阻塞延时实现,会像如下代码的样子:然后,在我们接触到,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断,让灯亮或灭,其余的时间系统还...
  • ARM如何实现延时

    2020-08-06 20:21:00
    ARM延时问题一直是比较令人头疼的问题,因为ARM是流水工作,并且在程序跳转的时候不遵循流水规律,所以不像51单片机一样好计算,今天为了调18B20,因此把ARM的延时问题研究了一下。总结起来,有三种计算方法。
  • Arduino-04 外部中断:关闭开启与延时

    千次阅读 2020-07-21 21:54:44
    对外部中断只响应一次,直到任务执行完,并且在任务中存在延时。如何实现开启关闭中断延时呢?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,230
精华内容 20,892
关键字:

中断延时程序