8051单片机模块化编程诀窍
如今在8051 单片机运用开发中首要有两种编程言语:汇编言语和C51 言语。C51 言语是一种构造化的编程言语,选用C51 编写的运用程序构造明晰、模块化程度高、可读性强、并简略移植。但C51 言语也有缺点,即是编译后生成的方针代码空间要比汇编的大。
并且如今单片机的教材仍是偏重于汇编言语。因而学惯用单片机汇编言语程序进行构造化计划仍是很有必要的。咱们知道C51 言语是函数式言语,其程序由函数构成,每一个源程序有且只需一个主函数main() 和若干个函数构成。其间每一个函数都用于完毕某一特定使命。也即是说,一个项目若具有几个功用,完毕这些功用就会需求由若干个使命来完毕,那么它的源程序中就会有若干个或以上的函数。而在汇编言语中,源程序中只需程序和子程序。那么咱们能否以子程序为底子单位,用一个子程序完毕一种功用来做到模块化编程呢?实习证明是可行的。但在编制程序中不要忘掉汇编言语的特征,留心子程序之间对单片机本钱的运用,避免纷歧姿态程序穿插共用同一本钱致使程序的过错施行。子程序嵌套调用的级数等。这篇文章以“60秒倒计时电路”为例谈一谈51 单片机汇编言语模块化编程的一点诀窍。
一、60秒倒计时电路及编程
1. 功用恳求
所谓倒计时,即是首要给定一个初始值,然后对初始值进行减“1”操作,直到该值为“0”接连。60 秒倒计时即是对给定的初始值“60”每隔1 秒钟对其进行减“1”,一向减到该值为“0”接连。
该倒计时电路恳求有两个按钮。一个是“复位”按钮,按下按钮设置倒计时初始值,并把指示灯停息;另一个是“开端”按钮,按下按钮开端倒计时。并用两位LED 数码管显现其时倒计时值。计不时刻到,指示灯点亮。
2. 电路构成
完毕上述功用恳求的单片机接口电路如图1 所示。
图1单片机接口电路
图顶用按钮SB1 作为“置初值”按钮,按钮SB2 作为“开端”按钮。按下SB1 按钮,将显现值设置为“60”。
按下按钮SB2,每隔一秒显现值减“1”,直到值为“0”
接连计数。按钮和指示灯接在P0 口上,P0.0 为初始按钮,P0.1 为开端按钮,P0.7 为指示灯。十位LED 数码管接P2 口,个位LED 数码管接P1 口。图2 为单片机底子体系电路。
图2 单片机底子体系电路
3. 功用剖析
依据60 秒倒计时的功用恳求,需求单片机完毕以下使命:
⑴ 按键扫描。用来差异有没有键被按下,是哪个键被按下?依据纷歧样的键,给出相应的键值。
⑵ 计时显现。这儿时刻值运用的是两位数,故需求将被显现的时刻值取出个位数和十位数,然后才华进行显现。
⑶ 被显现数改换成7 段码。因为单片机中的数据都是以二进制办法寄存或运算的。而这儿输出显现运用了两位LED 数码管来显现计时数值的,一个被显现的数要害亮数码管的某几段才华显现出这个数,纷歧样的数需求害亮数码管的纷歧样段。因而需求将被显现的这个数改换成相应的显现段码,才华被精确显现出来。
⑷ 延时。包含1秒钟延时和按键消抖的10毫秒延时。
⒋ 程序编制
程序按完毕功用选用模块化构造,有一个主程序和若干个子程序构成。每个子程序别离是完毕某个使命的独立模块,有时会用到调用参数。本实例共有5 个子程序,别离是按键扫描子程序、10ms 延时子程序、1s 延时子程序、显现子程序、取段码子程序。
⑴ 按键扫描子程序
按键扫描子程序完毕对按键进行扫描,断定有没有键被按下,当有键被按下并抬起后将有要害值回来给主程序的使命。其流程如图3 所示。该子程序没有进口参数,但有一个出口参数,即按键的键值,寄存在寄存器R3 中。寄存器R3 中的值为“60H”标明SB1 键被按下;寄存器R3 中的值为“00H”标明SB2 键被按下。
图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 中。
图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 所示。
图8
三、Preteus仿真
ISIS 仿真图如图9 所示。设置CPU:89C51 的特性,加载counter.HEX 代码加载,作业仿真。将光标移至按钮SB1,使光标成为一只“手”时,点击鼠标左键,使按钮按下。按钮开释后,数码管显现值加“60”,如图9 所示。主张倒计时。将光标移至按钮SB2,使光标成为一只“手”时,点击鼠标左键,使按钮按下。按钮开释后倒计时开端。原文来自www.dqjsw.com.cn
图9ISIS 仿真图
四、底子体系上作业
用单片机底子体系板来验证程序,首要预备好实验用器件底子体系板、下载器、电源和全能板及所需元器件。然后按下面进程进行操作。
⒈在运用实验板上按图1 焊接好电阻、电容、数码管和接插件、按钮等。
⒉拔去最小体系板上的跳线J101、J102、J103,插上AT89S52 芯片。将下载线的接口板刺进电脑的并口上,联接电缆把最小体系与接口板连好,再在最小体系上接上电源。如图10 所示。
图10
⒊翻开下载软件,并设置好有关参数;加载待写文件“counter.hex”;点“编程”按钮下载程序。必要时须先对芯片进行“擦写”( 若该芯片中曾烧录进程序)。
⒋完毕上面的操作后,封闭电源,拔下联接电缆,插上跳线J101,接上实验电路。
⒌上电验证程序,按下按键SB1 置初值,按下按键SB2 开端倒计时。若不契合恳求则进行批改(能够先在μVision2 进行调试或Proteus 中仿真)。
⒍重复上述进程直到完毕恳求的功用。
五、完毕语
用汇编言语编制运用程序时尽管要思考单片机的硬件本钱的分配,且完毕一样功用时的句子或许比C51 编程更多,汇编的模块按构造化编程,一样也能编制出构造明晰、功用明晰、可读性强、的运用程序。
下一篇:单片机开发阅历总结