您好, 访客   登录/注册

浅谈中职《单片机技术及应用》的延时问题

来源:用户上传      作者:

  【摘    要】单片机是一个小而完善的微型计算机系统。它具有体积小、功能强、成本低以及便于嵌入式分布式控制得到了极为广泛的应用。《单片机技术及应用》是中等職业教育电子专业的一门重要专业课,不论是对今后进入高职院校深造的同学们,还是中职学习结束就进入社会就业的同学们都是至关重要的。单片机的“延时及计算问题”往往困扰着同学们,为此总结一点小小经验供参考。
  【关键词】单片机  智能型  延时  软件延时  硬件延时
  中图分类号:G4      文献标识码:A DOI:10.3969/j.issn.1672-0407.2019.12.204
   单片机是一种是采用大规模或超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。单片机具有体积小、功能强、功耗成本低以及便于嵌入式分布式控制得到了极为广泛的应用。
   《单片机技术及应用》是我国中等职业教育学校电子专业的一门重要专业课程,也是参加对口升学高考的专业课之一,不论是对今后进入高职院校深造的同学们,还是中职学习结束就进入社会就业的同学们来说都是至关重要的一门专业课,每位同学都应认真学好这门课。在这门课程的教学中,我发现单片机的“延时及计算问题”往往困扰着同学们的学习,一是抽象不好理解,二是不容易计算。延时的方法有两类即软件延时与硬件延时。教学中通过不断反思总结,得到一点小小的经验,希望能对同学们的学习带来一些帮助与启发。
   1.软件延时
   即用汇编语言或C语言编写出延时子程序,单片机运行程序就需要时间从而达到延时的目的。为延长一定的时间往往采用循环体进行,让单片机反复执行一些无用的指令,就是为了延时。下面举一简单例子来说明:用单片机控制一只发光二极管闪烁发光。(中职阶段汇编程序学习较多,以汇编程序为例。)
   例一:
   ORG      0000H
   AJMP      MAIN
   ORG      0100H
   MAIN:   SETB  P1.0
   LCALL   DELAY
   CLR     P1.0
   LCALL  DELAY
   SJMP    MAIN
   DELAY:
   MOV  R7,#200
   DL1:MOV  R6,#250
   DL2:NOP
   DJNZ   R6,DL2
   DJNZ   R7,DL1
   RET
   END
   程序中标号“DELAY”所包含的程序就是一段软件延时程序。同学们对延时程序编写的格式过程往往不是问题,但是对工作寄存器Rn的数字应该是多少却不知道怎样来的,如何计算。要知道延时时间的相关计算,应注意几点:(1)是要知道单片机应用系统中晶体振荡器的频率多大,即算出时钟周期与机器周期;(2)是所用指令的机器周期数,有些指令是单周期,有些指令是双周期,还有些指令是四周期;(3)是计算所有延时指令执行的机器周期数。其中关键是第三点,特别是多层循环的延时程序。
   例二:1秒延时子程序(晶振12MHZ,一个周期为1μs)
   DELAY:MOV  R7,#10
   DELAY1:MOV  R6,#200
   DELAY2:MOV  R5,#248
   DJNZ  R5,$
   DJNZ  R6,DELAY2
   DJNZ  R7,DELAY1
   RET
   对每条指令进行计算得出精确延时时间为:
   1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2
   =[(2*248+3)*200+3]*10+3=998033μs≈1s
   经过整理得到一个延时时间的计算公式:延时时间=[(2*第一层循环数+3)*第二层循环数+3]*第三层循环数+3,这就是有三层循环体延时时间的计算公式,当然也可以构成四层的循环。若只有两层或一层循环,那么第三层循环数或第二层循环数就取1。教学中有的老师提到,个别钻牛角尖的同学会问到软件延时不精确,要十分准确延时又咋办呢?这也能办到,可以在主延时程序的后面再加一段程序就可解决。
   如上面的例二,还差1967μs可再加这样一段延时程序。
   DEL:NOP
   MOV  R4,#13
   DEL1:MOV  R3,#74
   DJNZ  R3,DEL1
   DJNZ  R4,DEL1
   RET
   对每条指令进行计算得出精确延时时间为:
   1+[1+(1*13)+(2*74*13)+(2*13)+(2*10)+2]    =[(2*74+3)*13+3]+1
   =1967μs
   为此在例一中我们用单片机去控制一只发光二极管的闪烁,亮、灭时间均為1s,其完整的汇编程序如下。(若晶振频率12MHZ,一个周期为1μs)
   ORG      0000H
   AJMP     MAIN
   ORG      0100H
   MAIN:     SETB  P1.0
   LCALL    DELAY
   LCALL    DEL
   CLR      P1.0
   LCALL    DELAY
   LCALL    DEL
   SJMP     MAIN
   DELAY:DELAY:MOV  R7,#10
   DELAY1:MOV  R6,#200
   DELAY2:MOV  R5,#248
   DJNZ     R5,$
   DJNZ     R6,DELAY2
   DJNZ     R7,DELAY1
   RET
   DEL:     NOP
   MOV     R4,#13
   DEL1:    MOV  R3,#73
   DJNZ     R3,DEL1
   DJNZ     R4,DEL1
   RET
   END
   2.硬件延时。
   硬件延时就是用单片机内部的定时器/计数器T0或T1来完成。首先分清一个概念,其实定时器和计数器的原理都是一样的,都是“数”脉冲,有些人强行的认为,定时器是定时的,计数器是计数的,那是不对的。其区别在于定时器使用的是内部时钟脉冲(有时候也是用外部基准时钟,但情况比较少),因为时钟脉冲稳定的特点,我们就可以通过计算脉冲个数N,知道时间T=N*(1/F)(F为时钟频率);计数器一般是外部脉冲统计个数。不过有时候定时器和计数器联合使用,用来测量外部脉冲频率。
   对于51单片机来说,内部的两个定时器实质是16位的计数器,分别由高8位和低8位两个寄存器组成,这两个定时器由两个8位特殊功能寄存器即TOMD与TCON控制,TOMD用于设置定时器的工作方式,TCON用于控制定时器的启动与中断申请。同学们要熟悉这两个特殊功能寄存器相应位的功能及设置,这是学习中的一个难点;另一个难点是定时器装入初值的计算,要将十进制换算成十六进制,分成高8位和低8位,当设置定时时间后,定时器开始计时,主程序继续执行,不用管定时器,当定时时间到,定时器就会申请中断,单片机就响应中断,处理定时子程序需要完成的工作,完成后返回到主程序继续主程序的执行。具体实现就是计数到65535再加一的话,定时器就会溢出,如果开了中断的话,就会进入中断服务程序。
   例三:用定时器做1S延时的汇编语言程序
   MOV  TOMD,#01H
   MOV   R1,#00H
   MAIN:
   MOV   TH0,#3CH
   MOV   TL0,#0B0H
   SETB   TR0
   JNB    TF0,$
   CLR    TF0
   INC     R1
   MOV   A,R1
   CJNE   A,#20,MAIN
   上面程序延时时间为T=(65536-15536)×1×20=106us=1s
   定时器/计数器初值的计算T0初值=216 -(T/时钟周期×12)。
   总之延时程序的编写是单片机应用的一个重要而又基础的任务,可能需要多次修改才能满足要求。掌握好延时程序的编写对今后从事项目开发有着重要意义。
  参考文献
  [1]姜治臻等.单片机技术及应用【M】,高等教育出版社.
   [2]徐新艳.单片机及工程应用【M】,高等教育出版社.
   [3]51开发板学习.单片机教程网【DB/OL】.
转载注明来源:https://www.xzbu.com/9/view-14927246.htm