实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 今天主要介绍软件延时,关于硬件延时,之后定时器部分再做详细说明。

首先介绍单片机的几个周期

        指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

        时钟周期:也称为振荡周期,一个时钟周期 = 晶振的倒数。s

机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。

机器周期=6个状态周期=12个时钟周期。

51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x  μs。常用单片机的晶振为11.0592MHz,12MHz,24MHz。其中11.0592MHz的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

接下来列出这三种不同的晶振的延时函数

1、 11.0592MHz

//N ms延时

void delay_ms(uint n)
{uint i,j;for(i=n;i>0;i--)for(y=114;y>0;y--);
}

2、12MHz晶振

//延时n毫秒
void delay_ms(unsigned int n)
{unsigned int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<123;j++);
}
//延时n秒
void delay_m(unsigned int n)
{unsigned int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<21738;j++);
}
//延时10*n微秒
void delay_10um(unsigned int n)
{while(n--);
}

3、24MHz晶振

//延时n毫秒
void delay_ms(unsigned int n)
{unsigned int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<357;j++);
}
//延时n秒
void delay_s(unsigned int n)
{unsigned int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<54053;j++);
}
//延时10*n微秒
void delay_10us(unsigned int n)
{unsigned int i=0;char j=0;for(i=0;i<n;i++)for(j=0;j<2;j++);
}

建议大家封装为头文件,可以方便的调用。

接下来介绍几个自动适应主时钟的延时函数

//参数:ms,要延时的ms数,自动适应主时钟
#define MAIN_Fosc        11059200UL    //定义主时钟HZ
typedef unsigned int INT16U;void delay_ms(INT16U ms)    //INT16U 等价于 unsigned int
{INT16U i;do{i=MAIN_Fosc/9600;while(--i);     //96T per loop}while(--ms);       //--ms  ms=ms-1
}
//5us 延时函数,自动适应主时钟
#define MAIN_Fosc        11059200UL    //定义主时钟HZvoid delay5us()
{#if MAIN_Fosc == 11059200_nop_();#elif MAIN_Fosc == 12000000_nop_();#elif MAIN_Fosc == 22118400_nop_(); _nop_(); _nop_();#elif
}

51单片机几种精确延时(包含自动适应主时钟)相关推荐

  1. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  2. 使用51单片机自制电子万年历(包含驱动、基本万年历、闹钟、日程、修改时间等)

    使用51单片机自制电子万年历(包含驱动.基本万年历.闹钟.日程.修改时间等) 归档51单片机制作电子万年历,以及proteus仿真电路图,本设计涵盖蜂鸣器.uart.timer.矩阵扫描.lcd160 ...

  3. 51单片机的几种精确延时

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

  4. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法

    引言 单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一 ...

  5. 36-基于51单片机士壤湿度检测及自动浇花系统

    1.设计需求及目标 由STC89C52单片机+ADC0832+LCD1602液晶+yl-69土壤湿度传感器+5V抽水电机+按键+蜂鸣器构成. 具体功能: 1.液晶第一行显示实际湿度,液晶第二行显示湿度 ...

  6. c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法

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

  7. 51单片机 (四)延时函数

    接下来我们要讲单片机的延时函数,那什么是延时函数呢,其实在我们单片机代码中,每次执行一条代码是很快的,也就几微秒左右,那有时候我们想让某一条代码执行后等待一阵子,再去执行下一条,这时候就需要用到延时函 ...

  8. 基于51单片机的多点温度火灾报警自动灭火系统(实物图+源码+原理图+全套资料)

     资料编号:084 可以检测烟雾,温湿度,可以自动灭火,Wi-Fi主机和从机之间进行通信,并且可以OLED 显示 具体功能请看下面演示视频   全套资料齐全: 84-基于51单片机的WIFI从机主机通 ...

  9. keil4延时1秒C语言,KEIL单片机C语言精确延时值的计算

    关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为S ...

最新文章

  1. 代码打补丁的利器——diff和patch
  2. 使用OpenCV自动去除背景色
  3. tensorflow创建张量
  4. restful url 设计规范_RESTful API接口设计规范
  5. 直接导入用户信息到discuz ucenter.
  6. 二维数组的传参数的方法
  7. 大宝的读后感:(转载)
  8. 计算机安全知识课堂导入设计,“计算机安全与防护教学设计”教学设计.doc
  9. 输入序列不连续的序列检测
  10. Linux学习笔记(二)
  11. 1024,第 15 届「中国内核开发者大会」 参会指南(议程全剧透)
  12. java 顺序存储键值对_java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)...
  13. 经典软件测试技术分类
  14. java定义一个静态类_Java中的静态类
  15. STM32F103mini教程学习总结与心得(五)---->通用定时器
  16. C语言十进制转换二进制
  17. android enable ipv6,安卓开启ipv6网络支持小米手机(miui)IPv6无法使用的问题
  18. vue 创建项目使用npm还是yarn
  19. [分享]加拿大渥太华市卡尔顿大学John W. Chinneck教授谈如何组织论文
  20. 【无标题】学习浩辰CAD软件的心得

热门文章

  1. Node.js 模块系统
  2. sql server 2005下开启xp_cmdshell的办法
  3. Java抽象类/接口
  4. 关于程序、进程和线程
  5. 2016年1月20日总结
  6. elipse手机设备显示Target unknown或者offline解决方法
  7. 27.白纸黑点与黑纸白点
  8. 真不好意思,关于小猪妹(妖精)的
  9. 软考信息系统项目管理师_信息化与信息系统4_软件工程_新一代信息技术---软考高级之信息系统项目管理师006
  10. 20210722-20211010当项目经理积累的管理经验_血泪史_项目管理经验001