汇编程序及LED灯的周期点亮

一,汇编指令

(1)51单片机的汇编语言

ORG 0H         ; 指定程序起始地址

START:         ; 程序入口标签
    MOV P1, #55H  ; 将 55H(0101 0101)送入 P1 端口
    ACALL DELAY   ; 调用延时子程序
    MOV P1, #AAH  ; 将 AAH(1010 1010)送入 P1 端口
    ACALL DELAY   ; 调用延时子程序
    SJMP START    ; 无条件跳转到 START 标签,实现循环

DELAY:          ; 延时子程序
    MOV R1, #50H  ; 初始化 R1 寄存器
LOOP:
    NOP          ; 空操作,占用一个机器周期
    NOP          ; 空操作,占用一个机器周期
    DJNZ R1, LOOP  ; R1 寄存器自减并判断是否为 0,若不为 0 则跳转到 LOOP 标签
    RET          ; 返回主程序

(2)NOP指令

​ NOP指令在汇编中的作用是空指令,意味着什么都不做,一般用来控制CPU时间,达到时钟延时的效果。

​ NOP指令为单周期指令,可由晶振频率计算出延时时间,对于12M晶振,延时1μs。

1|DELAY:MOV R5,#10
2|D1: MOV R6,#200
3|D2: MOV R7,#250
4|	NOP
5|		DJNZ R7,$		;250*2=500μs
6|		DJNZ R6,D2		;500*200=100000μs
7|		DJNZ R5,D1		;100000*10=1000000μs
8|		RET

二,汇编语言用查表法完成求平方数的程序

通过查表法,求出1~9的平方数

代码如下

ORG 0H         ; 指定程序起始地址

START:         ; 程序入口标签
    MOV R0, #0   ; 初始化计数器 R0
    ACALL SQUARE ; 调用求平方子程序

    ; 这里将结果存储到 P1 端口
    MOV A, R0    ; 将计数器 R0 的值移动到累加器 A
    MOV P1, A    ; 将累加器 A 的值送入 P1 端口

    SJMP START   ; 无条件跳转到 START 标签,实现循环

SQUARE:        ; 求平方子程序
    MOV A, R0    ; 将计数器 R0 的值移动到累加器 A
    MOV R1, A    ; 备份累加器 A 的值到 R1

    MOV A, R0    ; 将计数器 R0 的值移动到累加器 A
    MUL AB       ; 累加器 A 与累加器 B 相乘,结果存储在累加器 A

    MOV R0, A    ; 将累加器 A 的值移动到计数器 R0
    MOV A, R1    ; 将备份的值移动回累加器 A

    RET          ; 返回主程序

将上述代码利用Edsim软件进行仿真测试

三,普中开发板

 在利用普中开发板做实例之前,我们首先需要了解关于普中开发板的相关知识,详细可以参考以下链接:https://blog.csdn.net/yu57955/article/details/120928956

​ STC-ISP软件是专门给STC系列单片机下载烧录程序的,并不能适用于ARM系列单片机,可以在http://www.stcmcu.com/官网下载最新的版本。详细使用指南参考:https://blog.csdn.net/qq_28576837/article/details/125712180

(1)LED周期点亮

LED原理如下

常见的LED发光二极管都有两个引脚,其中长的引脚接电源正极,为电流进入LED的引脚,短的接电源负极,为电流离开LED的引脚。如果LED正向导通,此时LED电阻基本为零,LED导通发光,如果LED反向导通,此时LED电阻可理解为无穷大,LED无电流通过,LED不发光。

实现周期性点亮代码如下,

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

(2)LED汇编代码的点亮

代码如下

ORG 0H         ; 程序起始地址

START:         ; 主程序入口标签
    MOV P1, #00H ; 初始化 P1 端口为全灭状态
    MOV R1, #01H ; 初始化计数器 R1,用于循环控制

LOOP:          ; 循环标签
    MOV P1, R1   ; 将计数器 R1 的值送入 P1 端口
    ACALL DELAY  ; 调用延时子程序
    CPL R1       ; 取反计数器 R1 的值,用于改变LED灯的状态
    SJMP LOOP    ; 无条件跳转到 LOOP 标签,实现循环

DELAY:         ; 延时子程序
    MOV R2, #20H ; 初始化 R2 寄存器
DELAY_LOOP:
    NOP         ; 空操作,延时
    NOP         ; 空操作,延时
    DJNZ R2, DELAY_LOOP ; R2 寄存器自减并判断是否为 0,若不为 0 则跳转到 DELAY_LOOP 标签
    RET         ; 返回主程序

四,实验结果 

点亮

LED流水灯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值