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

8051模块化编程分析

时间:08-04 来源:互联网 点击:

完成将被显示的数转换成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’”。在弹出对话框

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

网站地图

Top