51单片机精确延时设计
在我们使用单片机的时候,很多情况下需要用到精确的延时。比如在跟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单片机精确延时设计相关推荐
- 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具
在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH 04H;2个 ...
- 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)
51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...
- 基于51单片机信号发生器仿真设计
本设计 基于51单片机信号发生器仿真设计 (仿真+程序源码+设计说明书) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0015 目录标题 ...
- 51单片机的延时子程序
延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念.机器周期和指 令周期的区 ...
- 51单片机综合课程设计多功能电子秤(显示时间、温度、存储、串口、报警装置等)
51单片机综合课程设计----多功能电子秤 关键词:proteus仿真.51单片机.DS1302时钟芯片.DB18B20温度芯片.AT24C02存储芯片.LCD1602液晶屏.ADC0832芯片等,文 ...
- 基于51单片机数字电压表的设计 仿真、程序、原理图(转发)
摘 要 数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示.而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编 ...
- stc89c51单片机音乐盒系统设计_基于51单片机音乐盒课程设计1.doc
基于51单片机音乐盒课程设计1 课程名称: 微机原理课程设计 题 目: 基于单片机的音乐盒设计 摘要 随着人类社会的发展,人们对视觉.听觉方面的享受提出了越来越高的要求.小小的音乐盒可以给人们带来美好 ...
- 51单片机控制继电器的设计及源代码
51单片机控制继电器的设计及源代码 一.实验要求 利用P3.5输出高低,控制继电器的开合,实现对外部装置的控制. 二.实验目的 掌握继电器控制的基本方法和经验. 三.实验电路及连线 四.实验说明 ...
- 基于51单片机的温度报警器设计
目 录 前言.............................................................................................. ...
最新文章
- Android互联网访问,get方式,post方式等方式
- IOS8 兼容本地推送
- scrapy框架的概念和流程
- pandas - DataFrame
- shell脚本触发java程序支持传参补跑 +crontab定时器_02
- bootstrap中col-xs-* 和 col-md-* 和col-sm-*这几个类是干嘛的啊?
- 从零开始搭二维激光SLAM --- Karto的前端实现与解读
- python安装包方式汇总
- ViewStub基本用法,include merge
- oshi因系统问题报错:IllegalStateException: Unmapped relationship: 7
- 非法集资(Illegal Fund-raising)
- 五、pcb文件初始设置
- android 播放assets下视频,安卓播放assets文件里视频文件相关问题分析
- VLAN 与 WLAN 的区别
- 怎么将WPS转换成WORD?看完你就学会了
- JDK的下载、安装、环境配置教程(2021年,win10、win11都可)
- 神经网络原理的简单介绍,神经网络几何原理图
- VUE React Angular
- 新型勒索软件Phobos利用弱安全性***目标
- FHQ-Treap 简介
热门文章
- 【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(上)
- 网络直播平台是否需要《信息网络传播视听节目许可证》?
- 【Latex格式】双栏双图左右并排有小标题、上下并列有小标题
- WPS衍生新软件,填补一大缺憾,让office汗颜,Excel用户很开心
- Delphi 下的Base64编码和解码
- 用手机访问电脑的本地服务器
- iar stm32_STM32强大的生态,在这里一起总结!
- [译]Veil-Pillage
- 团体程序设计天梯赛-练习集L1-058 6翻了 (15 分)
- 三分钟了解一下深度学习