8051模块化编程分析
完成将被显示的数转换成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’”。在弹出对话框
- 一种嵌入式时钟管理器的设计与实现(08-01)
- 基于ADC0809和51单片机的多路数据采集系统设计方案(10-29)
- 基于C8051F340驱动与采集的CCD光电遥测垂线仪(02-01)
- ARM仿真器与嵌入式系统设计讲解(02-12)
- 基于单片机C8051F060的智能功率柜的设计应用(01-12)
- 基于单片机的存储设备转储器(05-03)