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 Timer1ENI();                                      // 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){/*这里就表示我们延时十秒成功了*/}}

c语言的单片机delay延时函数详解相关推荐

  1. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  2. 【C语言学习笔记】SWAP函数详解

    SWAP函数详解 本篇文章通过swap函数来深入了解C语言中函数的用法,与指针的应用.参考资料来源于经典书籍与技术博客的分享. 在复习完生存期相关的知识点后(详情可转至此处),初步认识了函数与本地变量 ...

  3. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  4. c语言流水灯程序详细讲解,用c语言编写单片机流水灯程序详解

    用C语言编写的单片机流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. ? 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组 ...

  5. 单片机c语言程序编写步骤,用c语言编写单片机流水灯程序详解

    用C语言编写的流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口, ...

  6. Delay_ms延时函数详解

    void Delay_ms(unsigned int time) {unsigned char n;while(time>0){for(n=0;n<187;++n){ asm(" ...

  7. Linux内核中的延时函数详解

    内核中涉及的延时主要有两种实现方式:忙等待或者睡眠等待.前者阻塞程序,在延时时间到达前一直占用CPU,而后者是将进程挂起(置进程于睡眠状态并释放CPU资源).所以,前者一般用在延时时间在毫秒以内的精确 ...

  8. C++语言篇 第九章 自定义函数详解

    序言 一个 C++ 程序无论大小,都由一个或者多个函数组成,而且其中必须有且只有一个函数main(),称之为"主函数". 由函数 main()调用其他函数来完成程序的特定功能.当然 ...

  9. [STC系列单片机/51单片机]软件延时计算方法详解

    选取12M晶振时,时钟周期为(1 / 12) us,且假如单片机工作在12T模式下,则一个机器周期为12 * (1 / 12) = 1 us. 为表述方便,下文均用T_M表示机器周期,观察KEIL仿真 ...

  10. Systick 延时函数详解

    void delay_init(u8 SYSCLK) { SysTick->CTRL&=0xfffffffb: fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1 ...

最新文章

  1. 设计点击左侧切换页面进出_Axure教程:(初级)导航中的页面切换
  2. Lync 2013就地升级到Skype for Business 2015-01
  3. 从入门到放弃,C++ 真这么难?
  4. 软件项目验收的准备工作
  5. 使用rancher创建负载均衡服务
  6. 程序员过关斩将--错误的IOC和DI
  7. socket 编程入门教程(一)TCP server 端:4、构造函数涉及的概念
  8. 开源代码是下一轮攻击潮的重灾区
  9. PyCharm 与 Git/GitHub 关联 / 取消关联
  10. Pannellum:实例之全景图预览
  11. Comet OJ Contest 4
  12. 如何查看自己在CSDN积分
  13. 《Python 快速入门》C站最全Python标准库总结
  14. java自动发送qq消息
  15. 空间波束形成matlab仿真,自适应波束形成Matlab仿真
  16. 第二个项目前预演,完成了,(第6200小时的时候)
  17. 陀螺仪和加速度传感器
  18. linux清理缓存和垃圾,CentOS等Linux系统如何清理系统垃圾和日志?
  19. 中文情感极性词典 NTUSD
  20. 母牛python_《Python》 母牛的故事Hello, world用筛法求之N内的素数

热门文章

  1. android 3d桌面壁纸,五款超酷安卓手机3D桌面软件合辑推荐
  2. mysql进阶教程pdf_SQL进阶教程 (MICK著) 高清pdf完整版
  3. 【转载】AssetBundle资源打包加载管理
  4. 【017】基于vue.js的网易云web端(实现播放、登录)(Node接口实现)
  5. Echarts 数据可视化 实现半圆饼图效果,渐变颜色
  6. 打破思维定势,创新景区门票网络分销模式
  7. c语言对英文字母循环加密,加密英语
  8. 【超分辨率】何凯明新作:Masked Autoencoders Are Scalable Vision Learners
  9. Maven安装(配置阿里仓库)
  10. 印刷质量缺陷的视觉检测原理概述