汇编程序与周期性任务设计
汇编指令分析
经查阅可知,单条指令“mov R6 #250”和“DJNZ R6,D2”的指令分别为一个周期和两个周期,我们可以得出DJNZ为双周期指令。则它们对应的时钟周期us值分别为1us与2us。
DELAY:MOV R7,#250:执行一次,1us。无语句跳转给它。
D1:MOV R6,#250:执行250次。250us。
D2: DJNZ R6,D2:执行了250250=62500次,625002=125000。
DJNZ R7,D1:250*2=500次。
即共1+250+125000+500=125751次。换算约为0.13秒。说明0.13秒左右才变化一次亮灭状态。
LED灯流水灯间隔周期为1s
经过学习之后可得知,若将闪烁间隔周期改为1秒,汇编程序如下:
c语言的程序代码如下:
原理就是设计一个函数,a就是参数,指想延时的毫秒数。函数本身就是迭代延时1毫秒时的代码,延时多少秒就将a设置为多少。此处应将a设置为1000,即1秒。
` #include <reg51.h>
#include <intrins.h>
void delay_ms(unsigned int a)
{
unsigned char i,j;
while(a)
{
i=2;
j=239;
do{
while(--j);
}while(--i);
a=a-1;}
}
void main(void)
{
while(1)
{
P0=0xfe;
delay_ms(1000);
P0=0xfd;
delay_ms(1000);
P0=0xfb;
delay_ms(1000);
P0=0xf7;
delay_ms(1000);
P0=0xef;
delay_ms(1000);
P0=0xdf;
delay_ms(1000);
P0=0xbf;
delay_ms(1000);
P0=0x7f;
delay_ms(1000);
}
}
`
protues仿真结果![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/102f7268f7fef8d6473c617131bb986b.gif)
edsim51仿真结果
普中开发板实验结果
查找平方数
ORG 0000H ;程序的起始地址
SQUARE_TABLE: DB 0, 1, 4, 9, 16, 25, 36 ;建立存储0—6平方数的数表
0007| MOV DPTR, #SQUARE_TABLE ; 设置数据指针来指向数表
000A| MOV R1, #4 ; 将数字4放入R1
000C| CALL SQUARE_FUNCTION ; 调用所设置的函数
SQUARE_FUNCTION:
000E| MOV A, R1 ; 将所求平方的数放入R1
000F| MOVC A, @A+DPTR ; 查表
0010| MOV R2, A ; 将查找结果移至R2
0011| RET ; 返回结果
END ;
edsim51仿真结果
可见仿真结果R2处为0x10,即为16进制的16.
心得体会与总结
硬件方面,对普中开发板的使用还不够得心应手,导致烧录的时候出了很多岔子,还需更多时间多家熟悉。
代码学习方面,汇编语言的使用我个人感觉比c语言简单,但是指令很多,需要多使用,多记忆才能记住,而c语言我认为相对好懂,但是使用没有汇编语言方便,二者各有所长。还需学习的地方有很多。