相关文章推荐
逃跑的面包  ·  ODBC 工具會顯示 32 位元和 64 ...·  1 年前    · 
想出家的乒乓球  ·  vue中methods一个方法调用另外一个方 ...·  2 年前    · 
气宇轩昂的豆腐  ·  解决:ImportError: ...·  3 年前    · 
Code  ›  c语言的单片机delay延时函数详解开发者社区
c语言 单片机 c语言函数
https://cloud.tencent.com/developer/article/2078915
逃跑的企鹅
2 年前
全栈程序员站长
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
全栈程序员站长
社区首页 > 专栏 > 全栈程序员必看 > c语言的单片机delay延时函数详解

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

作者头像
全栈程序员站长
发布 于 2022-08-22 13:07:18
3.5K 0
发布 于 2022-08-22 13:07:18
举报

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

c语言及单片机delay延时函数
  • 环境

  • 延时函数
  • 一、是什么
  • 二、为什么
  • 三、用在哪里?
  • 四、怎么做
    • 1、循环延时
    • 2、定时器延时

环境

开发环境: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)
 
推荐文章
逃跑的面包  ·  ODBC 工具會顯示 32 位元和 64 位元 - SQL Server | Microsoft Learn
1 年前
想出家的乒乓球  ·  vue中methods一个方法调用另外一个方法_51CTO博客_一个vue调用另一个vue的方法
2 年前
气宇轩昂的豆腐  ·  解决:ImportError: cannot import name 'login' from 'django.contrib.auth.views' - 希声lx - 博客园
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号