51单片机(多方法)点灯实验+汇编学习

1,用汇编指令2种方法实现点灯+闪烁效果

汇编语言多重循环

汇编语言实现电灯思路为,灯亮=>延迟1s=>灯灭。

我们实现汇编代码的方式为一步一步实现,首先实现灯亮,如果你看过我上篇博客(51单片机学习),那么你就应该知道地址90H连接着LED1,我们通过改变90H的存储值可实现LED1灯亮灯灭

接着我们写一个LCALL+函数名,这是一条三字节指令,在51单片机中三字节指令比较少,111条指令中有17条是三字节指令,这条LCALL指令的作用是跳转到子程序,子程序运行完后再执行下一行的指令,相当于C语言中的调用函数,我们在这里使用LCALL指令调用延迟函数。延迟函数我们采用减法操作,使用DJNZ+寄存器+函数名,寄存器首先存一定数值,DJNZ指令是让寄存器里面的数减一,当寄存器里面的数不等于0时,跳转到函数名所在函数,等于0时则执行DJNZ下一行指令,当我们把函数名放在DJNZ之前,比如D1:  DJNZ R7,D1,就相当于C++中的while循环,当R7不等于0时,R7减一,DJNZ每运行一次消耗的时间为2微秒(与晶振频率和指令有关)

实现灯灭也是改变地址90H值,具体如何改变可以看我上篇博客(51单片机学习)

具体代码实现如下,由于寄存器最大只能存储255的值,我们要采用多个DJNZ实现多重循环的效果

 最后一条AJMP LOOP的含义是跳转到LOOP函数,也就是最开始的地方,以实现不断循环灯亮灯灭的过程(效果图如下)

 如何让DELAY函数到达1s延迟,我们已知DELAY函数中的DJNZ指令运行一次消耗2微秒,上面代码运用了3个寄存器,存储了20、100、248这三个数,计算总耗时为:2\cdot 20\cdot 100\cdot 248=992000\mu s               

模拟测得耗时为998ms,存在些许误差

循环+NOP空操作实现

NOP语句是空操作,是用来消耗时间的,每使用一句NOP语句消耗一个1微秒,根据多重循环的思路,我们可以很快写出以下代码

LOOP:
	MOV 90H,#0xFE
    LCALL DELAY
    MOV 90H,#0xFF
    LCALL DELAY
    AJMP LOOP

DELAY: MOV R7,#250
D1: MOV R6,#248
D2: NOP
    NOP
	NOP
	NOP
	NOP
    NOP
	NOP
	NOP
	NOP
    NOP
	NOP
	NOP
	NOP
    NOP
    DJNZ R6,D2
    DJNZ R7,D1
    RET
END

考虑到DJZN消耗2微秒,我们使用了14个NOP函数在DJNZ函数之前,运行一次DJNZ所消耗时间就为16微秒(NOP耗时+DJNZ耗时),计算得总耗时为:

16\cdot 248\cdot 250=992000\mu s

模拟测得总耗时为997ms,也存在些许误差

2,汇编语言用平方数表求平方数

用算法计算出平方数固然不错,但是将各个数的平方数存储起来然后查表将会更加简单高效

下面是代码实现

我们给A初始值为5,最后求得平方数R0为19(16进制)也就是25(10进制)

 3,开发板上点亮流水灯

烧录软件使用STC-ISP或者PZ-ISP

然后使用C语言,代码如下:

void main(void)
{
	while(1)
	{
		P0=0xfe;
		delay_ms(50);
		P0=0xfd;
		delay_ms(50);
		P0=0xfb;
		delay_ms(50);
		P0=0xf7;
		delay_ms(50);
		P0=0xef;
		delay_ms(50);
		P0=0xdf;
		delay_ms(50);
		P0=0xbf;
		delay_ms(50);
		P0=0x7f;
		delay_ms(50);
	}
}

最后是烧录效果

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值