微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 浅析8051模块化编程技巧

浅析8051模块化编程技巧

时间:05-28 来源:维库 点击:


图4 显示子程序流程图

按照图4 的流程图和51 单片机的指令系统编制的子程序如下:

;------------ 显示子程序------------
; 入口参数存放在寄存器R2 中
display:mov a, r2 ; 取被显示值
mov b, #10; 取被显示值的十位数
div ab;
acall seg7; 调用转换子程序,取显示断码
mov p2, a ; 十位数段码送P2 口
mov a, b; 取个位数
acall seg7 ; 调用转换子程序,取显示断码
mov p1, a ; 个位数段码送P1 口
ret ; 返回
;---------------------------------

⑶ 取段码子程序

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


图5 取段码子程序流程图

该子程序有一个入口参数和一个出口参数。入口参数就是被显示的数,出口参数就是该数的段码(相应位=0表示亮),都存放在累加器A 中。

按照图5 的流程图和51 单片机的指令系统编制的子程序如下:
;-------------- 取段码--------------
; 对累计器A 中的值由查表得到显示断码
; 入口和出口参数存放在累计器A 中
seg7: inc a ; 取被显示数,累加器A 加1
movc a, @a+pc ; 查表
ret ; 返回
db 0c0h,0f9h,0a4h,0b0h;0123
db 99h,92h,82h,0f8h;4567
db 80h,90h,88h,83h;89AB
db 0c6h,0a1h,86h,8eh;cdEF
;---------------------------------

⑷ 延时子程序

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


图6 延时子程序流程图

按照图6 的流程图和51 单片机的指令系统编制的子程序如下:

;----------- 延时10ms 程序----------
; 用到寄存器组1 中的R6 和R7 寄存器
del10: setb psw.3 ; 切换至第1 组寄存器
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
mov 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,不为零转移到
del1
djnz r1 , del0; 寄存器R1 中的内容减1,不为零转移到
del0
clr psw.3 ; 选用寄存器区0
ret ; 子程序返回
;---------------------------------

⑸ 主程序编制

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


图7 主程序编制流程图

按照图7 的流程图和51 单片机的指令系统、以上编制的各子程序,主程序如下:
;**********************************************************
; 文件名:counter.asm 功能:60 秒倒计时
; 说明:p2 和p1 口分别接一个LED 数码管, 显示两位
十进制数。
; p0.0 和p0.1 口接置初值按钮和开始倒计时按钮,p0.7
接提示LED。
; 晶振频率11.0592MHz.
;**********************************************************
;------------ 端口定义--------------
kb_init bit p0.0 ; 置初值按钮定义
kb_begin bit p0.1 ; 开始按钮定义
warn bit p0.7 ; 提示
;---------------------------------
org 0000h
ajmp begin
;============ 主程序===============
org 00b0h
begin:
mov sp, #50h ; 初始化
mov p0, #0ffh
mov p1, #0ffh
mov p2, #0ffh
mov r2, #60
mov r3, #0ffh
main:
lcall key_scan ; 按扫描键
mov a, r3 ; 取返回值
cjne a, #60h, lp1 ; 非SB1 按键转移
mov r2, #60 ; 初值送寄存器R2
setb p0.7 ; 清指示灯
acall display ; 调显示子程序
ajmp main ; 转移
lp1: mov a, r3 ; 取返回值
cjne a, #00h, main ; 非SB2 按键转移
setb p0.7
mov r2, #60
lp2: acall display
acall del1s ; 调用1 秒延时子程序
dec r2
cjne r2, #00h,lp2
acall display
clr p0.7
mov r3, #0ffh
ajmp main
;=================================

  二、Keil C 中编译

1. 新建项目

打开"Keil C"软件,新建一个项目。项目名也不妨为"counter"。

点击桌面上的图标 ,进入Keil C51 μVision2集成开发环境。在主界面上点下拉菜单"Project",选"New Project?"命令。在弹出的对话框中将项目命名为"counter"。点"保存"按钮,选"Atmel"下的"AT89S52"后返回。

2. 添加源程序

打开已建立的文件"counter.asm";并将该文件添加到"Source Group 1"中。
在μVision2 主界面上点击打开文件按钮 ,在弹出的对话框内找到刚才新建并保存的文件"counter.asm"。点"打开"按钮打开。
在中间左边的"项目空间(Project Workspace)"内,点击"+"展开。再用右键点击"Source Group 1"文件夹,在弹出的菜单命令中选"Add Files to group‘Source Group 1’"。

3. 参数设置

在"Options for Target‘ Target 1’"中的"Output"标签页上进行设置。
点下拉菜单"Project", 选"Options for Target‘Target 1’"。在弹出对话框上的"Target"标签页内,把单片机的运行频率调整为11.0592MHz。在"Output"标签页上,点"Create HEX File"前的复选框,使其内出现"√",这样编译后就能生成目标文件了。点"确定"按钮返回。

4. 程序编译

点编译和建立目标文件,得到"counter.hex"文件。
在μVision2 主界面上点重新编译按钮,对源程序文件进行编译,结果如图8 所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top