51单片机模块化编程设计与实例要点分析

合集下载

51单片机C语言程序设计经典案例

51单片机C语言程序设计经典案例

项目三C51程序设计语言基础任务1 C51程序的识读1.C51程序结构例3-1 P_test/********************* //注释,还可用//注释掉一行File name:P_test.cChip name:STC89C51RCClock frequency:1.20MHz***********************/#include “reg52.h” //预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h”#define unit unsigned int //宏定义预处理命令sbit BZ=P3`7 ;sbit key=P1`0;void delay(unit ms){unit i;while( ms --){for(i=0;i<120;i++);}}void main(void){while(1){if(key==0){BZ=0x0;delayms(10);BZ=0x1;delayms(50);P0=0xFF;}else{P0=~P0;delayms(500);}}}2.C51的数据类型位变量型 bit字符型无符号字符型 unsigned char有符号字符型 signed charC51的数据类型整数型无符号整数型 unsigned int基本类型有符号整数型 signed int长整数型无符号长整数型 unsigned long int有符号长整数型signed long int实数型(浮点型)单精度浮点型float双精度浮点型double数组类型array结构体类型struct构造类型共用体union枚举enum指针类型空类型(void)表3-1 C51基本数据类型的长度和值域3.C51的标识符和关键字标识符是由字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线,不超过32个字符。

C51模块化编程

C51模块化编程

7.5.2

模块设计原则
若我们把复杂的问题分解成许多容易解决的小问题,复杂 的问题也就容易解决了。但是如果只是简单地分解任务,不 注意对一些子任务的归纳与抽象,不注意模块之间的关系, 往往会使模块数太多,模块之间的关系变得复杂,从而使程 序的调试、修改变得更加复杂。一般说来,模块设计应该遵 从以下几条原则: (1)模块独立 模块的独立性原则应保证模块完成独立的功能,模块与模 块之间关系简单,修改某一模块,不会造成整个程序的混乱。 保证模块的独立性应注意以下几点: ①每个模块完成一个相对独立的特定功能。在对任务分解 时,要注意对问题的综合。 ②模块之间的关系力求简单。例如:模块之间最好只通过 数据传递发生联系,而不发生控制关系。C语言中禁止goto 语句作用到另一函数,就是为了保证函数的独立性。
关于流程图,图7.12给出了我国国家标准GB1526—89中 推荐的一套流程图标准化符号的一部分。常用的符号含义如 下: · 数据 平行四边形表示数据,其中可注明数据名称、来源 或用途,也可以用其他文字说明。 · 特定处理 带有双竖边线的矩形。矩形内可注明特定处理 名称或简要功能,表示已命名的处理。 · 判断 菱形表示判断。菱形内可注明判断的条件。它只有 一个入口,但有多个出口。 · 循环界限 循环界限表示循环的上界和下界,中间是要循 环执行的处理内容,称为循环体。循环界限由去上角的矩形 (表示上界限)和去下角的矩形(表示下界限)构成。 · 端点 扁圆形表示从外部环境转入或转向外部环境的端点 符。 · 注解 注解是程序的编写者向阅读者提供的说明。它用虚 线连接到被注解的符号或符号组上。
C51模块化编程
7.5
模块化程序设计
• 7.5.1 基本概念
设计程序的一般过程是:在拿到一个需要解决的 问题后,首先对问题进行分析,把问题分成几个部分。 然后分别分析几个部分,进一步求精细化。每一部分 又可再分成更细的若干部分,直至分解成容易求解的 小问题。原问题的求解可以用这些小问题的求解来实 现。 求解小问题的算法和程序称为“功能模块”,各功能 模块可以单独设计,然后将求解的所有子问题的模块 组合成求解原问题的程序。一个解决大问题的程序, 可以分解成多个解决小问题的模块,这是“自顶由下” 的程序设计方法。由功能模块组成程序的结构如图 7.11所示。

51单片机讲解 第四章

51单片机讲解 第四章

例5、拆字。将片内RAM20H单元内容拆成两段,每段4位, 并将它们分别存入21H与22H单元中。即把压缩的BCD 码变成非压缩的BCD码存储。 ORG 2000H START:MOV R0,#21H ;21H→(R0) MOV A,20H ;(20H)→A ANL A,#0FH ;A∧#0FH→A MOV @R0,A ;A→((R0)) INC R0 MOV A,20H SWAP A ;A0~3←→A4~7 ANL A,#0FH MOV @R0,A
例2、8位数据交换,R3与R5内容互换,R4与35H单元内 容互换。 XCHR: XCH A,R3 ;XCH目的操作数一定为A XCH A,R5 XCH A,R3 XCH A,R4 XCH A,35H XCH A,R4 例3、双字节加法程序,设被加数存放于片内RAM的 addr1(低位)和addr2(高位),加数存放于addr3 (低位)和addr4(高位),结果存放于addr1和 addr2中。
例7、BCD码化二进制数。将片内RAM21H和20H单元中的3 位压缩存放的8421BCD码,转换成二进制数,结果仍 存放于21H和20H。 转换方法:
二进制数=百位数字×64H(100)+ 十位数字×0AH(10)+个位数字
ORG MOV START: PUSH PUSH MOV ANL MOV要入栈保护
例4、编双字节乘法(16bit×8bit)子程序,并写出主 程序。 思路:被乘数放在(R4)(R3)中,乘数放(R2),结果放 (R7)(R6)(R5)中, (R7)(R6)(R5)=[(R4)×28+(R3)]×(R2) =(R4)×(R2)×28+(R3)×(R2) 子程序: NFA: MOV A,R2 ;乘数→A MOV B,R3 ;被乘数低位→B MUL AB MOV R5,A MOV R6,B ;(R3)×(R2)积存于(R6)(R5) MOV A,R2 MOV B,R4 ;被乘数高位→B MUL AB

单片机89C51汇编模块化编程

单片机89C51汇编模块化编程

单片机89C51汇编模块化编程
高手从菜鸟忽略作起之(七)一,汇编模块类别
1.1子过程:无参数,无返回值的一段功能代码。

1.2函数:参数,返回值至少有一项的功能代码。

1.3中断处理:中断发生时的处理代码。

二,子过程框架
2.1 标签+LJMP:
2.2 函数框架:
详见函数框架。

三,函数框架:
3.1 函数传递参数:调用前,将参数从右到左压入栈,函数中从左到右弹出栈。

3.2 函数返回值:用Acc寄存器保存返回值。

3.3 函数传址参数:将地址作为参数,传递。

3.4 代码框架:
四,中断处理:
3.1 定入中断入口及跳转。

3.2 中断处理设定:保护现场+中断处理+恢复现场3.2 代码框架。

51单片机典型开发实例大全

51单片机典型开发实例大全
提供电子技术最新最实用设计方案
——单片机 C51 编程规范
typedef unsigned char INT8U; // 无符号 8 位整型变量 //
typedef signed char INT8S; // 有符号 8 位整型变量 //
1 单片机 C51 编程规范- 前言
typedef unsigned int INT16U; // 无符号 16 位整型变量 //
uCOSII 工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。
——uCOS-II 在 51 单片机上的移 植
引言:随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴 随应用软件朝着系统化方向发展的加速,在 16 位/32 位单片机中广泛使用了 嵌入式实时操作系统。然而实际使用中却存在着大量 8 位单片机,从经济性 考虑,对某些应用场合,在 8 位 MCU 上使用操作系统是可行的。从学习操作 系统角度,uC/OS- II for 51 即简单又全面,学习成本低廉,值得推广。
********************************************************** */
6.3 函数注释
6.3.1 函数头部注释
一般情况源程序有效注释量在 30%左右。 注释语言必须准确、易懂、简洁。

函数头部注释应包括函数名称、函数功能、入口参数、出口参 数等内容。如有必要还可增加作者、创建日期、修改记录(备注) 等相关项目。
7.2 函数定义
*函数若没有入口参数或者出口参数,应用 void 明确申明。 *函数名称与出口参数类型定义间应该空一格且只空一格。 *函数名称与括号()之间无空格。
uCOSII 包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、 消息队列)四大部分,没有文件系统、网络接口、输入输出界面。它的移植 只与 4 个文件相关:汇编文件(OS_CPU_A.ASM)、处理器相关 C 文件(OS_CPU.H、

谈谈8051模块化编程的技巧

谈谈8051模块化编程的技巧
mov
se97:调用转按子程序.取目示断码
p2

r3#60h;是SBl.键值“60H“送寄存器R3
a.+位敬段码送P2口
b,取个位数
slmp
ksr是,不进行任何操作逅目
mov
acall
k2check acall dell0:谰月毫种延时,去抖
se97.调用转换子程序.取显示断码
曲kb begin ksr.干扰,返目

fnb k。-beg,n k2check.SB2拄下转移
s』mp ksr
人口参数存放在寄存器R2中
display:mov
r2,取被显示值
klcheck
aca!l
dell0.调用毫秒延时.去抖
mov
b#10,取被Ⅱ示值的十位数
归kbinit
ks r.干扰.返回
div ab 808]1 mov
Jnb№init¥等待拄键释放
psw3:切换至第1组寄存器
r7加bh:
r6月0fIl’.
d11…v
该子程序有一个八口参数和一个出1:3参数。人1:3参数就
是被显示的数.出口参数就是该数的段码(相应位=O 表示亮}.都存放在累加器A中。
d12 djnz r6,d12 dnz r7 dll
clr re[
psw3.切抉至第0组寄存器
按照图5的流程图和51单片机的指令系统编制的
s.寄存器R3中的内窖减1.不为零转移到当
dell寄存器R2中的内窖减1-不为零转移到
db
8eh:cd盱
djnz
rl
del0:寄存器R1中的内窖减1.不为零转移到
“)延时子程序 延时子程序完成一定的延时时间任务。这里有两个 延时时间不同的子程序(也可以调用100发10mS做 1s延迟).其流程如图6所示。延时子程序没有^口和 出13参数。 按照图6的流程围和51单片机的指令系统编制的 子程序如下

单片机汇编语言的模块化编程方法举例

单片机汇编语言的模块化编程方法举例

(上接 16 页)
二、元件选择
液体水平检测开关采用透明硬塑材料(如光 盘盒)粘合而成,具体尺寸由电子水准仪的长度、 宽度和高度决定,以刚好放入不松动和不影响顶 盖与底盒切合为宜 ;四根电极采用不易被水侵蚀 的 金 属 丝( 如 镀 镍、 镀 铬 的 导 线 ), 用 微 型 钻 头 打孔后用防水胶(如市售普通 AB 胶)粘固密封。 为了提高灵敏度,液体检测开关长度尽可能大一 点,上面两根电极要尽可能接近水面,注好水密 封后一定要检察是否漏水。为使效果明显,液体
制作天地
HANDS ON PROJECTS
编者按 :单片机的汇编语言是学习单片机的基础,而汇编语言的最大不足就是程序的结构不清晰和易读 性差,而模块化编程能在一定程序上弥补这一缺陷。作者结合其教学经验,提出的汇编语言的模块化编程的 理念,值得从事单片机编程的技术员借鉴,特别是对初学单片机的人,更是有必要。
把已有的功能子程序简单地堆放在一起就可以实 现的,而是要把这些子程序进行有机的整合才行。 那么,在整合的过程中会遇到哪些问题?要注意 哪些问题?下面我们以一个交通灯项目为例,运 用子程序化、模块化的编程方法进行编程,并把 编程的过程做一个完整的讲述,希望读者对这种 编程方法有一个具体的认识。
一、交通灯项目的任务分析
在进行项目教学时我们发现,同学们也知道 这个项目需要哪几个任务来完成,他们也知道每 个任务应该怎样实现,然而如何把这些任务弄到 一起去完成项目所要求的设计目标,成了一个教 学难点。当然方法可以多种多样,聪明的学生可 以想出一些奇特的方法实现,但那些毕竟不是正 途,不是一般的方法。有没有一种有章可循的方 法呢?有,这就是子程序化、模块化的编程方法。
这就是交通灯项目程序的整体结构,而原程序 与这个结构则是一致的。

51单片机实例(含详细代码说明)

51单片机实例(含详细代码说明)

1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模块化编程设计题
一、简述模块化编程的必要性(模块化的优点)
参考答案:
大多数的编程学习者一开始接触和学习到的程序很小,代码量很少,甚至只有几十行。

对于这样短小的程序进行模块化设计不是完全必要的。

很多情况下程序模块化设计需要“浪费”很多时间,例如增加了代码的数量,增加了构思的时间。

把所有的程序代码都写在一个main()函数中程序完全可以运行。

但是随着学习的深入,代码量的增加,将所有的代码都放在同一个.C文件中的做法越发使得程序结构混乱,虽然可以运行,但是可读性、可移植性变差。

即使是自己写的程序,时间长以后对程序的阅读和修改也要花一些时间。

模块化编程使得程序的组织结构更加富有层次感,立体感和降低程序的耦合度。

在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。

几乎所有商用程序都必须使用模块化程序设计理念。

在程序的设计过程中各个开发者分工合作,分别完成某一模块特定的功能,减少开发时间等。

二、模块化编程设计步骤
(1)、创建头文件
在模块化编程中,往往会有多个C文件,而且每个C文件的作用不尽相同。

在我们的C 文件中,由于需要对外提供接口,因此还必须有一些函数或者是变量提供给外部其它文件进行调用。

对于每一个模块都有相应的.c文件和.h文件,为了阅读调试方便,原则上.c文件和.h文件同名,如和。

(2)防重复包含
例如文件
#ifndef__DELAY_H__
#define__DELAY_H__
void delay(uint t);
#endif
假如有两个不同源文件需要调用delay(uint t)这个函数,他们分别都通过#include “”把这个头文件包含了进去。

在第一个源文件进行编译时候,由于没有定义过因此#ifndef__DELAY_H__条件成立,于是定义_DELAY_H_ 并将下面的声明包含进去。

在第二个文件编译时候,由于第一个文件包含时候,已经将_DELAY_H_定义过了。

因此#ifndef__DELAY_H__不成立,整个头文件内容就没有被包含。

假设没有这样的条件编译语句,那么两个文件都包含了delay(uint t);就会引起重复包含的错误。

所以在.h文件中,为了防止出现错误都进行防重复包含。

(3)代码封装
将需要模块化的进行代码封装
头文件的作用可以称其为一份接口描述文件。

其文件内部不应该包含任何实质性的函数代码。

我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。

同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。

但是总的原则是:不该让外界知道的信息就不应该出现在头文件里(不需要外部调用的函数不在头文件中申明),而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里(需要被外部调用的函数一定要在头文件中申明),否则,外界就无法正确的调用我们提供的接口功能。

(4)使用源文件(将文件加到工程之中)
将.c文件添加到工程之中,同时在需要调用.h文件中的宏或函数的.c文件中将.h文件包含进去(.h文件中的宏和函数可以在.c文件中自由调用)。

三、程序实例
以简单的52单片机LCD例程为例,将下面的程序模块化。

将延时函数独立成一个模块,为了使程序简化,将所有的和LCD相关的函数(包括LCD初始化函数、写命令函数、写数据函数、显示函数等)独立成一个模块。

#include <>
#include <>
#define uchar unsigned char
#define uint unsigned int
sbit rs = P2^5;
sbit rw = P2^6;
sbit e = P2^7;
uint i;
/*********************************************/
void delay1ms(uint z)
{ 文件加入到工程之中编译即可,在工程中可以清楚地看到各个.c文件包含的.h文件,以及各个模块包含的子函数,层次分明,很方便进行调试修改。

相关文档
最新文档