c语言的单片机delay延时函数详解

c语言的单片机delay延时函数详解c语言及单片机delay延时函数延时函数1、是什么2、为什么3、用在哪里?4、怎么做1、循环延时延时函数延时函数,作为一种常用函数,在不同的领域有不同的用处。而在嵌入式以及C语言的编写中,我们常常遇到需要自己来编写延时函数的情况,这种情况之下,了解其原理就显得必要。1、是什么简单来说,延时函数的目的就在于等,实际上就是要等一段时间再来执行接下来的代码。而这种简单的等,又可以采用多种方法来实现。例如:名称描述循环采用for或者while循环,让计算机跑无用的代码,从而达到延时的

大家好,又见面了,我是你们的朋友全栈君。

环境

开发环境:NY-IDE
单片机 :NY8B062D

延时函数

延时函数,作为一种常用函数,在不同的领域有不同的用处。而在嵌入式以及C语言的编写中,我们常常遇到需要自己来编写延时函数的情况,这种情况之下,了解其原理就显得必要。

一、是什么

简单来说,延时函数的目的就在于等,实际上就是要等一段时间再来执行接下来的代码。而这种简单的等,又可以采用多种方法来实现。例如:

名称 描述
循环 采用for或者while循环,让计算机跑无用的代码,从而达到延时的目的
定时器 通过定时器的计时功能,来达到延时的目的
系统调用 该功能其实还是通过以上的两种方式来实现,当时这种功能出现在有系统的程序里面,执行系统延时的情况下,单片机可以去执行别的函数,直到系统时间到,从而回来接着执行该代码,这实际上也提高了效率

二、为什么

为什么要延时?
我们有时候要等,但是又不能等太久。这就是延时函数的作用。简单来说,就是和上课铃一样,上课要上45分钟,我们就要延时。

三、用在哪里?

  1. 按键、io防抖动
  2. 计时
  3. 任务调度

四、怎么做

1、循环延时

首先我认为,要搞懂的东西就是几个周期的区别,这一篇文章有明确的介绍
链接: 关于时钟,指令,机器周期的详解

搞懂了周期的概念之后,来看看函数,这就是一个典型的例子

//延时函数
void delay(int count)
{ 
   
	int i;
	for(i=1;i<=count;i++)
	;
}

计算公式

时钟周期 = 1/时钟频率
机器周期 = 完成一个基本操作所需要的时间 = 时钟周期*n(n取决于单片的不同而不同)
指令周期 = 完成一次指令所需的时间           = 一或者两个机器周期 

而我们的计算公式则是:
(count(次数)*指令周期所需的时钟周期数(例如c51就是12)*循环中的指令数)/时钟频率

例如:

时钟频率:8Mhz
机器周期:2个时钟周期
指令周期:6个机器周期 = 12个时钟周期

delay(50);
void delay(int count)
{ 
   
	int i;
	for(i=1;i<=count;i++)
	;
}

延时 = (1/8M)*12*50*2(计数)  =  0.000075 s= 75us

链接: for循环详解.

2、定时器延时

有些时候,特别是当延时时间比较长的时候,for循环就显得十分的不现实了,这时候定时器就显得十分重要了。实际上,我们换个模式来思考问题,定时器就是一个可以自己跑的for循环。
思路:我们设置好一个定时器的循环时间,然后每次循环完成标志位加一,然后在自己的任务里面,判断标志位的大小,当数据达到的时候,就来处理对应的事件,这有利于单片机效率的提高

初始化定时器:

/**************************************************************************** * 函数名 : user_timer1_init() * 功 能 : 初始化timer1定时器 * 输 入 : * 全局变量 : * 输 出 : *****************************************************************************/
void user_timer1_init(void)
{ 
   
	//;Initial Timer1 
	TMRH = 0;
	TMR1 = 0xFF;								// Load 0xFF to TMR1 (Initial Timer1 register)
	T1CR1 = C_TMR1_Reload | C_TMR1_En;      	// Enable Timer1, Initial value reloaded from TMR1, Non-stop mode 
	T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div256;	// Enable Prescaler1, Prescaler1 dividing rate = 1:256, Timer1 clock source is instruction clock
	
	//;Setting Interrupt Enable Register 
	INTE = C_INT_TMR1;							// Enable Timer1
	ENI();										// Enable all unmasked interrupts 
}

中断中设置事件
/**************************************************************************** * 函数名 : __interrupt() * 功 能 : 中断函数 * 输 入 : * 全局变量 : * 输 出 : *****************************************************************************/
void _isr(void) __interrupt(0)
{ 
   
	static unsigned int timer_count   = 0;//作计数使用
	
	/*timer1 中断函数*/
	if(INTFbits.T0IF)
	{ 
   
		if(timer_count <32)
		{ 
   
			timer_count++;
		}
		else if(timer_count == 32)
		{ 
   
			delay_10s = 1;	//延时十秒成功
			timer_count=0;
		}
		INTF= (unsigned char)~(C_INT_TMR0);	// Clear T0IF
	}
}
最后在while里面处理

   while(1)
    { 
   
    	if(delay_10s  == 1)
    	{ 
   
    	/*这里就表示我们延时十秒成功了*/
		}
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137154.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VSCode 前端插件推荐

    VSCode 前端插件推荐开发综合推荐插件名:别名路径跳转使用说明:别名路径跳转插件,支持任何项目,使用场景:当你在开发页面时,想点击别名路径导入的组件时(演示如下)配置说明下载后只需自定义配置一些自己常用的别名路径即可//文件名别名跳转”alias-skip.mappings”:{“~@/”:”/src”,”views”:”/src/views”,”assets”:”/src/assets”,”network”:”/src/network”,”

    2022年7月25日
    11
  • 史上最全运放运算放大器知识讲解[通俗易懂]

    史上最全运放运算放大器知识讲解[通俗易懂]史上最全运放运算放大器知识讲解原文:http://www.sohu.com/a/154282071_755644调节和放大模拟信号,它是用途十分广泛的器件,接入适当的反馈网络,可用作精密的交流和直流放大器、有源滤波器滤波器的供应商、振荡器振荡器的供应商及电压比较器比较器的供应商。其应用领域已经延伸到汽车电子、通信、消费等各个领域,并将在未来技术方面扮演重要角色。运算放大器的分类…

    2022年4月30日
    109
  • ssh用法及命令

    ssh用法及命令http://blog.csdn.net/pipisorry/article/details/52269785什么是SSH?简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者…

    2022年4月30日
    46
  • 成功的草根网站_草根网 真看不懂

    成功的草根网站_草根网 真看不懂 如果你是菜鸟站长,如果你可以耐心的看完这篇文章,那么你的网站建设道路会少一些磕拌,多一些平坦.以上两个如果若不满足可以直接回主版面了.  首先声明一下,我也是菜鸟,虽然接触网站制作很久了,从2000年开始的,但中途做做停停,耽误了太多的时间,所以到现在我也只是个菜鸟,充其量只是个老菜鸟吧.但正因为我也是菜鸟,所以我说的东西都是些浅显易懂的,应该会对各位新手有些帮助吧,至少是少走很多弯路!

    2022年10月18日
    3
  • java二维数组试题_Java二维数组及习题总结

    java二维数组试题_Java二维数组及习题总结二维数组二维数组:就是一个由行和列组成的一个矩阵(Matrix);在这个矩阵中访问元素时,是根据元素的行角标和列角标所确定的。二维数组在内存中的存储:无论是二维数组,还是多维数组,它们本身就是一个一维数组,只不过该一维数组中的每一个元素是另一个一维数组。二维数组的创建:int[][]matrix=newint[3][4]———创建一个3行4列的二维数组,元素默认都是0;int[]…

    2022年5月29日
    42
  • Android Okio使用

    Android Okio使用Okio使用概述Okio是对JavaIO的封装,存储和处理数据变得更加容易。依赖库implementation’com.squareup.okio:okio:2.4.3’基本使用写操作try(BufferedSinksink=Okio.buffer(Okio.sink(newFile(“text.txt”)))){sink.writeInt(65);sink.writeUtf8(“hellookio”);sink.writeUtf8(“安卓”)

    2022年4月30日
    75

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号