在我们使用单片机的时候,很多情况下需要用到精确的延时。比如在跟DS18B20进行通讯的时候需要遵循严格的时序,这就需要我们严格把控程序执行的时间。

一般我们都是通过执行空语句的方式来使程序延时。这种方法是用循环嵌套的方式使程序执行空操作,达到延时的目的;除此之外还有使用中断的方式等。

我们可以通过debug来验证我们的函数延时是否准确。本次实验采用12M的晶振进行仿真模拟,应当对软件进行一些设置。在option中将晶振频率改为12M。用12M的晶振是因为这时候一条指令周期恰好是1us,方便我们计算。

首先我们构建一个延时函数void delay_10us( unsigned char tick ),即每次延时的最小单位是10us,通过控制tick的取值来改变延时的长度。在51单片机中有一个内置的指令_nop_( ),其执行一次的时间恰好是一个指令周期。这里我们使用的晶振是12M,那么执行一次_nop_( )就是1us。

在函数内部,通过tick的值来控制循环执行_nop_( )的次数。即:

void delay_10us(unsigned char tick){for(; tick>1; tick--){_nop_();_nop_();}}

这里本来应该是10个_nop_( ),但是却只写了两个。这是因为在实际调用的时候,进入函数、返回、循环跳转等都是会耗费时间的。这里具体写几个_nop_( )可以通过实际的调试来得到。

在主循环中构建下面的代码:

void main(){while(1){P1_0 = 1;delay_10us(10);P1_0 = 0;delay_10us(10);}}

进入debug模式,然后将P1_0添加到虚拟逻辑分析仪中,通过观察高低电平翻转的时间来检验延时的正确性。

可以看到时间差非常接近100us,除去执行P1_0 = 1耗费的时间基本满足我们的需求。我们可以通过改变不同的延时值来验证我们的函数是否正确。这里不再赘述。

现在我们利用刚才构建的延时函数来让单片机的引脚输出2KHz的占空比20%的方波;占空比为2KHZ,则周期为500us,简单计算得到方波需要保持100us高电平400us低电平。

需要注意,由于我们的10us延时是存在一些微小的偏差的,如果需要延时的tick数比较大,那么误差将会被放大,导致时间偏差较大。为了解决这个问题,我们可以少写一个tick,剩余的时间再额外用_nop_()或其它方式补上。具体需要补多少根据实际调试的结果去加,这里肯定不能一次性就做到合适,需要多次尝试。

void main()
{while(1){P1_0 = 1;delay_10us(9);delayNOP();_nop_();_nop_();P1_0 = 0;delay_10us(39);  delayNOP();}
}

这里的delayNOP()是在前面define的

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};

仿真结果如下,可以看到实验结果是符合我们的预期的。

附完整程序:

#include "reg52.h"
#include "intrins.h"#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();};sbit P1_0 = P1^0;void delay_10us(unsigned char tick);
void main()
{while(1){P1_0 = 1;delay_10us(9);delayNOP();_nop_();_nop_();P1_0 = 0;delay_10us(39);  delayNOP();}
}void delay_10us(unsigned char tick)
{for(; tick>1; tick--){_nop_();_nop_();}
}

51单片机精确延时设计相关推荐

  1. 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具

    在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH   04H;2个 ...

  2. 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

    51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...

  3. 基于51单片机信号发生器仿真设计

    本设计 基于51单片机信号发生器仿真设计 (仿真+程序源码+设计说明书) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0015 目录标题 ...

  4. 51单片机的延时子程序

    延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念.机器周期和指 令周期的区 ...

  5. 51单片机综合课程设计多功能电子秤(显示时间、温度、存储、串口、报警装置等)

    51单片机综合课程设计----多功能电子秤 关键词:proteus仿真.51单片机.DS1302时钟芯片.DB18B20温度芯片.AT24C02存储芯片.LCD1602液晶屏.ADC0832芯片等,文 ...

  6. 基于51单片机数字电压表的设计 仿真、程序、原理图(转发)

    摘 要 数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示.而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编 ...

  7. stc89c51单片机音乐盒系统设计_基于51单片机音乐盒课程设计1.doc

    基于51单片机音乐盒课程设计1 课程名称: 微机原理课程设计 题 目: 基于单片机的音乐盒设计 摘要 随着人类社会的发展,人们对视觉.听觉方面的享受提出了越来越高的要求.小小的音乐盒可以给人们带来美好 ...

  8. 51单片机控制继电器的设计及源代码

      51单片机控制继电器的设计及源代码 一.实验要求 利用P3.5输出高低,控制继电器的开合,实现对外部装置的控制. 二.实验目的 掌握继电器控制的基本方法和经验. 三.实验电路及连线 四.实验说明 ...

  9. 基于51单片机的温度报警器设计

    目 录 前言.............................................................................................. ...

最新文章

  1. Android互联网访问,get方式,post方式等方式
  2. IOS8 兼容本地推送
  3. scrapy框架的概念和流程
  4. pandas - DataFrame
  5. shell脚本触发java程序支持传参补跑 +crontab定时器_02
  6. bootstrap中col-xs-* 和 col-md-* 和col-sm-*这几个类是干嘛的啊?
  7. 从零开始搭二维激光SLAM --- Karto的前端实现与解读
  8. python安装包方式汇总
  9. ViewStub基本用法,include merge
  10. oshi因系统问题报错:IllegalStateException: Unmapped relationship: 7
  11. 非法集资(Illegal Fund-raising)
  12. 五、pcb文件初始设置
  13. android 播放assets下视频,安卓播放assets文件里视频文件相关问题分析
  14. VLAN 与 WLAN 的区别
  15. 怎么将WPS转换成WORD?看完你就学会了
  16. JDK的下载、安装、环境配置教程(2021年,win10、win11都可)
  17. 神经网络原理的简单介绍,神经网络几何原理图
  18. VUE React Angular
  19. 新型勒索软件Phobos利用弱安全性***目标
  20. FHQ-Treap 简介

热门文章

  1. 【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(上)
  2. 网络直播平台是否需要《信息网络传播视听节目许可证》?
  3. 【Latex格式】双栏双图左右并排有小标题、上下并列有小标题
  4. WPS衍生新软件,填补一大缺憾,让office汗颜,Excel用户很开心
  5. Delphi 下的Base64编码和解码
  6. 用手机访问电脑的本地服务器
  7. iar stm32_STM32强大的生态,在这里一起总结!
  8. [译]Veil-Pillage
  9. 团体程序设计天梯赛-练习集L1-058 6翻了 (15 分)
  10. 三分钟了解一下深度学习