单片机程序设计方法总结Word下载.docx

上传人:b****7 文档编号:22326184 上传时间:2023-02-03 格式:DOCX 页数:12 大小:20.67KB
下载 相关 举报
单片机程序设计方法总结Word下载.docx_第1页
第1页 / 共12页
单片机程序设计方法总结Word下载.docx_第2页
第2页 / 共12页
单片机程序设计方法总结Word下载.docx_第3页
第3页 / 共12页
单片机程序设计方法总结Word下载.docx_第4页
第4页 / 共12页
单片机程序设计方法总结Word下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单片机程序设计方法总结Word下载.docx

《单片机程序设计方法总结Word下载.docx》由会员分享,可在线阅读,更多相关《单片机程序设计方法总结Word下载.docx(12页珍藏版)》请在冰豆网上搜索。

单片机程序设计方法总结Word下载.docx

汇编语言也是面向机器的,它仍是一种低级语言每一类计算机都有它自己的汇

编语言比如51系列有它的汇编语言;

PIC系列也有它的汇编语言微机也有它自己的汇编语言它

们的指令系统是各不相同的也就是说不同的单片机有不同的指令系统它们之间是不通用的,这就

是为什么世界上有很多单片机类型的缘故了,为了解决这个问题人们想了很多的办法设计了许多的

高级计算机语言而现在最适合单片机编程的要数C语言.

3.C语言—高级单片机语言

C语言是一种通用的计算机程序设计语言,它既可以用来编写通用计算机的系统程序也可以用

来编写一般的应用程序,由于它具有直接操作计算机硬件的功能所以非常适合用来编写单片机的

程序与其他的计算机高级程序设计语言相比它具有以下的特点:

1.语言规模小使用简单

在现有的计算机设计程序中C语言的规模是最小的ANSIC标准的C语言一共只有32个关键字

9种控制语句然而它的书写形式却比较灵活表达方式简洁使用简单的方法就可以构造出相当复杂

的数据类型和程序结构

2.可以直接操作计算机硬件

C语言能够直接访问单片机的物理空间地址KEILC51软件中的C51编译器更具有直接操作51

单片机内部存储器和I/O口的能力亦可直接访问片内或片外存储器还可以进行各种位操作

3.表达能力强表达方式灵活

C语言有丰富的数据结构类型可以采用:

整型\实型\字符型\数组类型\指针类型\结构类型

\联合类型\枚举类型等多种数据类型来实现各种复杂数据结构的运算,利用C语言提供的多种运算符

我们可以组成各种表达式还可以采用多种方法来获得表达式的值从而使程序设计具有更大的灵活性,所以

单片机入门后尽量学习C语言。

二。

单片机程序设计的步骤

单片机的程序设计通常包括根据任务绘制程序流程图编写程序及汇编等几个步骤

绘制流程图

所谓流程图就是用各种符号图形箭头把程序的流向及过程用图形表示出来绘制流程图是

单片机程序编写前最重要的工作通常我们的程序就是根据流程图的指向采用适当的指令来编写的下

面的图形和箭头就是我们绘制流程图用的工具,

绘制流程图时首先画出简单的功能流程图粗框图再对功能流程图进行扩充和具体化即对

存储器标志位等单元做具体的分配和说明把功能图上的每一个粗框图转化为具体的存储器或地址单

元从而绘制出详细的程序流程图即细框图下面举个例子给大家演示一下请看下面的程序

主程序

LOOP:

SETBP1.0

LCALLDELAY

CLRP1.0

LJMPLOOP

子程序

DELAYMOVR7#250

D1MOVR6#250

D2DJNZR6D2

DJNZR7D1

RETEND。

下面结合按键在实验板上做一下:

ORG0000H

LJMPSTART

ORG30H

STARTMOVSP#5FH

MOVP1#0FFH

MOVP3#0FFH

L1JNBP3.2L2;

P3.2

JNBP3.3L3;

P3.3

LJMPL1

L2CLRP1.0

L3SETBP1.0

END

2。

分支结构程序的设计

亮LED1暗LED1

所谓分支结构就是利用条件转移指令使程序执行某一指令后根据所给的条件是否满足来改变

程序执行的顺序也就是本条指令执行完后并不是象顺序结构那样执行下一条指令而是看本条指令

所给的条件是否满足如果满足条件就跳转到其他的指令如果不满足就顺序执行当然也可以是满足

条件顺序执行而不满足条件跳转执行看十五课实验程序中的下面两条

L1JNBP3.2L2;

P3.2上接有一只按键它按下时P3.2=0

P3.3上接有一只按键它按下时P3.3=0

这就是分支结构的程序如果P3.2为0就转移反之就顺序执行当然也可以改成P3.2=0

顺序执行而P3.2=1则转移不过此时的程序就要用JB指令了在51系列单片机中可以直接用于

分支程序的指令有JBJNBJCJNCJZJNZCJNEJBC等这几条它们可以完成诸如正负判断

大小判断和溢出判断等等在分支结构的指令设计中大家必须注意.执行一条判断指令只可以形成

两路分支如果要形成多路分支就必须进行多次判断也就是多条指令连续判断下面给大家举两个

例子

A单分支结构的程序实例

假设有两个数在内部RAM单元的40H和41H中现在要求找出其中较大的一个数并将较大的数

存入40H中而将较小的一个数存入41H中根据程序的要求我们先画出程序的流程图

再根据流程图写出程序的源代码如下

MOVA40H

CLRC

SUBBA41H

JNCWAIT

MOVA41H

XCHA41H

MOV40HA

WAITSJMPWAIT

程序的原理请大家自行分析一下接下来再举一个多分支结构的实例看下面的程序

MOVA20H

取数

JZZERO;

A=0

转移A=1顺序执行

JBACC7STORE;

A

为负数转移

ADDA#3;

SJMPSTORE

ZEROMOVA#20

STOREMOV21HA

为正数则加3

自己画一下本例的流程图这里有一条指令给大家解释一下JBACC.3STORE;

ACC.3表示累加器A

中的D3位这条指令的意思就是看一下累加器中的D3位是正还是负D3是什么呢,在这里就是020H

的二进制10000000

3循环结构程序的设计

循环程序是最常用的程序结构形式在单片机的程序设计中有时要碰到一段程序需要重复执行

多次的情况此时就要用到循环结构程序比如前面的实验--LED灯闪烁程序的子程序

DELAYMOVR7#250;

1

D1MOVR6#250;

2

D2DJNZR6D2;

3

DJNZR7D1;

4

RET;

5

在这段程序中为了延时需要多次执行DJNZ指令此时若用循环结构程序就可以大大地简化程序

的设计减少程序占用的存储器空间循环结构指令一般有以下四个部分组成

初始化部分

初始化部分主要用来设置循环的初始值包括预值数计数器和数据指针的初值比如上例中的

#250就是预值数初值

B

循环处理部分

循环处理部分是程序的主体部分也称为程序体通过它可以完成程序处理的任务

C

循环控制部分

循环控制部分可以控制程序循环的次数并修改预值数或计数器和指针的值检查该循环是否执

行了足够的次数如果到了足够的次数就采用条件转移指令或判断指令来控制循环的结束比如上例

中的34指令就是当R6或R7中的值为0时就转移

循环结束部分

循环结束后必须返回一般用RET或RETI指令这里注意.以上四个部分中第一和第四部分

只能执行一次而第二和第三部分可以执行多次

在循环程序设计中循环控制部分是程序设计的关键环节常用的循环控制方式有计数器控制

和条件控制两种计数器控制就是把要循环的次数即预值数放入计数器中程序每循环一次计数器1一直到计数器的内容为零时循环结束一般用DJNZ指令而条件控制方式常预先不知:

用计数器控制的单重循环程序:

用条件控制的单重循环程序125mS的延时程序,比较左右两边的

的值就减

道要循环的次数只知道循环的有关条件此时就可以根据给定的条件标志位来判断程序是否继续一

般参照分支结构方法中的条件来判别指令并执行下面举几个例子来分别解释一下希望大家能以此类推

程序一

源程序如下

CLRA

MOVR220H

MOVR122H

LOOPADDA@R1

INCR1

DJNZR2LOOP

MOV21HA

这段程序的作用是从22H单元开始存放一个数据块其长度存放在20H单元中将数据块求和

要求将和存放入21H单元中和不超过255下面再举一个条件控制的循环程序

程序二

设字符串存放在内部RAM的21H开始的单元中以结束作标志要求计算出该字符串的长度并

将其存放在20H单元中

MOVR0#21H

将地址指针指向21H单元

LOOPCJNZ@R0#24HNEXT

与SJMPCOMP找到结束

NEXTINCA

INCR0

不为0计数器加1修改地址指针

SJMPLOOP

COMPMOV20HA

试试看自己把上面两段程序的流程图画出来下面再看一个例子

存放结果

RET

 

这是一段约

DELAY

D1

D2

MOVR7#250DELAY:

MOVR7#250:

MOVR6#250D1:

MOVR6#250:

DJNZR6D2D2:

MOVR5#250D3:

DJNZR5D3DJNZR6D2DJNZR7D1

从这里可以引出一个概念,程序的嵌套:

什么是嵌套比如早上我骑自行车从家里到单位去上班当走到半路上时太太叫我去孩子学校拿点东西到了学校老师又叫我把学校的一台电脑修一下修好电脑一个朋友又打电话叫我去他那里拿了一本单片机与嵌入式系统杂志完了之后再去上班这就是生活中的嵌套在单的程序设计中也有类似的现象有时为了达到某个目的往往要在一段循环程序中再加入另一段循环程序这就是单片机的程序嵌套通常我们把一个循环体中不再包含循环的叫做单重嵌套如果一个循环体中还包括有循环则叫做多重嵌套上面的左边的程序就是单重嵌套而右边的程序则是多重嵌套另外须注意.在多重嵌套中不允许各个循环体互相交叉也不允许从外循环跳入内循环否则编译时会出错了解了结构化程序的设计下面再来看子程序的设计方法

2子程序的设计方法

什么是子程序,如何设计子程序要解释这个问题让我们先同样从生活中的一个例子说起请

看下面的数学题目28*33+65+47*33+65+875*33+65在这道题中我们一般是怎么算的

也许大家都知道一般总是先把33+65=98代出来然后再用28+47+875*98来计算最后的结果

为什么会这样这是因为在这道题中我们多次用到了33+65这个中间结果在单片机的程序设计

中有时也有这样的情况比如下面的程序

DELAY:

MOVR7,#250

D1:

MOVR6,#250

D2:

DJNZR6,D2

DJNZR7,D1

RETEND

这是大家非常熟悉的LED灯延时程序在这段程序中两次调用到了DELAY这段程序为了简化程序的设计我们就把DELAY这段程序单独地列了出来这段列出的程序我们就叫它子程序而调用子程序的程序我们则叫它主程序LOOP的程序段在主程序执行时每当要用到子程序时我们就用LCALL指令来调用子程序子程序执行完之后必须返回主程序返回就用RET指令这我们以前都讲过了这里不再重复

这里有个问题在子程序的执行过程中有时可能要使用到累加器和某些工作寄存器而在调用子程序前这些寄存器中可能已经存放有主程序的中间结果它们在子程序返回后仍要使用这样就需要在进入子程序之前将要使用的累加器和寄存器中的内容预先转移到安全的地方保存起来这叫现场保护当子程序执行完即将返回主程序之前还要将这些内容先取出来送回到累加器和原来的工作寄存器中这个过程叫恢复现场,保护现场和恢复现场通常使用堆栈即在进入子程序之前将需要保护的

数据压入堆栈在返回之前再将压入的数据弹出到原来的工作单元中恢复原来的状态看下面的例子

LOOPPUSH03H将03H单元中的值压入堆栈保护

PUSHACC将累加器中的值压入堆栈保护

POPACC将ACC中的值从堆栈弹出

POP03H恢复03H单元中的内容

RET从子程序返回

由于堆栈的操作是后进先出先进后出所以编写指令时必须把后压入堆栈的数据先弹出来

才能保证恢复到原来的状态在实际的程序设计中由于每个应用程序的不同还必须根据具体的情况来考虑是否需要保护哪些数据需要保护等等这就是单片机的堆栈为什么能够变化的原因关于堆栈的操作先讲这些12345也算是对以前的总结吧

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1