版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、案AVR学习昂笔记十四、把模块化程序埃设计般(二)八14摆.1版 矮程序模块化背设计(二)埃14.1.摆1摆、绊实例功能疤在前面一讲蔼里,我们已熬经初步了解澳了模块化程罢序设计的简疤单知识,今俺天我们再深按入探讨一下邦模块化程序绊设计。捌D。岸我们先回顾敖一下前面一哎讲的主要内绊容:模块化柏程序设计是岸指将实现同扒一功能的程巴序整合起来笆,封装到一氨个程序模块颁中,这样在按使用该功能扒的时候,可摆以直接调用碍该模块中的班相关函数进叭行操作疤。安q。唉我们在单片斑机编程中经叭常用到的按罢键检测、液翱晶显示、数叭码管显示、蔼串口通信、搬DS18B芭20温度检袄测、DS1把302实时柏时钟等经常拜用
2、到的程序爱都可以实现盎模块化。耙P。扒模块化编程搬的最大优点拔是:思路清唉晰、移植方霸便、程序简懊化。搬通常的做法扮是将颁某一模块中霸所有用到的阿端口定义,拔函数声明,函数定义等巴一起写到一案个拌“八.h岸”扒或者瓣“氨.c败”半文件中,然案后在主程序版里面使用艾“捌#incl班ude背”昂预编译指令暗将这些内容鞍包含到主程柏序中,这样唉做调用虽然版简单,但是般对于模块化凹程序设计来矮说还是显得爸有些不太直岸观,因为我拜们调用模块鞍中的函数的班时候,需要斑在这一个模哎块文件中很氨费劲的找出叭需要的函数癌。同样对于皑移植到别的把单片机系统跋中的时候,疤需要遍历该邦模块文件,扒然后一一更袄改。如果
3、不办小心,很容扳易造成错误扮。捌g。傲更为斑标准的做法颁是背我们将某一哎个功能模块板的端口定义拜,函数声明凹这些内容放敖在一个坝“案.h耙”岸文件中,而案把具体的函稗数实现(执斑行具体操作盎的函数)放哀在一个“八.c盎”搬文件中。八G。瓣这样我们在啊编写主程序胺文件的时候岸,可以直接背使用摆“矮#incl扮ude爸”办预编译指令拜将八“盎.h半”文件包含进癌主程序文件扒中,而在编把译的时候将爱“蔼.c唉”肮文件和主程八序文件一起澳编译。把t。盎这样做的优懊点是,我们唉可以直接在摆“皑.h翱”瓣文件中查找啊到我们需要搬的函数名称埃,从而在主百程序里面直肮接调用,而笆不用去关心斑“白.c靶”罢文件
4、中的具岸体内容。如稗果我们要将捌该程序移植皑到不同型号佰的单片机上袄,我们同样败只需在绊“伴.h斑”班文件中修改暗相应的端口俺定义即可。坝j。拌在这一讲中懊,我们继续袄学习一下模八块化程序设爱计。柏本实例有两搬个功能模块瓣:扒罢 搬继续半了解模块化隘程序设计的埃思路和方法氨。案蔼 编写捌串口通信耙的模块化程拌序。氨通过本实例柏的学习,掌稗握以下知识扒点:暗初步掌握模奥块化程序设把计的方法。按了解模块化搬程序设计中傲需要注意的扮一些问题半14.2 半 模块化程袄序邦设计需要注白意的两点扮14.2.白1稗 模块化程般序设计中的翱重复声明斑 笆 在编写模疤块程序的过佰程中,我们傲在编写具体邦函数实现
5、的吧“斑.c袄”案文件时,需瓣要调用包含爸相关的端口捌定义和函数扳声明的隘“般.h傲”颁文件,调用矮时,我们使办用使用暗“扒#in扒clude澳”凹预编译指令啊来调用皑“八.h胺”昂文件。哀1。把 蔼 同样的,埃在编写主程叭序文件时,瓣我们仍然需班要将需要调绊用模块的阿“肮.h阿”氨文件包含到皑主程序中,笆这样就出现疤了一个单片般机系统程序佰中同一个文件被多次调昂用的情况,瓣这在很多编澳译系统中进伴行编译的时奥候会有笆“白某某.h奥”芭文件被重复袄调用的编译奥警告或错误澳提示。柏p。澳 氨 事实上,板再同一个单矮片机系统程稗序中,在编班译的时候出哀现任何的警熬告或者错误捌提示都表示拜我们的程序
6、哎编写的有问案题,虽然有叭些警告信息奥不会影响程办序的最终运芭行结果,但摆我们希望编吧译程序的时巴候不出现任百何的警告或邦者错误提示拌。把E。暗 按那这种重复摆调用的情况百该怎么避免白呢?拔一种解决方皑法是,当我蔼们在调用某俺一个程序文懊件时,先判把断一下在前绊面的程序里巴面是否已经案定义或者调搬用了这个文袄件,如果这罢个文件没有半被定义或者八调用,那么把我们就执行芭调用指令,懊否则我们就袄略过调用指拜令。昂0。按要实现这种拌判断,颁我们需要用扒到条件预编奥译指令。板“暗#ifnd哀ef爱”绊,霸“澳#defi袄ne败”,暗“柏#endi颁f奥”扒X。捌 奥这三条指令瓣使用格式如捌下:坝 拜#
7、ifnd阿ef疤 xxx熬xx埃 耙 语句稗块1隘#defi背ne爱 xx碍xxxx按 语句块柏2傲#endi袄f 罢 肮具体作用癌是拌:哎 氨 碍 /如果按没有定义文板件xxxx艾xx以及语岸句块1;盎 熬 啊#ifnd巴ef斑 xxxxx(该处般可以为文件版名)背 邦 语句摆块1啊 瓣/定义文埃件xxxx白xx以及语稗句块2摆#defi爸ne胺 xx伴xxxx澳 语句块按2搬/结束文跋件xxxx隘xx以及语扒句块的定义扳#endi蔼f盎 袄举例如下:叭下面是文件版“笆usart板.h百”胺的避免重复蔼定义胺的书写方法捌,具体作用搬是,先判断盎是否定义了俺文件巴“扮usart败.h氨”扳,如
8、果没有凹定义(#i奥fndef绊)文件懊“拔usart拔.h按”暗,则定义败文件岸“懊usart矮.h哀”懊,并且填写爸文件伴“盎usart隘.h奥”袄的具体内容碍(即需要定氨义的内容)败;填写完需拔要定义的内扒容后,使用笆#endi爱f袄结束定义。皑r。把#ifnd艾ef _颁USART唉_H_颁 翱 /如果芭usart癌.h没有定哎义斑y。案#defi爸ne _隘USART凹_H_版 盎/则定义把usart挨.h办Q。凹/下面是爸usart稗.h的内容背#incl昂ude 坝 百#incl案ude /柏/佰中断函数头袄文件埃7。熬/拜常量声明隘#defi袄ne BA扒UD 96挨00笆/氨
9、函数声明坝v氨oid P氨ort_I盎nit(v笆oid);颁 /绊端口初始化吧配置按w。澳void 挨Usart版_Init唉(void把); /叭/USAR奥T懊寄存器设置罢Z。胺void 案Usart暗_PutC案har(u懊nsign坝ed ch跋ar cT柏XData背); /啊/扮字节发送函伴数奥5。版void 扒Usart袄_PutS扮tring鞍(unsi埃gned 搬char 把*pcSt皑ring)懊;碍G。艾/氨 版usart氨.h的内容邦写完后,结傲束条件编译稗#endi绊f澳 爱/结束判案断岸条件指示符暗可以防止头八文件的重复俺处理。霸标准格式如案下瓣defi伴ne
10、表达扮式翱ifnd凹ef绊 表达式执行语句1else执行语句2endd胺ef意思:懊在执行i埃fdef时巴。如果在板前面使用d般efine岸定义了“表达式”的话袄f。百就执行“执叭行语句1”阿否则执行“把执行语句2阿”例如:哀include翱#defi盎ne DE颁BUG翱void 芭main(矮)瓣#ifde稗f DEB岸UG唉cout伴run拔 it!扒endl;#else埃cout碍not搬 run 扮it!瓣endl跋;靶#endi凹f坝在上面的例版子中运行结败果为 ru袄n it!芭如果前面没拔有定义:稗defin笆e DEB坝UG叭则运行的结扮果是:no瓣t run坝 it!作用:
11、是为耙了防止重复办定义 包含板的文件重复伴时,就用的哎上了拔一般使用半的哎格式:癌#ifnd版ef NA疤ME拔#defi懊ne NA八ME执行语句#else执行语句耙#endi扳f半14.2.暗2佰 不同模块邦之间的函数矮调用我们知道,氨一般情况下般,我们定义爸的函数和变胺量是有一定挨的作用域的八,也就是说版,我们在一阿个模块中定阿义的变量和八函数,它的跋作用于只限埃于本模块文霸件和调用它板的程序文件疤范围内,而敖在没有调用啊它的模块程拜序里面,它拜的函数是不般能被使用的岸。霸k。耙在编写模块扳化程序的时爸候,我们经罢常会遇到一昂种情况,即岸:一个函数澳在不同的模癌块之间都会靶用到,最常芭见
12、的就是延半时函数,一靶般的程序中败都需要调用搬延时函数。巴出现这种情拌况该怎么办绊?难道需要哀在每个模块安中都定义相白同的函数?阿那程序编译拔的时候会提哎示我们有重俺复定义的函版数。那我们癌只好在不同靶的模块中为暗相同功能的蔼函数起不同俺的名字,这艾样岂不是做办了很多重复叭劳动,这样颁的重复劳动败还会造成程鞍序的可读性皑变得很差。皑怎么办?笆i。奥同样的情况凹也会出现在扮不同模块程百序之间传递熬数据变量的柏时候。鞍在这样的情笆况下,昂一种解决办盎法是办:使用文件俺包含命令拔“氨#incl班ude昂”扳将一个模块啊的文件包含霸到另一个模柏块文件中,阿这种方法在伴只包含很少癌的模块文件半的时候是很
13、霸方便的,对氨于比较大的艾、很复杂的澳包含很多模斑块文件的单笆片机应用程搬序中,在每皑一个模块里俺面都是用包搬含命令就很爸麻烦了,并拜且很容易出奥错。拜Y。俺出现这种情芭况的原因是邦我们在编写皑单片机程序办的时候,我奥们所定义的柏函数和变量鞍都被默认为白是局部函数芭和变量,那靶么它们的作白用范围当然隘是在调用他芭们的程序之笆间了。如果版我们将这些扒函数和变量瓣定义为全局肮的函数和变吧量,那么,安在整个单片蔼机系统程序半中,所有的背模块之间都翱可以使用这班些函数和变捌量。耙j。拌最好的解决邦方法是蔼:将需要在疤不同模块之颁间佰互相调用的笆文件声明为按外部岸函数、变量氨(或者全局扒函数、变量艾)。
14、E。稗将函数和变挨量声明为全暗局函数和变哎量的方法是摆:在该函数巴和变量前面佰加斑“叭exter扒n矮”盎修饰符。佰“exter耙n安”摆的英文意思般就是敖“俺全局拌”捌,这样我们阿就可以将加胺了板“哎exter瓣n”般修饰符的函板数和变量声佰明为全局函暗数和变量,哎那么在整个癌单片机系统柏程序的任何瓣地方,我们颁都可以随意拌调用这些全柏局函数和变艾量。捌3。例如:exter爸n voi把d Por暗t0_In懊it(vo敖id); 败 /扮端口初始化半配置蔼r。肮exter耙n voi隘d Usa版rt0_I斑nit(v俺oid);啊 /U吧SART皑寄存器设置岸5。百exter背n voi
15、阿d Usa搬rt0_P凹utCha熬r(uns暗igned哎 char熬 cTXD暗ata);矮 /佰字节发送函翱数柏U。翱exter版n voi凹d Usa哎rt0_P袄utStr熬ing(u班nsign敖ed ch哀ar *p扒cStri案ng);斑f。班在这里,我肮们将这4个办函数都定义俺成为全局函班数,那么,蔼在一个单片按机系统中,鞍在整个程序盎的任何地方俺,我们都可以直接调用熬这写函数。注意叭:在调用的拜之后直接调氨用函数名称佰即可,唉“佰exter霸n版”颁这个修饰符稗不必再调用叭的时候写上斑。M。昂同样的,对肮于变量的定半义我们可以般使用同样的扳方法:翱exter版n int暗
16、 seco翱nd;翱 在这里,半我们定义了吧一个全局的靶整形变量s稗econd胺;皑14.3 挨串口通信模霸块化程序的按实现熬1)usa跋rt.h 摆文件的编写搬 在挨这里,我们挨使用了条件芭编译指令,巴对于函数,巴我们使用鞍“岸exter耙n碍”佰关键字,将碍函数声明为翱全局函数奥A。般/*霸*俺*皑*耙*坝*吧*扳*奥*稗*搬W。隘ATmeg艾a16版异步串行通版信模块化头暗文件,靶usart颁.h芭变量以及函氨数声明艾*氨*佰*隘*靶*坝*俺*靶*艾*巴*/奥3。澳#ifnd拔ef _拌USART芭_H_安#defi岸ne _耙USART扮_H_笆#incl碍ude 绊 靶#incl颁u
17、de /傲/拜中断函数头拌文件伴N。暗/袄常量声明版#defi靶ne BA扳UD 96耙00懊/埃函数声明跋exter巴n voi岸d Por懊t_Ini案t(voi熬d); 熬 /叭端口初始化阿配置熬1。鞍exter版n voi凹d Usa柏rt_In坝it(vo傲id); 皑 /US百ART暗寄存器设置熬U。昂exter瓣n voi凹d Usa白rt_Pu搬tChar暗(unsi鞍gned 隘char 案cTXDa耙ta); 胺 /叭字节发送函敖数矮Y。跋exter叭n voi矮d Usa搬rt_Pu斑tStri邦ng(un捌signe笆d cha八r *pc阿Strin矮g);绊Z。案#
18、endi拌f矮2)usart.c 颁文件的编写按/*癌*唉*拜*安*笆*啊*肮*般*按P。盎ATmeg阿a16拌异步串行通拜信模块化头啊文件,艾usart翱.c把函数定义部岸分拌*傲*埃*斑*熬*巴*凹*俺*傲*扳*/碍Y。懊#incl爸ude 办#incl阿ude 皑usart凹.h澳/稗端口状态初搬始化设置函把数挨void 稗Port_佰Init(敖)芭绊PORTD把 = 0X靶00; 懊 邦 /袄USART拔的发送接收艾端口分别为吧PD0暗和捌PD1俺7。搬爸DDRD 氨|= (1熬 P俺D1); 爸 /P捌D0皑为接收端口败,置为输入拌口;安PD1罢为发送端口佰,置为输出澳口碍f。叭/
19、USA挨RT熬寄存器配置袄函数肮void 艾Usart吧_Init跋()版稗UCSRA败 = 0X伴00;斑伴办UCSRC艾 |= (阿1UR班SEL) 拜| (1 绊 UC阿SZ1) 颁| (1 艾 UC班SZ0);挨 /熬异步,数据芭格式扒8哎,叭N拜,啊1柏N。氨摆 肮/UCS败RC瓣寄存器与捌UBRRH袄寄存器共用扮相同的蔼I/O捌地址拜,办写矮 UCSR阿C 办时,翱 URSE蔼L 巴应设置为哎 1跋。靶F。搬拜UBRRL稗 = (F笆_CPU 翱/ BAU巴D / 1巴6 - 1霸) % 2拌56; 跋 /敖波特率设置澳i。埃皑UBRRH俺 = (F澳_CPU 疤/ BAU白D /
20、 1翱6 - 1鞍) / 2办56;蔼胺版m。捌爸UCSRB捌 |= (俺1 碍RXCIE百) | (安1 般RXEN)岸 | (1扮 T案XEN);巴 /艾/摆发送使能白H。坝/翱字节发送函扳数熬void 佰Usart笆_PutC胺har(u靶nsign暗ed ch罢ar cTXData爱)把L。半吧while霸( !(U哀CSRA 啊& (1 奥 UD半RE) 安); /巴/暗只有数据寄氨存器为空时稗才能发送数隘据坝m。疤芭UDR =阿 cTXD埃ata;半耙 搬 碍 版 /伴发送数据送八USART捌 I/O拌数据寄存器矮爱UDR靶S。艾/斑接收中断函胺数半ISR(U挨SART_氨RXC_v拌ect )八澳unsig瓣ned c背har R办ev;阿稗Rev =芭 UDR;鞍 挨 翱 /捌/皑从唉USART唉 I/O爸数据寄存器邦巴UDR翱中读出数据袄g。案摆Usart版_PutC捌har(R氨ev); 笆 /昂将接收到的跋
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年工业运动控制系统项目成效分析报告
- 2024年贵金属材料项目成效分析报告
- 2023年架空网设备项目成效分析报告
- 2024年磷酸铁锂电池项目综合评估报告
- 2024年生物质气化机组项目成效分析报告
- 2024至2030年环缝专用埋弧焊车项目投资价值分析报告
- 2024年中国铝塑板专用胶市场调查研究报告
- 桑拿用浇水桶项目评价分析报告
- 乳胶漆承包合同范本2024年
- 2024年摊位出租合同范文
- 北京三帆中学2023-2024学年九年级英语第一学期期末教学质量检测模拟试题含解析
- 达芙通在绒毛膜下血肿中的应用
- DL-T 2563-2022 分布式能源自动发电控制与自动电压控制系统测试技术规范
- 酒水知识培训课件
- 产业技术创新联合体协议书
- 2024年中考语文考前抓大分技法之小说阅读专题05小说句子作用(原卷版+解析)
- 道路护栏采购项目供货、运输方案
- 高中物理 人教版 必修三《电磁感应与电磁波初步》单元教学设计
- 2024年银行从业考试银行业法律法规及综合能力重点整理
- 苗木标签完整版本
- 自动扶梯安装工程施工方案
评论
0/150
提交评论