单片机延时程序

  • 格式:doc
  • 大小:52.50 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一单片机延时程序实验

一、实验目的与要求:

在使用4MH在外部晶体振荡器的PIC16F877A上用软件设计一个20ms的软件延时子程序。另外,还要求用MPLAB的软件模拟器及其附带的软件工具窗口stopwatch观测延时程序执行的时间。

二、实验内容:

1.硬件电路设计:

本实验中用的是软件延时,利用循环来实现延时功能。电路就用了单片机的原本电路。没有用到其他的功能模块,单片机与ICD3相连接。

2.软件设计思路:

单片机软件延时的前提和基础是每条指令的执行时间是固定的,且大部分指令的执行时间是相同的。这要求对每条指令所花费的指令周期(Tcy)做到心中有数。指令集中5条无条件跳转指令GOTO,CALL.RETURN,RETLW和RETFIE,由于它们必然引起程序跳转,造成流水线中断,因此肯定将占用2个指令周期。而其他4条有可能引起程序跳转的条件跳转指令DECFSZ,INCFSZ,BTFSC和,BTFSS的执行时间,需要占用2个指令周期,当条件为假不发生跳转时,仅占用1个指令周期。其余所有指令都只用1个指令周期。

每个指令周期Tcy的时间长度,计算方法:如果采用4MHz 的外部晶体(fosc=4 MHz),则PIC中档单片机的指令周期Tcy 为1us,这是一个整数。而采用其他频率的外部晶体时,指令周期时间将反比于外部晶体频率。

至于软件延时的结构和实现方法,其实可以采用任何指令和结构,因为只是通过执行指令耗费时间。但通常情况下有两个选择延时程序结构的原则:

(1)执行指令周期数计算方便。如果含有太多复杂的条件跳转循环等结构势必会造成指令周期的计算困难,甚至可

能造成执行所造成的软件延时时间不等。

(2)不能占用太多的程序空间。试想用20000个NOP指令来实现20ms的延时,显然是可以的,但是这样做浪费了

整整一个页的程序存储器,得不偿失,而通过适当的循

环结构,重复执行某些相同的程序是比较合理的方法。

因此,软件延时程序一般采用下列方法:如果延时时间

短(微妙级别),可以连续插入几条NOP指令;如果延

时时间长(几个毫秒级别),则可以使用双嵌套循环的

方法来实现。

实验的流程图:

实验的源程序:

#INCLUDE “P16F877A.INC”

ORG 0000H

NOP

BSF STATUS,5

CLRF TRISD

BCF STA TUS,5

CLRF PORTD LOOP

BCF PORTD,0

CALL DELAY

BSF PORTD,0

CALL DELAY

GOTO LOOP

DELAY MOVLW D’131’

MOVWF i

LOOP1 MOVLW D’50’

MOVWF j

LOOP2 DECFSZ j,f

GOTO LOOP2

DECFSZ i,f

GOTO LOOP1

RETURN

END

执行上述延时子程序所需要的指令周期个数等于(1+1)+[(1+1)+(1+2)×(j-1)+2+(1+2)]×(i-1)+2+2。当i等于131,j 等于50是指令周期数约为20000个。在4HMz外部晶振条件下,这个延时程序将花费大约20ms。

程序说明如下:

(1)上述等式中,第一个括号中的“1+1”对应两条向i中放入初值131的两条搬运指令。

(2)中括号中的“1+1”对应两条向j中放初值50的两条搬运指令。

(3)中括号中的第一个“1+2”对应DECFSZ和GOTO指令,当j没有被减到0时,这两条指令将被连续循环(j-1)次,

因此每次将花费(1+2)×(j-1)个指令周期。

(4)当j被减到0时,单片机将跳过6行的GOTO指令,这时DECFSZ将花费2个指令周期的时间,也就是接在(1+2)

×(j-1)之后加上的那个“2”。

(5)上式中括号里最后的那个“1+2”对应接下来的DECFSZ 和GOTO指令,和上面的一对DECFSZ和GOTO指令一样,

在i被减到0之前,这两条指令将被连续循环(i-1)次。(6)当在i被减到0时,单片机将跳过第8行的GOTO指令,,也就是式中的倒数第二个”2”。

(7)最后的“2”对应RETURN指令。

在设计和编写延时子程序时,为了精确计算整个延时程序的延迟时间,常常需要逐条分析每一条指令被执行的所占用的指令周期数,这是一项既枯燥又费力的工作。可以利用MPLAB软件提供的stopwatch窗口来直接得到延时程序运行的时钟周期数。

这里的跑马表功能类似于田径场上赛跑计时用的跑表或者称为秒表,还有人叫它马表。打开跑表观察窗口的操作很简单,在MPLAB SIM软件模拟器模式下,选择Debugger 菜单中的stopwatch即可弹出观察窗。该窗口可以计算一段程序执行过程所需要的指令周期数和占用时间。在程序运行的过程中,软件模器会更新instruction Cycles 和Time域,包括时间单位。

使用跑马表观察窗口的方法如下:

(1)单击Synch(同步),将Stopwatch的值与Total Simulated(模拟总数)的值同步。

(2)单击Zero(归零),可以随时将Instruction Cycles和Time 的值设置为0.

(3)选择Clear Simulation Time On Reset(在复位时清零模拟时间),可以在程序复位时将Instruction Cycles(指令周

期)和Time的值设置为0.

(4)其实MPLAB可以通过Debugger菜单下Setting菜单项配置Processor Frequency值。单击Debugger下的Settings,

在弹出的Simulator Settings对话框中的osc/trace(振荡