一、汇编语言LED延时点亮
根据实验课所给上图程序请查阅汇编指令 “MOV R6,#250”和“DJNZ R6,D2”的指令周期数,计算其对应的时钟周期 us值;然后计算 Delay函数的总的循环次数和对应的时钟周期总数us。
(1)指令周期是指CPU从内存取出一条指令并执行指令所需时间。一般用CPU周期(机器周期)来表示;一个周期指令周期包含若干个机器指令
机器指令是CPU执行一条指令所需最短时间,通常由多个时钟周期组成
时钟周期=振荡周期即单片机晶振频率倒数即1/12M。
根据查阅汇编指令可知MOV R6,#250是一个周期;DJNZ R6,D2是两个周期,
即执行MOV这句语句一次需要1μs,给R6被赋值250;而DJNZ这条指令是给R6减1并循环执行250次且该句是两个周期因此该语句需要500μs。
DELAY: MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
(2)根据上图的DELAY函数可以看出相当于两个循环叠加先在R6进行250次循环然后R7减1再次赋值进行R6又250次循环这样子进行250次,即D1循环进行了250次,D2循环了250X250次,其中第二句的R7-1循环250次。计算可得总次数为63000。而整个函数延时为:125ms即0.125s。
(3)实现LED 每隔1s亮灭。
由于两个寄存器的叠加循环无法达到实现一秒的延时,因此要增加一层循环增加一个R5以增长延时。
代码如下:
LOOP:SETB 90H ;led0置1
LCALL DELAY ;调用延时函数
CLR 90H ;led0置0
LCALL DELAY
AJMP LOOP ;跳转到LOOP
DELAY: MOV R5,#25 ;延时函数
D1: MOV R6,#100
D2: MOV R7,#200
D3: DJNZ R7,D3
DJNZ R6,D2
DJNZ R5,D1
RET ;返回主函数
END ;指令结束
二、 查找平方数的汇编程序实现。
(1)写一个汇编查找平方数的程 序并解释,附上在Edsim51、proteus截图。
ORG 000H
LJMP START
ORG 80H
START:
NOP
NOP
MOV SP,#60H
MOV DPTR,#0300H
MOV A,#4
MOVC A,@A+DPTR
MOV 40H,A
LOOP:
SJMP LOOP
ORG 300H
DB 00H,01H,04H,09,10H,19H,24H,31H,40H,51H,64H,79H,90H,0C4H
END
此处代码参考B站:8051汇编查表程序与DB伪指令 —老头学汇编之十一
(2)在Edsim51进行验证,结果如下:
三、LED闪烁及流水灯实验
关于使用普中单片机开发板实验
(1)汇编闪烁。
ORG 0000H
LJMP MAIN
ORG 0010H
MAIN:
Start:
SETB P2.0
LCALL DELAY
CLR P2.0
LCALL DELAY
AJMP Start
DELAY: MOV R5,#25
D1: MOV R6,#100
D2: MOV R7,#200
D3: DJNZ R7,D3
DJNZ R6,D2
DJNZ R5,D1
RET
END
在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入
开发板上led出现闪烁效果如下:
ORG 000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
LOOP:
MOV P2,A
LCALL DELAY
RL A
SJMP LOOP
DELAY: MOV R5,#25
D1: MOV R6,#100
D2: MOV R7,#200
D3: DJNZ R7,D3
DJNZ R6,D2
DJNZ R5,D1
RET
END
在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入
开发板上led出现流水灯效果如下:
(3)C语言闪烁。
#include<reg51.h>
void delay(unsigned int t);
void main()
{
while(1)
{
P2=0xfe;
delay();
P2=0xff;
delay();
}
}
void delay(unsigned int t)
{
while(--t);
}
在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入
开发板上led出现闪烁效果如下:
(4)C51流水灯。
#include <reg51.h>
#include <intrins.h>
void delay_ms(int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<1000;j++) _nop_();
}
}
void main(void)
{
while(1)
{
P2=0xfe;
delay_ms(1000);
P2=0xfd;
delay_ms(1000);
P2=0xfb;
delay_ms(1000);
P2=0xf7;
delay_ms(1000);
P2=0xef;
delay_ms(1000);
P2=0xdf;
delay_ms(1000);
P2=0xbf;
delay_ms(1000);
P2=0x7f;
delay_ms(1000);
}
}
在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入
开发板上led出现流水灯效果如下:
四、总结
本次实验让我对汇编的延时函数等相关知识有了更多了解。