文档库

最新最全的文档下载
当前位置:文档库 > 实验一 单片机延时程序实验

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

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

一、实验目的

1.掌握汇编语言程序设计的基本流程

2.学会使用MPLAB进行开发和调试。

3.掌握在线调试工具的使用方法。

二、实验内容

1.用4MHz外部晶体振荡器的PIC16F877A上用软件设计一个

20ms的软件延时子程序。

2.用MPLAB的软件模拟器及其附带的软件工具窗口Stopwatch

观测延时子程序执行的时间。

3.使用在线调试工具ICD2对所写程序进行调试。

三、软件设计

单片机软件延时的前提和基础是每条指令的执行时间是固定的,且大部分指令的执行时间是相同的。这就要求对于本章介绍的,每条指令所花费的的指令周期做到心中有数。指令集中5条跳转指令GOTO,CALL、RETURN、RETLW和RETFIE,由于它们必然引起程序跳转,造成流水线中断,因此肯定将占用2个指令周期。而其他4条有可能引起程序跳转的条件跳转指令DECFSZ、INCFSZ、BTFSC和BTFSS的执行时间随着条件而定。当条件为

真发生跳转时,需要占用2个指令周期,当条件为假不发生跳转时,仅占用1个指令周期。其余所有指令都只用1个指令周期。如果延时时间较短(微秒级别),可以连续插入几条NOP指令;如果延时时间较长(几个毫秒级别),可以插入单循环结构的程序;如果时间延时程序很长(10ms以上),则可以使用双嵌套循环的方法来实现。

这次我们要延时20ms,应该采用双嵌套循环的方法来实现。

四、流程图:

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

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

五、程序代码及测试

#INCLUDE "P16F877A.INC"

I EQU 20H

J EQU 21H

ORG 0000H

NOP

GOTO MAIN

ORG 0010H

MAIN BSF STATUS,5

CLRF TRISD

BCF STATUS,5

CLRF PORTD

LOOP

BSF PCLATH,3

CALL DELAY

BSF PORTD,0

CALL DELAY

BCF PORTD,0

BCF PCLATH,3

GOTO L OOP

ORG 0810H

DELAY MOVLW D'200'

MOVWF I

LOOP1 MOVLW D'200'

MOVWF J

LOOP2 DECFSZ J,f

GOTO L OOP2

DECFSZ I,f

GOTO L OOP1

RETURN

END

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

我们在程序中设置断点,用Stopwatch来查看程序运行的时间,发现和计算的相差不多。

六、实验体会及感悟

这次实验使我们认识到了汇编语言和C语言的不同。我曾在大二时用C语言编写过单片机程序,感觉比较简洁,我用很多精力来设计实现功能的算法,不会会也不需要关注诸如选体、选页之类的细节;而现在使用汇编语言编写同样的程序时,发现我除了要设计算法外,还必须更加关注与设备相关的细节,会否则便会出现许多奇怪的错误。比如这次实验中,我们发现LED灯闪烁的时候灯亮的时间总比灯灭的时间短,这个问题令我们十分困惑:程序与别组的几乎没什么不同,为什么结果竟会有这么大差距呢?于是我使用ICD2进行单步运行后发现,每当程序执行到主程序的无条件跳转指令时,没有正常跳转到LOOP处,而是跳转到了延时程序的LOOP2处。看到这里,我隐约感觉到种不正常跳转肯定与PCLATH有关,于是我在GOTO指令之前加了一条将PCLATH的第四位清零的指令,结果正确。时候我思考了很久终于知道了原因:这是由于每次PC 寄存器更新时都会会读入PCLATH寄存器中的值导致的,由于我没

有及时恢复PCLATH的值,因此才出了问题。