单片机原理及应用(1)–延时1s

目录

  • 单片机原理及应用(1)--延时1s
    • 1.前言
    • 2.关于11.0592Mhz晶振
    • 3.关于”无用指令“
      • 3.1nop
      • 3.2DJNZ
    • 4.程序讨论
  • 演示:

1.前言

学单片机的各位入门第一个难题想必就是做一个精确的延时函数,在单片机里实现延时说白了就是让cpu去做很多无用的指令,比如说nop(no operations)。

还有类似DJNZ指令等,下面介绍11.0592MHz晶振的1s延时

2.关于11.0592Mhz晶振

11.0592,一串多么令人不爽的数字,为啥不凑个整数,但是想想既然量产的话一定自由其中的到了,今天咱们目前用不到,所以就不展开叙述了,简单来说就是为了波特率

11.0592Mhz晶振的时钟周期为1s/11.0592Mhz,即

时钟周期≈0.00000009s

机器周期的长度为12个时钟周期,即

机器周期≈0.00000109s(没算错)

下面的周期时长全部基于11.0592Mhz晶振

3.关于”无用指令“

在延时函数中常用的让CPU打摆子的指令就是nop和DJNZ,所以我们有必要来好好了解一下这两个指令

3.1nop

nop是no operations,意思就是没有操作,指令周期为1个机器周期,所以执行这条指令所耗费的时间就是0.00000109s

3.2DJNZ

djnz是一个跳转指令,判断第一个操作数是否为0,不是0就跳转执行相应的程序,为0就将第一个操作数减一,指令周期为2个机器周期,所以执行这条指令所耗费的时间就是0.00000218s

4.程序讨论

上面说到延时程序就是让cpu打摆子,一遍打摆子指令消耗的时间是有限的,所以我们需要重复执行,

重复执行的话,就要用到我们上面说过的DJNZ指令,类似于一个while(i–)循环

然后,这个i(while的)的范围又是比较小的

汇编中我们常用的存储数字的寄存器是Rx,而Rx只有8位,只能表示0-255范围的数值,

粗略计算一下延时1s大约要消耗的机器周期大约为900000

这么多遍肯定不能自己来一遍遍的输进去,所以需要嵌套,

而且只能在循环次数为0-255内进行嵌套

大概需要嵌套3层

所以程序的样子大概就是这个样子:

Delay:   MOV     R5,#n1
TIME1:  MOV     R6,#n2
TIME2:  MOV     R7,#n3
TIME3:  DJNZ    R7,TIME3DJNZ    R6,TIME2DJNZ    R5,TIME1RET

现在我们就只要计算三个嵌套分别有多少了

观察最内圈的循环TIME3:

第一句指令就是DJNZ R7,TIME3,由上面可知DJNZ占有两个指令周期,所以TIME3所能够产生的延时时间为2*n1个指令周期

第二句指令是DJNZ R6,TIME2,要执行此条指令必须完全等待第一句指令执行完毕才可以,然而R6所存储的数值n2就是第二句指令重复执行第一条指令的次数,即能延时多少个2*n1个指令周期,计算一下就知道是(2*n1+2(第二条DJNZ所消耗的指令周期数)+1(TIME2中MOV指令消耗的指令周期数))*n2

即(2*n1+3)*n2个机器周期

同理

整个延时函数执行完毕应该是消耗了

((2*n1+3)*n2+3)*n3个机器周期数

计算得到延时1s所消耗的机器周期个数应该为1/(12*(1/11059200))=921600个

所以只需要求解三元一次方程组((2*n1+3)*n2+3)*n3=921600即可

在这里用一个python小程序求解:

for j in range(255):for k in range(255):for l in range(255):a = ((2*j+3)*k+3)*lif a==921600 :print('j:',j,'k:',k,'l:',l,'a:',a)

得到如下解

========================== RESTART: E:\Desktop\123.py ==========================
j: 17 k: 249 l: 100 a: 921600
j: 18 k: 123 l: 192 a: 921600
j: 19 k: 117 l: 192 a: 921600
j: 20 k: 119 l: 180 a: 921600
j: 27 k: 101 l: 160 a: 921600
j: 30 k: 195 l: 75 a: 921600
j: 31 k: 189 l: 75 a: 921600
j: 32 k: 191 l: 72 a: 921600
j: 33 k: 89 l: 150 a: 921600
j: 38 k: 243 l: 48 a: 921600
j: 39 k: 237 l: 48 a: 921600
j: 40 k: 111 l: 100 a: 921600
j: 43 k: 69 l: 150 a: 921600
j: 44 k: 135 l: 75 a: 921600
j: 49 k: 57 l: 160 a: 921600
j: 51 k: 117 l: 75 a: 921600
j: 54 k: 83 l: 100 a: 921600
j: 57 k: 41 l: 192 a: 921600
j: 57 k: 105 l: 75 a: 921600
j: 58 k: 43 l: 180 a: 921600
j: 60 k: 39 l: 192 a: 921600
j: 66 k: 91 l: 75 a: 921600
j: 70 k: 179 l: 36 a: 921600
j: 88 k: 143 l: 36 a: 921600
j: 93 k: 65 l: 75 a: 921600
j: 94 k: 67 l: 72 a: 921600
j: 96 k: 63 l: 75 a: 921600
j: 117 k: 81 l: 48 a: 921600
j: 120 k: 79 l: 48 a: 921600
j: 123 k: 37 l: 100 a: 921600
j: 130 k: 219 l: 16 a: 921600
j: 132 k: 23 l: 150 a: 921600
j: 135 k: 45 l: 75 a: 921600
j: 149 k: 17 l: 180 a: 921600
j: 150 k: 19 l: 160 a: 921600
j: 152 k: 15 l: 200 a: 921600
j: 156 k: 39 l: 75 a: 921600
j: 164 k: 87 l: 32 a: 921600
j: 173 k: 33 l: 80 a: 921600
j: 174 k: 35 l: 75 a: 921600
j: 175 k: 29 l: 90 a: 921600
j: 183 k: 13 l: 192 a: 921600
j: 184 k: 207 l: 12 a: 921600
j: 207 k: 221 l: 10 a: 921600
j: 226 k: 27 l: 75 a: 921600
j: 227 k: 21 l: 96 a: 921600
j: 237 k: 161 l: 12 a: 921600
j: 240 k: 159 l: 12 a: 921600

理论上随便选一组带进去就可以了

最后上最后在开发板上的代码,用led体现1s的延时

     ORG 00HLJMP STARTORG  200H
START:  MOV     A,#01HLOOP: LCALL   DelayCPL     P2.0       SJMP    LOOP   Delay:   MOV     R5,#100
TIME1:  MOV     R6,#249
TIME2:  MOV     R7,#17
TIME3:  DJNZ    R7,TIME3     DJNZ   R6,TIME2DJNZ    R5,TIME1RET         

演示:

1s_led

单片机原理及应用(1)--延时1s相关推荐

  1. 51单片机如何延时1s,让LED灯闪烁

    精确地延时1s需要准确地计算,粗略地延迟1s可以自定义一个delay函数,下面我们让第一个LED灯延迟1s闪烁: //本题的delay函数参数为1时延迟的是1ms,1000是1s #include&l ...

  2. c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能

    原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...

  3. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)单片机定时器/计数器 (二)相关的特殊功能寄存器 1.工作方式寄存器TMOD 2.定时器/计数器控制寄存器TCON (三)定时器/计数器的工作方式 1.工作方式 ...

  4. 山东大学单片机原理与应用实验 3.2 拓展并行I/O口实验

    目录 一.实验题目 二.实验要求 三.实验过程及结果记录 1. 在Proteus环境下建立原理图,如图1所示,并保存为expandIO.DSN文件. 2. 将实验代码写入文本文档,并保存为expand ...

  5. MSP430单片机原理及应用 实验

    单片机原理及应用 课程实验(二) 实验项目:MSP430简单程序设计 实验目的:学会用C语言进行简单程序设计 实验要求:掌握编写排序程序 实验内容: (1)设计一个对8个数据(0-255,任意设置)的 ...

  6. 《单片机原理及应用》复习提纲

    <单片机原理及应用>复习提纲 单片机应用系统的典型结构图   单片机应用系统核心硬件技术包括: 1.时序 2.中断 3.地址译码 单片机应用系统核心软件技术包括: 1.寻址方式.指令系统 ...

  7. 嵌入式技术(单片机原理)基本概念梳理(保研/考研面试)

    嵌入式技术基础(单片机原理),常见概念及知识点整理(保研面试用). 目录 第1章 概论 第2章 MCS-51系列单片机的资源配置 第3章 MCS-51系列单片机的指令系统及汇编语言程序设计 第4章 单 ...

  8. [渝粤教育] 昆明理工大学 单片机原理及接口技术(宋庆和) 参考 资料

    教育 -单片机原理及接口技术(宋庆和)-章节资料考试资料-昆明理工大学[] 1.4 发展趋势 1.[多选题]未来单片机发展趋势表现在以下几个方面 A.CPU流水线结构.增加数据总线的宽度提高运算速度和 ...

  9. 山东大学单片机原理与应用实验 3.4 矩阵键盘扫描实验

    目录 一.实验题目 二.实验要求 三.实验过程及结果记录 1. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件. 2. 编写控制源程序,将其保存为key ...

最新文章

  1. 13.angular时间
  2. 求出歌手的得分python_哪位大侠帮我做做python的题目啊,做其中5个就好。跪求啊...
  3. 卧式储罐液位体积计算公式excel_ELL外测式液位计在氢氟酸储罐上的实际应用
  4. 详测 Generics Collections TQueue (3): OnNotify、Extract
  5. 学习方法之02掌握记忆方法,在学习上就赢了一半
  6. Fiori Elements detail table data request logic
  7. LeetCode之Intersection of Two Arrays
  8. 数据结构专题(一):1.2.求元素个数,取元素与定位
  9. mysql 启动 内存_mysql启动内存的疑问
  10. 【docker系列】docker深入浅出之安装Nginx+PHP+MySQL
  11. 【java】java 安全 jaas 文件 何时 解析 以及 怎么解析的
  12. 谷歌logo的“前世今生”
  13. 第一章:J2EE高级软件工程师面试题集
  14. android4.4.3版本root,EMUI3.0 Android4.4.4以下完美ROOT教程
  15. Teamviewer检测为商业用途的解决方案
  16. Vue命令式弹窗组件如何实现?我很好奇
  17. c语言visit函数作用,[求助]二叉树遍历的程序里面的visit函数如何实现
  18. python收益风险点图_使用python matploblib库绘制准确率,损失率折线图
  19. 利用pip安装Django
  20. 企业怎么写出一篇优质的软文稿件

热门文章

  1. 《梦里花落知多少》的经典语句(怀念)
  2. 音视频技术开发周刊 | 261
  3. BZOJ 4079 [Wf2014] Pachinko
  4. 知识变现创业者必读——《知识变现实操手册》
  5. UITableviewCell的花式操作
  6. 高内聚低耦合是什么意思?
  7. 西密歇根大学计算机科学专业排名,西密歇根大学排名
  8. kdj指标主要看哪个值_看懂KDJ其实没那么难,一文为你详解KDJ指标使用技巧!
  9. 12306采用Pivotal GemFire分布式解决方案 解决尖峰高流量并发问题
  10. XML 解析错误:找不到根元素