版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、AVR学习习笔记十四四、模块化化程序设计计(二)14.1 程序模模块化设计计(二)14.1.1、实例功能能在前面一讲讲里,我们们已经初步步了解了模模块化程序序设计的简简单知识,今今天我们再再深入探讨讨一下模块块化程序设设计。我们先回顾顾一下前面面一讲的主主要内容:模块化程程序设计是是指将实现现同一功能能的程序整整合起来,封封装到一个个程序模块块中,这样样在使用该该功能的时时候,可以以直接调用用该模块中中的相关函函数进行操操作。我们在单片片机编程中中经常用到到的按键检检测、液晶晶显示、数数码管显示示、串口通通信、DSS18B220温度检检测、DSS13022实时时钟钟等经常用用到的程序序都可以实
2、实现模块化化。模块化编程程的最大优优点是:思思路清晰、移植方便便、程序简简化。通常的做法法是将某一模模块中所有有用到的端端口定义,函函数声明,函函数定义等等一起写到到一个“.h”或者“.c”文件中,然然后在主程程序里面使使用“#inccludee”预编译指指令将这些些内容包含含到主程序序中,这样样做调用虽虽然简单,但但是对于模模块化程序序设计来说说还是显得得有些不太太直观,因因为我们调调用模块中中的函数的的时候,需需要在这一一个模块文文件中很费费劲的找出出需要的函函数。同样样对于移植植到别的单单片机系统统中的时候候,需要遍遍历该模块块文件,然然后一一更更改。如果果不小心,很很容易造成成错误。更
3、为标准的的做法是我们将某某一个功能能模块的端端口定义,函函数声明这这些内容放放在一个“.h”文件中,而而把具体的的函数实现现(执行具具体操作的的函数)放放在一个“.c”文件中。这样我们在在编写主程程序文件的的时候,可可以直接使使用“#inccludee”预编译指指令将“.h”文件包含含进主程序序文件中,而而在编译的的时候将“.c”文件和主主程序文件件一起编译译。这样做的优优点是,我我们可以直直接在“.h”文件中查查找到我们们需要的函函数名称,从从而在主程程序里面直直接调用,而而不用去关关心“.c”文件中的的具体内容容。如果我我们要将该该程序移植植到不同型型号的单片片机上,我我们同样只只需在“.
4、h”文件中修修改相应的的端口定义义即可。在这一讲中中,我们继继续学习一一下模块化化程序设计计。本实例有两两个功能模模块: 继续续了解模块块化程序设设计的思路路和方法。 编写写串口通信信的模块化化程序。通过本实例例的学习,掌掌握以下知知识点:初步掌握模模块化程序序设计的方方法。了解模块化化程序设计计中需要注注意的一些些问题14.2 模块化化程序设计计需要注意意的两点14.2.1 模块块化程序设设计中的重重复声明 在编写写模块程序序的过程中中,我们在在编写具体体函数实现现的“.c”文件时,需需要调用包包含相关的的端口定义义和函数声声明的“.h”文件,调调用时,我我们使用使使用“#incllude”
5、预编译指指令来调用用“.h”文件。 同样的的,在编写写主程序文文件时,我我们仍然需需要将需要要调用模块块的“.h”文件包含含到主程序序中,这样样就出现了了一个单片片机系统程程序中同一一个文件被被多次调用用的情况,这这在很多编编译系统中中进行编译译的时候会会有“某某.hh”文件被重重复调用的的编译警告告或错误提提示。 事实上上,再同一一个单片机机系统程序序中,在编编译的时候候出现任何何的警告或或者错误提提示都表示示我们的程程序编写的的有问题,虽虽然有些警警告信息不不会影响程程序的最终终运行结果果,但我们们希望编译译程序的时时候不出现现任何的警警告或者错错误提示。 那这种重重复调用的的情况该怎怎么
6、避免呢呢?一种解解决方法是是,当我们们在调用某某一个程序序文件时,先先判断一下下在前面的的程序里面面是否已经经定义或者者调用了这这个文件,如如果这个文文件没有被被定义或者者调用,那那么我们就就执行调用用指令,否否则我们就就略过调用用指令。要实现这种种判断,我我们需要用用到条件预预编译指令令。“#ifnndef”,“#deffine”,“#enddif” 这三条指指令使用格格式如下: #ifnndef xxxxxx 语语句块1#defiine xxxxxxx 语句块块2#endiif 具体作用用是: /如如果没有定定义文件xxxxxxxx以及语语句块1; #iffndeff xxxxxx(该该处
7、可以为为文件名) 语语句块1 /定义义文件xxxxxxxx以及语句句块2#defiine xxxxxxx 语句块块2/结束文文件xxxxxxx以以及语句块块的定义#endiif 举例如下下:下面是是文件“usarrt.h”的避免重重复定义的的书写方法法,具体作作用是,先先判断是否否定义了文文件“usarrt.h”,如果没没有定义(#ifnddef)文文件“usarrt.h”,则定义义文件“usarrt.h”,并且填填写文件“usarrt.h”的具体内内容(即需需要定义的的内容);填写完需需要定义的的内容后,使使用#enndif结结束定义。#ifnddef _USAART_HH_ /如果果usa
8、rrt.h没没有定义#defiine _USAART_HH_ /则定义义usarrt.h/下面是是usarrt.h的的内容#incllude #incllude /中断断函数头文文件/常量声声明#defiine BBAUD 96000/函数声声明void Portt_Iniit(vooid); /端口初初始化配置置void Usarrt_Innit(vvoid); /USAART寄存存器设置void Usarrt_PuutChaar(unnsignned cchar cTXDData); /字节发发送函数void Usarrt_PuutStrring(unsiignedd chaar *ppc
9、Strring);/ ussart.h的内容容写完后,结结束条件编编译#endiif /结束判断断条件指示符符可以防止止头文件的的重复处理理。标准格格式如下defiine 表表达式ifnddef 表表达式执行语句11elsee执行语句22endddef意思:在执行iifdeff时。如如果在前面面使用deefinee定义了“表达式”的话就执行“执执行语句11”否则执执行“执行行语句2”例如:incllude#defiine DDEBUGGvoid mainn()#ifdeef DEEBUGcoutruun itt!endll;#elseecoutnoot ruun itt!endll;#endi
10、if在上面的例例子中运行行结果为 run it!如果前面没没有定义:deffine DEBUUG则运行的结结果是:nnot rrun iit!作用:是为为了防止重重复定义 包含的文文件重复时时,就用的的上了一般使用的的格式:#ifnddef NNAME#defiine NNAME执行语句#elsee执行语句#endiif14.2.2 不同同模块之间间的函数调调用我们知道,一一般情况下下,我们定定义的函数数和变量是是有一定的的作用域的的,也就是是说,我们们在一个模模块中定义义的变量和和函数,它它的作用于于只限于本本模块文件件和调用它它的程序文文件范围内内,而在没没有调用它它的模块程程序里面,它它
11、的函数是是不能被使使用的。在编写模块块化程序的的时候,我我们经常会会遇到一种种情况,即即:一个函函数在不同同的模块之之间都会用用到,最常常见的就是是延时函数数,一般的的程序中都都需要调用用延时函数数。出现这这种情况该该怎么办?难道需要要在每个模模块中都定定义相同的的函数?那那程序编译译的时候会会提示我们们有重复定定义的函数数。那我们们只好在不不同的模块块中为相同同功能的函函数起不同同的名字,这这样岂不是是做了很多多重复劳动动,这样的的重复劳动动还会造成成程序的可可读性变得得很差。怎怎么办?同样的情况况也会出现现在不同模模块程序之之间传递数数据变量的的时候。在这样的情情况下,一一种解决办办法是:
12、使使用文件包包含命令“#inccludee”将一个模模块的文件件包含到另另一个模块块文件中,这这种方法在在只包含很很少的模块块文件的时时候是很方方便的,对对于比较大大的、很复复杂的包含含很多模块块文件的单单片机应用用程序中,在在每一个模模块里面都都是用包含含命令就很很麻烦了,并并且很容易易出错。出现这种情情况的原因因是我们在在编写单片片机程序的的时候,我我们所定义义的函数和和变量都被被默认为是是局部函数数和变量,那那么它们的的作用范围围当然是在在调用他们们的程序之之间了。如如果我们将将这些函数数和变量定定义为全局局的函数和和变量,那那么,在整整个单片机机系统程序序中,所有有的模块之之间都可以以
13、使用这些些函数和变变量。最好的解决决方法是:将需要在在不同模块块之间互相相调用的文文件声明为为外部函数数、变量(或或者全局函函数、变量量)。将函数和变变量声明为为全局函数数和变量的的方法是:在该函数数和变量前前面加“exteern”修饰符。“exteern”的英文意意思就是“全局”,这样我我们就可以以将加了“exteern”修饰符的的函数和变变量声明为为全局函数数和变量,那那么在整个个单片机系系统程序的的任何地方方,我们都都可以随意意调用这些些全局函数数和变量。例如:exterrn vooid PPort00_Iniit(vooid); /端口初初始化配置置exterrn vooid UUsa
14、rtt0_Innit(vvoid); /USAART寄存存器设置exterrn vooid UUsartt0_PuutChaar(unnsignned cchar cTXDData); /字节发发送函数exterrn vooid UUsartt0_PuutStrring(unsiignedd chaar *ppcStrring);在这里,我我们将这44个函数都都定义成为为全局函数数,那么,在在一个单片片机系统中中,在整个个程序的任任何地方,我我们都可以以直接调用用这写函数数。注意:在调调用的之后后直接调用用函数名称称即可,“exteern”这个修饰饰符不必再再调用的时时候写上。同样的,对对于变
15、量的的定义我们们可以使用用同样的方方法:exterrn innt seecondd; 在这里,我我们定义了了一个全局局的整形变变量seccond;14.3 串口通信信模块化程程序的实现现1)usaart.hh 文件的的编写 在在这里,我我们使用了了条件编译译指令,对对于函数,我我们使用“exteern”关键字,将将函数声明明为全局函函数/*ATmegga16异异步串行通通信模块化化头文件,usartt.h变量以及函函数声明*/#ifnddef _USAART_HH_#defiine _USAART_HH_#incllude #incllude /中断断函数头文文件/常量声声明#defiine
16、BBAUD 96000/函数声声明exterrn vooid PPort_Initt(voiid); /端口初始始化配置exterrn vooid UUsartt_Iniit(vooid); /USARRT寄存器器设置exterrn vooid UUsartt_PuttCharr(unssigneed chhar ccTXDaata); /字节发送送函数exterrn vooid UUsartt_PuttStriing(uunsiggned charr *pccStriing);#endiif2)usaart.cc 文件的的编写/*ATmegga16异异步串行通通信模块化化头文件,usartt
17、.c函数定义部部分*/#incllude #incllude usaart.hh/端口状状态初始化化设置函数数void Portt_Iniit()PORTTD = 0X000; /USAART的发发送接收端端口分别为为PD0和PD1DDRDD |= (1 PDD1); /PD0为为接收端口口,置为输输入口;PPD1为发发送端口,置置为输出口口/USAART寄存存器配置函函数void Usarrt_Innit()UCSRRA = 0X000;UCSRRC |= (1URSSEL) | (11 UCSZZ1) | (1 UUCSZ00); /异步步,数据格格式8,N,1 /UUCSRCC寄存器与与
18、UBRRRH寄存器器共用相同同的I/OO地址,写 UCSSRC 时时, URRSEL 应设置为为 1。UBRRRL = (F_CCPU / BAUUD / 16 - 1) % 2556; /波特率设设置UBRRRH = (F_CCPU / BAUUD / 16 - 1) / 2556;UCSRRB |= (1 RRXCIEE) | (1 RXXEN) | (11 TXENN); /发送使能能/字节发发送函数void Usarrt_PuutChaar(unnsignned cchar cTXDData)whille( !(UCSSRA & (1 UUDRE) ); /只有数据据寄存器为为空时才能能发送数据据UDR = cTTXDatta; /发发送数据送送USARRT I/O数据寄寄存器UUDR/接收
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版四年级语文下册(部编版)《千年梦圆在今朝》说课稿
- 2024年加工设备购买合同
- 《平均分(二)》(教案)2023-2024学年数学二年级下册 人教版
- 2024年养殖场改造升级合同
- 一年级下册数学教案-4 综合应用 第四课时 人教新课标
- 《认识人民币》(教案)一年级下册数学人教版
- 高校实验室应急值班制度
- 2024年【初中历史】中考历史试题(附答案)电子版可打印
- 中班教案:夏日
- AA银行郑州分行信贷风险管理方案
- 小学数学答题卡模板(共3页)
- 压路机合格证及检验报告(共3页)
- Maxsurf 的中文使用手册(船舶设计建造软件)
- 《园冶》全文
- 2号表-天津市基本医疗保险住院医疗费申请支付审核单
- 简易呼吸气囊操作评分标准
- 厨房安全生产培训内容
- 苹果公司岗位职责任职要求
- PON网络组网安全问题研究
- 数字音效处理器 项目报告
- 赶工措施施工方案(完整版)
评论
0/150
提交评论