电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

8051单片机模块化编程诀窍

2017-03-28 12:47分类:PLC基础知识 阅读:

 

  如今在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

图8

  三、Preteus仿真

  ISIS 仿真图如图9 所示。设置CPU:89C51 的特性,加载counter.HEX 代码加载,作业仿真。将光标移至按钮SB1,使光标成为一只“手”时,点击鼠标左键,使按钮按下。按钮开释后,数码管显现值加“60”,如图9 所示。主张倒计时。将光标移至按钮SB2,使光标成为一只“手”时,点击鼠标左键,使按钮按下。按钮开释后倒计时开端。原文来自www.dqjsw.com.cn图9ISIS 仿真图

图9ISIS 仿真图

  四、底子体系上作业

  用单片机底子体系板来验证程序,首要预备好实验用器件底子体系板、下载器、电源和全能板及所需元器件。然后按下面进程进行操作。

  ⒈在运用实验板上按图1 焊接好电阻、电容、数码管和接插件、按钮等。

  ⒉拔去最小体系板上的跳线J101、J102、J103,插上AT89S52 芯片。将下载线的接口板刺进电脑的并口上,联接电缆把最小体系与接口板连好,再在最小体系上接上电源。如图10 所示。

图10

图10

  ⒊翻开下载软件,并设置好有关参数;加载待写文件“counter.hex”;点“编程”按钮下载程序。必要时须先对芯片进行“擦写”( 若该芯片中曾烧录进程序)。

  ⒋完毕上面的操作后,封闭电源,拔下联接电缆,插上跳线J101,接上实验电路。

  ⒌上电验证程序,按下按键SB1 置初值,按下按键SB2 开端倒计时。若不契合恳求则进行批改(能够先在μVision2 进行调试或Proteus 中仿真)。

  ⒍重复上述进程直到完毕恳求的功用。

  五、完毕语

  用汇编言语编制运用程序时尽管要思考单片机的硬件本钱的分配,且完毕一样功用时的句子或许比C51 编程更多,汇编的模块按构造化编程,一样也能编制出构造明晰、功用明晰、可读性强、的运用程序。

上一篇:51单片机的数码管循环显现编程实例

下一篇:单片机开发阅历总结

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部