C51的模块化设计方法
一个大的单片机程序往往包含很多模块,我是这样组织的:
1、每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有。
2、建立一个所有的文件都要共同使用的头文件,里面当然就是单片机的管脚使用的定义,还有里面放那些需要的KEIL系统的头文件,比如 #i nclude<reg52.h>,#i nclude<absacc.h>等等,把这个文件命名为common.h,或者干脆就叫main.h
3、每个C源文件应该包含自己的头文件以及那个共同的使用的头文件,里面还放自己本文件内部使用的全局变量或者以extern定义的全局变量
4、主文件main.c里面包含所有的头文件包括那个共同使用的文件,main.c里面的函数可以再做一个头文件,也可以直接放在文件的开头部分声明就可以了,里面一般还有中断服务程序也放在main.c里面
5、对于那些贯穿整个工程的变量,可以放在那个共同的使用的头文件里面,也可以用extern关键字在某个C源文件里面定义,哪个文件要使用就重复定义一下
6、建立工程的时候,只要把C源文件加到工程中,把H文件直接放到相应的目录下面就可以了,不需要加到工程里面。
第一章 概述
本手册介绍ASM51宏汇编器及用汇编语言开发MCS-51系列单片机软件的过程。本章概述ASM51宏汇编器及用法。
1.1 模块化程序设计
ASM51宏汇编器允许用户以模块方式编程,以适应用户模块化的程序设计。模块是具有相对独立功能的程序,它能独立进行汇编或编译。模块化程序设计是将一个大的或复杂的程序分成小的功能模块,每个模块程序单独编写、汇编和调试,最后再将这些模块连接起来,形成一个完整的用户程序。这样做比单块程序更易编写、调试和修改。
模块程序的开发只需根据模块的输入及输出定义,按其所需的输入并检查其输出以校核模块的正确性。由于程序具有良好的模块接口,可以把问题限定在模块内,一旦识别出有毛病的模块,解决这个问题就相当简单了。当每个模块都测试完毕即可将各模块连接起来,最后再测试全模块。
模块化程序的另一个好处是程序共享,即一个模块中的程序可以被其他模块引用。由于模块化程序是可重新定位的,因而也就允许在满足其输入及输出要求是被调用。
1.2 MCS-51模块程序的开发过程
本节简要讨论使用可重定位的汇编器(ASM51),连接/重新定位程序(RL51)及代码转换程序(OH)来开发程序的过程。
1.2.1 段、模块及程序
段是一块程序代码或数据存贮器。段是可重新定位的或绝对的。一个可重新定位的段有一个名字、类型及其属性。具有相同段名,但在不同模块的各个段,将由RL51把它们合并在一起。绝对段没有名字因而也不能与其它段结合。
一个模块有一个或多个段。模块有用户指定的名字。模块的定义决定局部符号的作用域。一个目标文件有一个或多个模块。
把全部输入模块的所有绝对的及可重新定位的段连接起来,最后能形成单一的绝对模块,即完整的用户应用程序。
1.2.2 源程序编辑
完成上述模块化设计后,使用文本编辑器编写源程序。若在开发过程中检测到错误,再回到文本编辑器以修改源程序。
1.2.3 汇编
宏汇编器(ASM51)把源程序翻译成目标代码产生一个目标文件(当至少有一个输入段是可重新定位的段时称为可重新定位的目标文件,否则是绝对的目标文件)以及表明汇编结果的一个列表文件。当ASM51的启动中有DEBUG控制项的,该目标文件将包含符号表及其他符号调试的信息。
汇编器能以可重新定位的目标代码格式产生各目标文件。不过,如果该模块仅有绝对段而无外部访问,形成的该目标文件是绝对的。
列表文件提供的正常记录既有源程序又有目标代码。汇编器也在该列表文件中提供语法及其它出错的诊断信息。例如,为一条仅能使用八位值的指令规定一个16位值,汇编器会指出该值超出了范围。此外,也可以把一个符号表加到列表文件后面,该符号表列出全部符号及其属性。
1.2.4 连接及重新定位
在对程序的各个模块汇编之后,用RL51连接各目标模块文件。RL51程序通过把具有相同段名及类型的各段连接起来,并为重定位段分配相应的绝对存贮器。RL51也解决所有模块间的访问。RL51输出一个绝对模块文件和一个连接/定位过程的列表文件。

图1-1 汇编程序与连接/重新定位程序的输出
1.3 开发MCS-51汇编程序过程
*FILTER.EXE 过滤程序
过滤源程序文件,使其编辑格式符合AEDIT格式。
*ASM51.EXE 汇编程序
对MCS-51源文件汇编。源文件扩展名推荐使用.ASM或.A51,输出文件产生目标文件.OBJ和列表文件.LST。
*RL51.EXE 连接定位程序
将多个浮动目标文件连接定位成一个绝对目标文件,输入文件为.OBJ文件或库.LIB文件。输出用TO指定生成.ABS,同时也产生.M51符号文件。
*LIB51.EXE 库管理程序
将调试好的模块装入库中,使之可以被共享,提高调试效率。
*OH.EXE 十六进制格式目标代码转换
将.ABS绝对目标文件代码转换成.HEX文件。
第一章完
求助,生成Keil c51的库文件
尝试把一些函数编译成库文件,一直失败,而且找不到这方面的资料
我的步骤:
1.项目中选择生成.lib文件
2.编译编辑好的函数
3.把生成的.lib文件拷贝到keil默认的/lib/文件夹下面,或者是保留在原来的文件夹下面
4.把头文件放进/inc/文件夹下面
5.在其他项目中包含头文件
答:把生成的.lib加入你的工程就行了。
关于c51模块化设计的一些建议:
A 不要在主程序中写入过长的代码;
B 为每个子程序编写头文件;
C 将相似功能的子程序写在同一个源文件里。
子程序调用方法:
方法A:将各个子程序保存为*.c,声明函数后调用;
方法B:包含头文件调用。
C51的模块化设计方法的更多相关文章
- iOS程序模块化设计
一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...
- atitit.api设计 方法 指南 手册 v2 q929.docx
atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...
- PHP--进行模块化设计
PHP--进行模块化设计 [来源] 达内 [编辑] 达内 [时间]2012-10-30 导航模块可以简单列为一个关于三级页面链接的HTML文件.通常你可以通过用另一种颜色来标明对当前区域的链 ...
- 深入浅出百度地图API开发系列(3):模块化设计
在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...
- AngularJs学习笔记7——四大特性之模块化设计
模块化设计 1.引用自定义模块并调用 自定义模块中,如果有一些服务.封装好笑模块,在另外一个模块中(声明的时候,在依赖列表中加入要引入的模块) var app02 = angular.module(' ...
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- App 组件化/模块化之路——使用SDK的思路进行模块化设计接口
在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...
- Robot Framework测试框架用例脚本设计方法
Robot Framework介绍 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储.通过测试库中实现的关键字驱动 ...
- 基于layui的框架模版,采用模块化设计,接口分离,组件化思想
代码地址如下:http://www.demodashi.com/demo/13362.html 1. 准备工作 编辑器vscode,需要安装liveServer插件在前端开启静态服务器 或者使用hbu ...
随机推荐
- 易pc,1G容量以上的u盘,另外还要一台装了windows系统的电脑。
一.硬件:易pc,1G容量以上的u盘,另外还要一台装了windows系统的电脑. 二.软件: 1.windows xp的安装包.考虑到易PC的硬盘容量,还是用精简版的吧,比如“Deepin XP Li ...
- poj2955:括号匹配,区间dp
题目大意: 给一个由,(,),[,]组成的字符串,其中(),[]可以匹配,求最大匹配数 题解:区间dp: dp[i][j]表示区间 [i,j]中的最大匹配数 初始状态 dp[i][i+1]=(i,i+ ...
- MD中bitmap源代码分析--清除流程
bitmap的清零是由bitmap_daemon_work()来实现的.Raid1守护进程定期执行时调用md_check_recovery,然后md_check_recovery会调用bitmap_d ...
- 大型分布式C++框架《二:大包处理过程》
本来这一篇是打算写包头在分布式平台中的具体变换过程的.其实文章已经写好了.但是想了这个应该是不能随便发表的.毕竟如果知道了一个包的具体每个字节的意义.能伪造包来攻击系统.其次来介绍一个包的具体变换过程 ...
- Css轮廓
css code: p{ outline-width:2px; outline-color:aqua; outline-style: groove; }
- Spring3 MVC 使用JSON进行前后台数据交互
http://wbj0110.iteye.com/blog/2007918 在 Spring3 中,响应.接受 JSON都十分方便.向前台返回 JSON 格式的数据: 1 2 3 4 5 6 7 8 ...
- DateBox( 日期输入框) 组件
本节课重点了解 EasyUI 中 DateBox(日期输入框)组件的使用方法,这个组件依赖于 Combo(自定义下拉框)和 Calendar(日历). 一. 加载方式//class 加载方式<i ...
- Droppable(放置)组件
.加载方式 //class 加载方式 <div id="dd" class="easyui-droppable" data-options="a ...
- 3.2:pandas数据的导入与导出【CSV,JSON】
一:CSV数据 一]:导入数据 1)从CSV文件读入数据:pd.read_csv("文件名"),默认以逗号为分隔符 D:\data\ex1.csv文件内容: ...
- .Net HttpClient 模拟登录微信公众平台发送消息
1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...