51单片机汇编语言模块化编程的一点技巧!!

而且目前单片机的教材还是侧重于汇编语言。因此学习用单片机汇编语言程序进行结构化设计还是很有必要的。单片机汇编语言模块化编程的一点技巧。为单片机基本系统电路。单片机基本系统电路

目前8051单片机应用开发主要有两种编程语言:汇编语言和C51语言。 C51语言是一种结构化编程语言。 用C51编写的应用程序结构清晰、模块化程度高、可读性强、易于移植。 不过C51语言也有一个缺点,就是编译后生成的目标代码空间比汇编要大。

而且,目前的单片机教材仍然以汇编语言为主。 因此,还是有必要学会使用单片机汇编语言程序进行结构化设计。 我们知道C51语言是一种函数式语言,它的程序是由函数组成的。 每个源程序有且只有一个主函数main()和若干个函数。 这些函数中的每一个都用于完成特定的任务。 换句话说,如果一个项目有多个功能,并且需要多个任务来实现这些功能,那么它的源程序中就会有多个或多个功能。 在汇编语言中,源程序中只有程序和子程序。 那么我们是否可以以子程序为基本单位,用一个子程序来实现一个功能,从而实现模块化编程呢? 实践证明是可行的。 但在编译程序时不要忘记汇编语言的特点。 注意子程序之间单片机资源的使用,避免不同子程序共享同一资源而导致程序执行错误。 嵌套子程序调用的层数等。本文以“60秒倒计时电路”为例,讲一下51单片机汇编语言模块化编程的一些技巧。

1. 60秒倒计时电路及编程

1、功能要求

所谓倒计时,就是先给出一个初始值,然后从初始值中减去“1”,直到值为“0”。 60秒倒计时是每隔1秒将给定的初始值“60”减去“1”,直到该值达到“0”。

该倒计时电路需要两个按钮。 一是“Reset”按钮,按下按钮设置倒计时初始值,并关闭指示灯; 另一个是“开始”按钮,按下该按钮即可开始倒计时。 并采用两位数LED数码管显示当前倒计时值。 当定时器到期时,指示灯亮起。

2、电路组成

实现上述功能要求的微控制器接口电路如图1所示。

51单片机汇编语言模块化编程的一点技巧!!

图1 单片机接口电路

图中,按钮SB1用作“初始化”按钮,按钮SB2用作“开始”按钮。 按SB1按钮将显示值设置为“60”。

按SB2键,显示值每秒减少“1”,直至值为“0”

停止计数。 按钮和指示灯连接到P0端口。 P0.0为初始按钮,P0.1为启动按钮,P0.7为指示灯。 十位LED数码管连接到P2端口,个位LED数码管连接到P1端口。 图2所示为微控制器的基本系统电路。

51单片机汇编语言模块化编程的一点技巧!!

图2 单片机基本系统电路

3. 功能分析

根据60秒倒计时的功能要求,要求单片机完成以下任务:

⑴ 按键扫描。 用于判断某个键是否按下以及按下的是哪个键? 根据不同的键,给出对应的键值。

⑵ 定时显示。 这里的时间值使用两位数,所以需要将显示的时间值的个位和十位取出后才能显示。

⑶ 将显示的数字转换为7段码。 因为单片机中的数据都是以二进制形式存储或操作的。 这里的输出显示采用两位LED数码管来显示计时值。 显示的数字需要点亮数码管的某些部分才能显示该数字。 不同的数字需要点亮数码管的不同段。 因此,需要将显示的数字转换成相应的显示段码才能正确显示。

⑷ 延误。 包括按键去抖 1 秒延迟和 10 毫秒延迟。

⒋ 编程

程序根据所实现的功能采用模块化结构,由一个主程序和多个子程序组成。 每个子程序都是一个独立的模块,完成一定的任务,有时会使用调用参数。 本例共有5个子程序,分别是按键扫描子程序、10ms延时子程序、1s延时子程序、显示子程序、取段码子程序。

⑴ 按键扫描子程序

按键扫描子程序完成扫描按键的任务,判断是否有按键被按下,当有按键按下和抬起时,将相关按键值返回给主程序。 流程如图3所示。该子程序没有入口参数,但有一个出口参数,即key的键值,存放在寄存器R3中。 寄存器R3的值为“60H”,表示SB1键被按下; 寄存器R3中的值为“00H”,表示SB2键被按下。

51单片机汇编语言模块化编程的一点技巧!!

图3 按键扫描子程序流程图

根据图3的流程图和51单片机的指令系统编译出的子程序如下:

;———- 按钮扫描————–

; 退出参数键值存储在寄存器R3中,用于标识是哪个键。

;R3=60H,表示SB1被按下; R3=00H,表示SB2被按下

key_scan: jnb kb_init, k1check; SB1 压力传送

jnb kb_begin, k2check ; SB2 压机传输

sjmp ksr;

k1check:acall del10; 具有毫秒延迟和防抖功能的调用

jb kb_init,ksr; 干扰、返回

jnb kb_init,$; 等待按键释放

mov r3,#60h; 为SB1,键值“60H”被发送到寄存器R3

sjmp ksr; 是,不执行任何操作返回

k2check:acall del10; 具有毫秒延迟和防抖功能的调用

jb kb_begin,ksr; 干扰、返回

jnb kb_begin,$ ; 等待按键释放

mov r3,#00h; 为SB2,键值“00H”被发送到寄存器R3

ksr: ret; 返回

;———————————

⑵ 显示子程序

显示子程序完成后,从显示值中取出十位,转换为显示断码,发送到单片机的P2口; 它从显示值中取出个位数,将其转换为显示断码,并将其发送到单片机的P1端口。 口任务。 流程如图4所示。该子程序有一个入口参数,即显示值,存储在寄存器R2中。

51单片机汇编语言模块化编程的一点技巧!!

图4 子程序流程图

根据图4的流程图和51单片机的指令系统编译出的子程序如下:

;———— 显示子程序————

; 入口参数存储在寄存器R2中

显示:mov a,r2; 获取显示值

移动b,#10; 获取显示值的十位数

p ab;

acall seg7; 调用转换子程序并获取显示中断代码

mov p2, a; 发送十位段代码到端口P2

移动a,b; 取个位数

acall seg7; 调用转换子程序并获取显示中断代码

mov p1, a; 发送到 P1 端口的一位数段代码

视网膜; 返回

;———————————

⑶ 获取段代码子程序

段码子程序完成将显示的数字转换为7段共阳极LED数码管对应的段码的任务。 流程如图5所示。

51单片机汇编语言模块化编程的一点技巧!!

图5 段代码子程序流程图

子程序有一个入口参数和一个出口参数。 入口参数为正在显示的数字,出口参数为该数字的段码(对应位=0表示亮),两者均存储在累加器A中。

根据图5的流程图和51单片机的指令系统编译出的子程序如下:

;————- 获取段码————-

; 显示查表得到的累加器A中的值的破码

; 进入和退出参数存储在累加器A中

seg7:公司a; 获取显示的数字并将累加器A加1

移动a,@a+pc; 查找表

视网膜; 返回

db 0c0h,0f9h,0a4h,0b0h;0123

分贝 99h,92h,82h,0f8h;4567

分贝 80h,90h,88h,83h;89AB

db 0c6h,0a1h,86h,8eh;cdEF

;———————————

⑷ 延时子程序

延迟子程序完成一定的延迟时间任务。 有两个延迟时间不同的子程序(也可以调用100次10mS,做出1S的延迟)。 流程如图6所示。延迟子程序没有入口和出口参数。

51单片机汇编语言模块化编程的一点技巧!!

图6 延时子程序流程图

根据图6的流程图和51单片机的指令系统编译出的子程序如下;

;———— 延时10ms程序———-

; 使用寄存器组1中的R6和R7寄存器

del10: setb psw.3; 切换到第一组寄存器

mov r7,#0bh;

dl1:mov r6,#0ffh;

dl2:djnz r6,dl2;

djnz r7、dl1;

clr psw.3; 切换到寄存器组0

ret;

;———————————

;————- 延时1s节目———-

;使用寄存器组1中的R1、R2和R3寄存器

del1s:setb psw.3; 选择寄存器区域1

移动r1,#46; 立即数 46 被发送到寄存器 R1

del0: mov r2, #100; 立即数 100 被发送到寄存器 R2

del1: mov r3, #100; 立即数 100 被发送到寄存器 R3

djnz r3, $; 将寄存器R3的内容减1,如果不为零,则转移到当前指令

djnz r2,del1; 将寄存器R2中的内容减1,如果不为零,则转移到

删除1

djnz r1,del0; 将寄存器R1的内容减1,如果不为零,则转移到

德尔0

clr psw.3; 选择寄存器区域0

ret; 子程序返回

;———————————

⑸ 主程序准备

主程序需要实现的功能有:完成单片机端口定义; 初始化任务; 调用按键扫描子程序,根据按键状态实现初始化或倒计时,调用显示子程序等。流程如图7所示。

51单片机汇编语言模块化编程的一点技巧!!

图7 主编程流程图

根据图7的流程图和上面编译的51单片机的指令系统及各子程序,主程序如下:

;******************************************************** ***** *********

; 文件名:counter.asm 功能:60秒倒计时

; 说明:p2、p1口分别接一个LED数码管,显示两位数。

十进制。

; p0.0和p0.1端口分别连接初始值按钮和开始倒计时按钮,p0.7

连接提示 LED。

; 晶体频率11.0592MHz。

;******************************************************** ***** *********

;———————端口定义————-

kb_init位p0.0; 初始化按钮定义

kb_begin 位 p0.1; 开始按钮定义

警告位 p0.7; 迅速的

;———————————

组织0000h

开始

;============主程序================

组织00b0h

开始:

mov sp,#50h; 初始化

移动p0,#0ffh

mov p1,#0ffh

mov p2,#0ffh

莫夫R2,#60

mov r3,#0ffh

主要的:

l调用key_scan; 按扫描键

移动a,r3; 获取返回值

cjne a,#60h,lp1; 非SB1密钥传输

莫夫r2,#60; 发送初始值到寄存器R2

设置p0.7; 清晰的指示灯

来电显示; 调用显示子程序

ajmp 主; 转移

lp1:mov a,r3; 获取返回值

cjne a,#00h,主; 非 SB2 密钥传输

设置p0.7

莫夫R2,#60

lp2:呼叫显示

acall del1s; 调用1秒延时子程序

十月R2

cjne r2,#00h,lp2

来电显示

清除 p0.7

mov r3,#0ffh

ajmp 主程序

;====================================

2.在Keil C中编译

1.创建一个新项目

打开“Keil C”软件并创建一个新项目。 项目名称也可能是“counter”。

单击桌面上的图标

、进入Keil C51 μVision2集成开发环境。 点击主界面上的下拉菜单“项目”,选择“新建项目?” 命令。 在弹出的对话框中将项目命名为“counter”。 点击“保存”按钮,选择“Atmel”下的“AT89S52”并返回。

2.添加源程序

打开创建的文件“counter.asm”; 并将文件添加到“源组 1”。

单击μVision2主界面上的“打开文件”按钮

,在弹出的对话框中找到刚刚创建并保存的文件“counter.asm”。 单击“打开”按钮即可打开。

在左侧中心的“项目工作区”中,单击“+”展开。 然后右键单击“源组 1”文件夹,并在弹出菜单命令中选择“将文件添加到组‘源组 1’”。

3、参数设置

在“目标'目标1'的选项”中的“输出”选项卡上进行设置。

单击下拉菜单“项目”并选择“目标‘目标 1’的选项”。 在弹出的对话框的“目标”选项卡中,将单片机的工作频率调整为11.0592MHz。 在“输出”选项卡上,点击“创建HEX文件”前面的复选框,使其中出现“√”,这样编译后即可生成目标文件。 单击“确定”按钮返回。

4. 程序编译

点击编译并创建目标文件,得到“counter.hex”文件。

点击μVision2主界面的Recompile按钮

,编译源程序文件,结果如图8所示。

51单片机汇编语言模块化编程的一点技巧!!

图8

3.Preteus模拟

ISIS仿真图如图9所示。设置CPU:89C51的特性,加载计数器.HEX代码,并运行仿真。 将光标移动到按钮SB1,使光标变成“手”形,单击鼠标左键按下该按钮。 松开按钮后,数码管显示值增加“60”,如图9所示。开始倒计时。 将光标移动到按钮SB2,使光标变成“手”形,单击鼠标左键按下该按钮。 释放按钮后倒计时开始。

51单片机汇编语言模块化编程的一点技巧!!

图9 ISIS仿真图

4. 在基本系统上运行

使用微控制器的基本系统板来验证程序。 首先准备实验设备的基本系统板、下载器、电源和通用板以及所需部件。 然后按照以下步骤操作。

⒈按图1在应用测试板上焊接电阻、电容、数码管、连接器、按钮等。

⒉拔掉最小系统板上的跳线J101、J102、J103,插入AT89S52芯片。 将下载电缆的接口板插入计算机的并口,将电缆连接到最小系统和接口板,然后将电源连接到最小系统。 如图10所示。

51单片机汇编语言模块化编程的一点技巧!!

图10

⒊打开下载软件并设置相关参数; 加载要写入的文件“counter.hex”; 单击“编程”按钮下载程序。 如有必要,必须先对芯片进行“擦除”(如果芯片中已编程了程序)。

⒋完成上述操作后,关闭电源,拔下连接电缆,插上跳线J101,连接实验电路。

⒌上电验证程序,按SB1键设置初始值,按SB2键开始倒计时。 如果不满足要求,则修改(可以先在μVision2中调试,或者在Proteus中仿真)。

⒍重复上述步骤,直至实现所需功能。

5. 结论

虽然用汇编语言编写应用程序时必须考虑单片机的硬件资源分配,而且实现相同功能的语句可能比C51编程要多,但汇编模块是按结构来编程的,也可以编写的程序结构清晰、功能清晰、可读性强、应用友好。

51单片机汇编语言模块化编程的一点技巧!!

51单片机汇编语言模块化编程的一点技巧!!

单片机

STC8989CC51液晶矩阵键盘简易计算器目录前言

2024-2-18 3:02:33

单片机

单晶片微型计算机的特点及特点片

2024-2-18 4:02:06

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索