实验任务一:教材P15使8个发光二极管同时闪烁,并做出延时分析本文引用地址:https://www.eepw.com.cn/article/201611/320487.htm
实验原理图(a)如上
实验程序清单如下:
ORG 0000H
LOOP: MOV P1,#0FFH
LCALL DELAY
MOV P1,#00H
LCALL DELAY
SJMP LOOP
DELAY: MOV R0,#0FFH //需要2μs
D1: MOV R1,#0FFH //需要255×2=510μs
D2: DJNZ R1,D2 //执行255×255=65025次
DJNZ R0,D1 //执行255次
RET //每次执行LCALL调用1次,需要4μs
END
延时分析:
在51单片机中DJNZ指令是双周期指令,MOV是单周期指令,RET是双周期指令。
其中在每次LCALL中MOV R0,#0FFH和RET各执行一次。而晶振频率为6MHz,那就是说一个机器周期为2μs。
每执行一次DELAY时MOV R0,#0FFH 指令执行一次,用时2μs;
指令MOV R1,#0FFH 执行255次用时510μs ;
DJNZ两条指令一共执行了(65025+255)×4=261120μs;
RET 指令执行一次,用时4μs;
所以延时时间大概为(2+510+261120+4)μs=261636μs,大约为262ms。
硬件实验时,P32一直微微地闪烁,而P35则一直微弱地亮着。
实验任务二: 通过改变延时程序改变二极管闪烁速度
延时程序如下:
DELAY: MOV R0,#80H //需要2μs
D1: MOV R1,#0FFH //需要128×2=256μs
D2: DJNZ R1,D2 //执行255×128=32640次
DJNZ R0,D1 //执行128次
延时分析:
DJNZ两条指令一共执行了(32640+128)×4=131072μs。
所以延时时间大概为(2+256+131072) μs=131330μs,约为131ms。
当延时时间为改成R0的值时的一半,理论上上述实验中的发光二极管闪烁的速度将会比改变之前的快一倍。但是在实体验的观察中,二极管的闪烁速度并没有快了一倍。这可能是个人的感观所致吧!
实验任务三:教材P108例4.9.8 实现8个LED的亮点流动
实验原理图如(a)所示
实验程序清单如下:
MOV A,#0FEH
LOOP: MOV P1,A
LCALL DELAY
RL A //使A的值不带进位向左循环移动
SJMP LOOP
DELAY: MOV R0,#0FFH //需要2μs
D1: MOV R1,#0FFH //需要255×2=510μs
D2: DJNZ R1,D2 //执行255×255=65025次
DJNZ R0,D1 //执行255次
RET
END
程序分析:
程序中A的初始值为FEH,其二进制形式为11111110,然后将A的值赋给P1,所以P1 的表现形式为最低位P1.0是亮的。之后立即调用延时子程序DELAY,由上述分析可知DELAY的延时是262ms,再使A的值不进位的向左循环移动,则A变为11111101,最后程序跳到开始处循环执行。而A的值依次变为11111011,…,01111111。那这个程序所实现的功能就是P1的8位灯依次亮,即其显示为流水灯。
实验心得:
实验遇到的问题是实验电路板与软件的连接。第一次插入接口时,LSIM总是找不到串口,连接不成功。经重启电脑后打开软件,重新检测并插入接口,才顺利查找到串口并连接成功。
由于实验之前在自己的电脑上利用住仿真软件实现过,对其基本操作已经熟悉,所以实验进行得还是比较顺利的。本实验主要是延时分析,利用延时子程序来改变二极管的闪烁速度;理论上的东西和实践上是有那么一点差距的,通过这个实验我明白了。
评论