项目化单片机技术综合实训(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-18 07:59:25

点击下载

作者:刘成尧

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

项目化单片机技术综合实训

项目化单片机技术综合实训试读:

内容简介

本书结合电子行业企业的岗位特点和产品设计技能要求,以培养学生的可持续发展的职业技能为目标,在作者多年的企业设计经验和多个职业教育教学成果的基础上,按照以工作过程为导向的方式编写而成。全书内容包括7个项目,每个项目细分为2~3个任务,内容涵盖单片机系统开发相关的知识与技能。通过学习这7个项目,希望读者能够借此进入单片机系统设计的大千世界,充分享受技术开发的乐趣。本书的教学理念先进,适应面广,技术针对性强,兼顾知识的完整性,重视对学生实践技能和综合素质的培养。

本书为高职高专院校电子信息类、自动化类、机电类、机械制造类等专业单片机实践课程的教材,也可作为应用型本科、成人教育、自学考试、电视大学、中职学校和培训班的教材,以及电子工程技术人员的参考工具书。

本书配有免费的电子教学课件、源程序、电路原理图、仿真电路图和演示视频,详见前言。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权所有,侵权必究。图书在版编目(CIP)数据项目化单片机技术综合实训/刘成尧编著.—北京:电子工业出版社,2013.6全国高职高专院校规划教材·精品与示范系列ISBN 978-7-121-20697-9Ⅰ.①项… Ⅱ.①刘… Ⅲ.①单片微型计算机-高等职业教育-教材 Ⅳ.①TP368.1中国版本图书馆CIP数据核字(2013)第130799号策划编辑:陈健德(chenjd@phei.com.cn)责任编辑:谭丽莎印  刷:涿州市京南印刷厂装  订:涿州市京南印刷厂出版发行:电子工业出版社     北京市海淀区万寿路173信箱 邮编 100036开  本:787×1092 1/16 印张:19.25 字数:493千字印  次:2013年6月第1次印刷定  价:39.50元

凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888。

质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。

服务热线:(010)88258888。职业教育 继往开来(序)

自我国经济在21世纪快速发展以来,各行各业都取得了前所未有的进步。随着我国工业生产规模的扩大和经济发展水平的提高,教育行业受到了各方面的重视。尤其对高等职业教育来说,近几年在教育部和财政部实施的国家示范性院校建设政策鼓舞下,高职院校以服务为宗旨、以就业为导向,开展工学结合与校企合作,进行了较大范围的专业建设和课程改革,涌现出一批示范专业和精品课程。高职教育在为区域经济建设服务的前提下,逐步加大校内生产性实训比例,引入企业参与教学过程和质量评价。在这种开放式人才培养模式下,教学以育人为目标,以掌握知识和技能为根本,克服了以学科体系进行教学的缺点和不足,为学生的顶岗实习和顺利就业创造了条件。

中国电子教育学会立足于电子行业企事业单位,为行业教育事业的改革和发展,为实施“科教兴国”战略做了许多工作。电子工业出版社作为职业教育教材出版大社,具有优秀的编辑人才队伍和丰富的职业教育教材出版经验,有义务和能力与广大的高职院校密切合作,参与创新职业教育的新方法,出版反映最新教学改革成果的新教材。中国电子教育学会经常与电子工业出版社开展交流与合作,在职业教育新的教学模式下,将共同为培养符合当今社会需要的、合格的职业技能人才而提供优质服务。

近期由电子工业出版社组织策划和编辑出版的“全国高职高专院校规划教材·精品与示范系列”,具有以下几个突出特点,特向全国的职业教育院校进行推荐。(1)本系列教材的课程研究专家和作者主要来自于教育部和各省市评审通过的多所示范院校。他们对教育部倡导的职业教育教学改革精神理解得透彻准确,并且具有多年的职业教育教学经验及工学结合、校企合作经验,能够准确地对职业教育相关专业的知识点和技能点进行横向与纵向设计,能够把握创新型教材的出版方向。(2)本系列教材的编写以多所示范院校的课程改革成果为基础,体现重点突出、实用为主、够用为度的原则,采用项目驱动的教学方式。学习任务主要以本行业工作岗位群中的典型实例提炼后进行设置,项目实例较多,应用范围较广,图片数量较大,还引入了一些经验性的公式、表格等,文字叙述浅显易懂。增强了教学过程的互动性与趣味性,对全国许多职业教育院校具有较大的适用性,同时对企业技术人员具有可参考性。(3)根据职业教育的特点,本系列教材在全国独创性地提出“职业导航、教学导航、知识分布网络、知识梳理与总结”及“封面重点知识”等内容,有利于老师选择合适的教材并有重点地开展教学过程,也有利于学生了解该教材相关的职业特点和对教材内容进行高效率的学习与总结。(4)根据每门课程的内容特点,为方便教学过程对教材配备相应的电子教学课件、习题答案与指导、教学素材资源、程序源代码、教学网站支持等立体化教学资源。

职业教育要不断进行改革,创新型教材建设是一项长期而艰巨的任务。为了使职业教育能够更好地为区域经济和企业服务,殷切希望高职高专院校的各位职教专家和老师提出建议和撰写精品教材(联系邮箱:chenjd@phei.com.cn,电话:010-88254585),共同为我国的职业教育发展尽自己的责任与义务!中国电子教育学会前 言

单片机综合实践课程是高职高专院校电子类与电气类专业的核心课程之一,也是学校进行教学内容和方法改革的重点课程。编著者在进行多方面职业需求调研的基础上,结合电子行业企业的岗位特点和产品设计技能要求,以培养学生的可持续发展的职业技能为目标,对本课程进行了多次教学改革,建成了以工作过程为导向的项目化课程。

本课程的前导课程是单片机原理、C语言编程及电子电路技术(模拟电子、数字电子、电子技术设计等),后续相关课程包括电子产品设计、毕业设计、嵌入式课程等。本课程的教学目的是基于前导课程的基础,通过项目化课程教学,培养和锻炼学生的单片机应用能力、程序设计能力、电子产品的基本开发和调试能力。在项目化驱动教学的同时,本课程更加注重学生的团队合作能力和自主学习能力的培养。

本书作为单片机综合实践课程的教材,是笔者结合多年的企业设计经验和多个教学成果编写而成的。本书既适合于教师按照开放式项目化教学形式开展教学,也适合于教师按照传统方式授课和学生自学使用。全书内容包括7个项目,每个项目细分为2~3个任务,内容涵盖单片机系统开发相关的知识与技能。通过学习这7个项目,希望读者能够借此进入单片机系统设计的大千世界,充分享受技术开发的乐趣。

本书的编写风格与传统教材不同,旨在采用轻松愉快的方式,让课程教学易于开展,并使学生掌握更多的单片机应用知识和技能。本书的内容按照作者提倡的“开放式项目化学习(教学)”理念进行编排,语言描述采用的是一种讨论和指导的方式,以便于与读者进行交流。为了更好地开展教学,作者尽最大能力进行全方位的单片机开发讲解,涉及与单片机设计相关的各方面知识点,并提供有关的源程序、电路原理图、Proteus仿真电路图和演示视频,以及电路开发板(开发板可在指定网站购买),力争通过本书和配套的网络资源构建一个学习单片机的立体化平台。

在使用本书时,建议读者尽可能重现所关注的项目(任务),而不要拘泥于本书的代码示例(包括电路原理图、仿真电路图)。读者有可能会发现某个电路原理图、代码、流程图不是非常合理,也不是最好的,但是作者保证所有代码都已通过运行验证。同时,希望读者(学生)能够纠正设计的不足之处,这是因为只有带着疑问和探究的精神才能学到真正的知识。

本书的所有文字材料都由刘成尧撰写;本书的所有代码、电路开发板和演示视频由作者所带的学生(黄海星、赵东杰)完成,他们在作者的指导下完成了电路原理图、仿真电路图、流程图和代码的开发,并尽可能按照华为公司的代码规范格式编写了代码。本书在编写过程中得到了创新实验班学生的大力支持,同时参考了许多专家的图书或网络文章,在此一并表示感谢。

电子世界是一个相对开放的世界,我们鼓励大家相互交流和沟通,对新的教学成果和设计经验开展探讨研究,同时要严格遵守相关的知识产权与法律法规。本书难免存在一些表述不完全准确或错误的地方,希望能够得到广大读者的批评指正。

为方便教师教学,本书配有免费的电子教学课件、源程序、电路原理图、仿真电路图和演示视频,请有此需要的教师登录华信教育资源网(http://www.hxedu.com.cn)免费注册后再进行下载,有问题时请在网站留言或与电子工业出版社联系(E-mail:hxedu@phei.com.cn)。编著者项目1 电子琴设计

本项目以电子琴设计项目为起点,讲解单片机的基本编程概念和应用。在项目设计的过程中,将讨论如何在项目开发中获取必要的技术资料,如何进行项目需求的分析和资源及成本的分析等。

该项目涉及的技术点包括单片机如何产生声音,延时程序的设计,定时器与中断的原理,单片机人机接口的按键功能设计等。

本书的大多数项目包含了简单设计、复杂设计和创新设计三类,请读者根据需要选择阅读。项目开发综合技能1 资料获取与信息查询

查找资料的方法一般有通过网络和图书馆查找两个主要的途径,其中合理地使用网络资源能够达到事半功倍的效果,建议读者在项目开发前尽可能收集和整理所能获取的资料,这是做技术开发项目的必要工作。对收集的资料要能够进行整理和分析,并根据与项目开发的相关度进行分类。接下来的步骤是认真和耐心地分析资料和挖掘资料包含的信息,研究其电路图和程序设计思路,努力提取有用的内容进行加工,进而满足本项目的需求。资料的收集、整理、分析一般会集中在开发初期,但也会贯穿整个项目的开发过程。为了提高查找资料的效率,需要在平时多积累和保存相关资料,养成良好的资料保存与整理习惯。

本书之所以能够顺利完成,正是因为笔者把本书作为一个项目来看;正是笔者查询了大量的网上资料,在无数别人智慧的基础上,根据自己的“项目开发”需求,进行整理、分析和加工,再加上自己的创造,才最终形成了这本书。

通过网络收集资料时不可避免会遇到搜索的使用技巧等问题,这些问题实际上在使用搜索工具时都会遇到,希望读者能够多总结搜索的技巧,间接提高项目开发效率。下面以本项目为背景来介绍笔者所推荐的资料收集、整理和分析思路。

在确定了要完成的单片机项目功能需求后,项目设计的第一步应该是通过各种途径查询和收集项目开发所必需的技术资料等(即信息获取),要查询的资料包括以下几类。(1)查找是否有相同或类似单片机开发的电子琴项目(答案:有很多)。(2)能否较容易地获取该项目的电路原理图和C51程序(答案:容易)。(3)能否较容易地获取Proteus仿真电路(答案:容易)。

上述资料信息可以通过上网查找,比较常用的网站包括:(1)www.protues.com.cn/forum.php;(2)iask.sina.com.cn;(3)百度文库;(4)www.jdzj.com;(5)bbs.ednchina.com。

笔者在实现该项目的过程中从网络上获取了近100MB关于用单片机开发电子琴方面的资料,包括文档、程序、Proteus仿真图、原理图,甚至还包括视频。笔者对这些资料进行了分类、整理和初步的分析,并与本书的电子琴项目最相关的一些资料进行了详细的分析,以吸取别人的设计思路,帮助自己完成电子琴的设计。笔者(无论是在做技术人员期间,还是在担任老师期间)非常鼓励开发者借鉴和创新别人的设计思路和部分设计成果,只有站在别人的肩膀上进行创新,才能够创造出更好的产品和设计。任务1.1 发出一种声音的电子琴设计任务介绍1.1

本任务介绍如何完成一个由单片机和蜂鸣器构成的简单电子琴的项目设计,该电子琴能够连续循环地播放一个音符。在实际开发过程中,笔者不提倡初学者一定要通过该电子琴准确发出某种音阶的声音,建议先确保能产生一个声音(人耳能听见即可)。这个任务的本意是引导初学者理解单片机如何通过延时程序生成一定频率的方波,进而产生声音,其重点是理解延时程序设计与单片机产生方波的方法。1.1.1 蜂鸣器的分类与驱动电路

单片机产生声音的主要途径是通过其P口控制外部的蜂鸣器发声,本节首先介绍蜂鸣器的知识,然后介绍单片机应如何控制P口来驱动蜂鸣器工作。

蜂鸣器是一种一体化结构的电子发声器件,有直流或交流两种类型,广泛用做计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中的发声器件。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。蜂鸣器的外观如图图1.1 蜂鸣器的外观1.1所示(产品实例)。

根据发声材料、结构和驱动方式的不同,蜂鸣器可以分为压电式、电磁式、有源、无源等,如表1.1和表1.2所示。表1.1 蜂鸣器的分类A(根据发声材料和结构分类)表1.2 蜂鸣器的分类B(根据驱动方式分类)

蜂鸣器驱动电路一般包含以下几个部分:一个三极管、一个蜂鸣器、一个续流二极管和一个电源滤波电容。蜂鸣器驱动电路的原理如图1.2所示。

蜂鸣器驱动电路分析如下。图1.2 蜂鸣器驱动电路的原理

1.蜂鸣器

蜂鸣器是发声元件,在其两端施加直流电压(有源蜂鸣器)或方波(无源蜂鸣器)就可发声,其主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波)等,这些都可以根据需要来选择。

2.续流二极管

蜂鸣器本质上是一个感性元件,其电流不能瞬变,因此必须有一个续流二极管提供续流,否则在蜂鸣器两端会产生几十伏的尖峰电压,这可能损坏驱动三极管,并干扰整个电路系统的其他部分。

3.滤波电容

滤波电容C的作用是滤波。它既可滤除蜂鸣器电流对其他部分的1影响,也可改善电源的交流阻抗。

4.三极管

三极管VT1起开关作用(工作在饱和与截止两个区),基极的高电平会使其饱和导通,进而使蜂鸣器发声;而基极的低电平则会使其截止,进而使蜂鸣器停止发声。1.1.2 蜂鸣器驱动电路的设计

1.有源蜂鸣器的驱动

有源蜂鸣器的驱动较为简单,只要在其两端施加额定工作电压就能发声。以NPN型三极管驱动有源蜂鸣器为例,只要在三极管的基极接入高电平,蜂鸣器就能发声。例如,当蜂鸣器每秒钟发声100ms时,三极管基极的驱动波形如图1.3所示。图1.3 驱动有源蜂鸣器的波形图

2.无源蜂鸣器的驱动

交流蜂鸣器的驱动相对复杂一点,需要在蜂鸣器两端施加额定电压的方波。有源蜂鸣器的工作频率范围通常是很窄的,这意味着一个有源蜂鸣器通常只有工作在其额定频率下才会有良好的发声效果(包括声压和音色等)。有些有源蜂鸣器的工作频率范围是比较宽的,这样就可以通过调整驱动方波的频率而使有源蜂鸣器发出声音,演奏歌曲。例如,当有源蜂鸣器每秒发声100ms时,三极管基极的驱动波形如图1.4所示(方波的频率没有明确标示,需要根据实际情况进行设置)。图1.4 驱动交流蜂鸣器的波形图1.1.3 单片机产生音乐的原理

一首音乐由许多不同的音阶组成,每个音阶对应不同的频率,这样就可以利用不同频率的组合构成所想要的音乐。要想使用单片机产生不同的频率还是比较方便的,可以利用单片机的定时器/计数器T0来产生方波频率信号,将该信号送入前面所说的蜂鸣器驱动电路,即可将方波的频率转变为对应的音阶。在使用定时器产生声音时,只要把一首歌曲的音阶与频率的对应关系与定时器的设置值弄清楚即可。以单片机接入12MHz晶振为例,高、中、低音阶与单片机定时器/计数器T0相关的计数值如图1.5所示。

按晶体频率为12MHz计算得到的T值,即为时间常数值。图1.5 音阶与定时器的初始值关系图1.1.4 单片机的延时程序设计

延时通常有两种方法:一种是硬件延时,需要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1.使用定时器/计数器实现精确延时

51单片机系统一般常选用11.0592MHz、12MHz或6MHz晶振。第一种晶振常用于产生各种标准的波特率,后两种晶振对应的一个机器周期分别为1μs和2μs,便于精确延时。假设使用频率为12MHz的晶16振,采用定时器(方式1)可产生的最长延时时间为2= 65536μs;若定时器工作在方式2,则可实现极短时间的精确延时;如果使用其他定时方式,则要考虑重装定时器初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时器常采用中断方式工作,如果进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面来考虑都是最佳的方案。但应该注意,用C51程序编写的中断服务程序在编译后会自动加上PUSHACC、PUSH PSW、POPPSW和POPACC语句,执行时它们占用了4个机器周期;如果程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时器初值时要考虑进去,应从初值中减去这些时间以达到误差最小的目的。

下面以12MHz晶振为例,设计了几个延时程序(采用定时器0的工作模式1)。

1)延时0.9ms

2)延时1ms

3)延时4.5ms

网上也提供了一些免费使用的专用于51单片机定时器初值计算的软件,可以大大方便定时器初值的计算,读者可自行搜索。

2.软件延时与时间的计算

在很多情况下,定时器/计数器经常被用于其他用途,这时就只能采用软件方法延时了。下面介绍几种软件延时的方法。

可以在C文件中通过使用带_NOP_()语句的函数设计出各种延时函数,如Delay10us()、Delay25us()、Delay40us()等,将它们存放在一个自定义的C文件中,需要时在主程序中直接调用。例如,延时10μs的延时函数(以12MHz晶振为例)可编写如下:

Delay10us()函数中共用了6个_NOP_()语句,每个语句的执行时间为1μs。当主函数调用Delay10us()时,先执行一个LCALL指令(2μs),然后执行6个_NOP_()语句(6μs),最后执行一个RET指令(2μs),因此执行上述函数共需要10μs。

可以把这一函数当做基本延时函数在其他函数中调用,即嵌套调用,以实现较长时间的延时。但是需要注意,如果在Delay40us()中直接调用4次Delay10us()函数,得到的延时时间将是42μs,而不是40μs。这是因为执行Delay40us()时,先执行了一次LCALL指令(2μs),然后开始执行第一个Delay10us(),执行完最后一个Delay10us()时,直接返回到主程序。以此类推,如果是两层嵌套调用,如在Delay80us()中两次调用Delay40us(),则也要先执行一次LCALL指令(2μs),然后执行两次Delay40us()函数(84μs),因此实际延时时间为86μs。该指令直接返回到上级函数或主函数。如在Delay80us()中直接调用8次De-lay10us(),此时的延时时间为82μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

3.使用示波器确定延时时间

可以利用示波器来确定延时程序的执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线(如P1.0)为高电平,在函数的最后置P1.0为低电平;在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。编程如下:

把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3ms的方波(以12MHz晶振为例)。其中,高电平为2ms,低电平为1ms,即for循环结构“for(j=0;j<124;j++){;}”的执行时间为1ms。通过改变循环次数,可以得到不同时间的延时。当然,也可以不采用for循环而采用别的语句来实现延时。设计步骤1.1

简单电子琴的功能要求是能够连续循环播放一个音阶,根据该项目的功能需求,可以分析出下列工作原理:利用单片机的其中一个P口连接到无源蜂鸣器(不用有源蜂鸣器的原因是需求中提出播放一个音阶,虽没有说明特定音阶,但是有一个音阶),通过延时程序产生音阶对应的频率,控制指定P口送出频率信号,进而产生声音。

下面首先设计电路原理图,只有在电路确定的条件下才能进行程序设计。本电子琴项目使用单片机的P2.0口外接交流蜂鸣器电路,通过单片机产生音阶对应的频率来控制蜂鸣器发声,其电路原理图如图1.6所示。其中,单片机小系统电路属于常规电路,包括晶振、电源、复位电路,这些电路在每个单片机应用中都会存在。图1.6 电子琴的电路原理图

如图1.7所示是该电路在Proteus中的仿真设计。将该图与图1.6相比较可以发现,仿真电路时可以不画出单片机的电源、晶振、复位电路,也不需要画出蜂鸣器的外围电路。图1.7 电子琴的仿真电路图

接下来根据电路硬件资源进行软件设计。在编写程序之前,先绘制程序流程图,如图1.8所示。图1.8 电子琴的程序流程图

再依据程序流程图编写程序,主要程序代码如下所示。

注意:在后面介绍的任务设计步骤的描述中,前面的任务中已经提到的设计要点将不再重复,直接“上图上真相”。应用测试1.1

项目设计完成后需要进行功能和性能的测试。功能测试包括是否能够完成项目需求的功能点,性能测试包括该设计是否能够正常稳定工作,是否是最好的设计思路(包括电路设计和软件设计)。

本项目的测试需要注意的问题包括:(1)单片机通过延时程序在P2.0口产生的方波频率是否在所连接的无源蜂鸣器可以接收的频率范围内,是否在人耳可以听到的声音频率范围内?对应哪个音阶?(2)是否可以使用示波器测量P2.0口产生的方波信号,计算其频率值,并通过调整延时时间来改变频率?(3)示例程序使用了软件延时方式,能否修改成定时器延时方式?(4)该电子琴项目有输出接口,但没有输入接口,是否觉得人机友好性有所欠缺?项目开发综合技能2 项目的需求分析

1.项目需求分析的定义

需求分析是指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要什么,要得到什么结果,最后应输出什么。简单地说,需求分析确定做什么。

需求分析是电子产品设计中的一个关键过程。在这个过程中,项目开发人员(分析员和工程师)确定顾客的需要。参照本项目的任务1.1和任务1.2的功能分析,尤其是任务的功能分析,可知只有对设计需求有非常明确的了解和界定之后才能有效地进行项目开发。需求分析是一项重要而困难的工作,表现在以下几方面。

1)用户与开发人员交流的问题

在电子产品的开发过程中,需求分析是面向用户的,是对用户的业务活动进行分析,明确在用户的业务环境中系统应该“做什么”。但是在开始进行需求的分析时,开发人员和用户双方都不能准确地提出系统要“做什么”。这是因为开发人员不是用户问题领域的专家,不熟悉用户的业务活动和业务环境,而且不可能在短期内搞清楚;而用户不熟悉电子产品设计的有关问题。由于双方互相不了解对方的工作,又缺乏共同语言,所以在交流时存在隔阂。

2)用户的需求是动态变化的

对于一个较复杂的电子设备(产品)而言,用户很难精确、完整地提出它的功能和性能要求。用户一开始只能提出一个大概、模糊的功能,而且只有经过长时间的反复认识才逐步明确。有时进入设计、编程阶段才能明确用户的要求,更有甚者,到开发后期还在提新的要求,这无疑给设计开发带来了困难。

3)系统变更的代价呈非线性增长

需求分析是电子产品开发的基础。假定在该阶段发现一个错误,解决它需要花1h的时间,若等到电路设计、软件编程、系统测试和维护阶段再解决,则要花1h的2.5倍、5倍、25倍、100倍以上的时间。

对于大型复杂系统而言,首先要进行可行性研究。开发人员应对用户的要求及现实环境进行调查、了解,从技术、经济和社会因素3个方面研究并论证该项目的可行性,根据可行性研究的结果决定项目的取舍。

功能需求是电子产品的一项基本需求,但却不是唯一的需求,通常还有下述几方面的综合要求:功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求、约束、逆向需求等。

2.需求分析的步骤

需求分析阶段的工作可以分为四个方面:问题识别、分析与综合、制订规格说明书、评审。

1)问题识别

问题识别就是从系统角度来确定对所开发系统的综合要求,并提出这些需求的实现条件,以及需求应该达到的标准。这些需求包括:功能需求(做什么),性能需求(要达到什么指标),环境需求(如使用环境等),可靠性需求(稳定性要求),安全保密需求,用户界面需求,资源使用需求,成本消耗与开发进度需求,预先估计以后系统可能达到的目标。

2)分析与综合

分析与综合是指逐步细化所有的功能,找出系统各功能间的联系,接口特性和设计上的限制,分析它们是否满足需求,剔除不合理部分,增加需要部分,最后综合成系统的解决方案,给出要开发的系统的详细模型。

3)制订规格说明书

制订规格说明书即编制文档。描述需求的文档称为需求规格说明书。需求分析阶段的成果是需求规格说明书,向下一阶段提交。

4)评审

评审是指对功能的正确性、完整性和清晰性,以及其他需求给予评价。评审通过后才可进行下一阶段的工作,否则需要重新进行需求分析。

上面谈到的是一些需求分析的基本概念,在单片机的项目开发中,项目开发者应有需求分析的意识和基本素养。无论是完成自己设定的项目,还是实现别人安排的项目功能,都需要能够在开发前期明确功能需求,能够参照需求分析的标准步骤进行项目的功能界定,能够以较正式的文本形式确定该做什么,达到什么技术指标,未定义部分如何处理等。本书在电子琴项目的3个任务的介绍和设计部分都做了适当的需求分析,以引导读者培养需求分析意识。任务1.2 能发出不同音阶声音的电子琴设计任务介绍1.2

在任务1.1介绍的简单电子琴项目的基础上,本任务将完成一个较复杂电子琴的设计,项目的需求如下。(1)具有按键功能:根据按键的不同,可以发出1~7的音阶。(2)能够自动发出1~7的音阶。

需求分析:根据上述需求描述可知该项目具有以下功能。(1)简单人机交互接口:按键输入、声音输出。(2)简单的音阶控制:可以通过按键产生1~7的音阶。(3)具备简单的音乐播放:自动发出1~7的音阶。

与简单电子琴项目的功能相比,上述功能有了明显的提高,这也是本书项目编排的特色之一:尽管完成的是同一个项目,难度也会逐渐增大。这个编排基于这样一个事实,即一个项目设计的好坏标准一般只能由该项目能否达到所设定的需求来认定。假如没有了明确的需求,以电子琴的设计来说,就不能说设计非常复杂的电子琴一定是优秀的设计,简单的电子琴就没有任何价值。明确项目的需求是项目开发的第一步,将在任务1.3里面详细讨论如何进行项目的需求分析和界定。

本任务的功能虽然比前一个任务复杂,但从功能分析可以看出,本任务主要是增加了按键接口设计,而产生不同音阶效果并不是难点。下面围绕本项目的开发,深入讨论单片机的定时器延时机制、中断机制和单片机系统的按键接口设计。1.2.1 单片机的定时器延时工作原理

本书的定位既不是单片机的传统教材,也不是完全针对单片机和C语言的初学者的读物,笔者希望本书的读者能够具备浅显的知识基础,且大体上学习过51单片机和C51的编程知识。只有具备上述知识,才能更好地使用本书。本书的编写出发点是以做项目的形式引导读者建立51单片机的设计思维,这是一种思维训练,在训练的过程中适当复习和深化曾经学习过的知识点,有助于更好地构建单片机的编程思维体系。

下面讲解定时器的寄存器知识,这也是初学者非常害怕学习的知识点,但熟练的单片机开发者都知道,对于单片机资源来说,其使用的本质就是对寄存器的熟悉和应用,只有踏实地掌握寄存器的各项参数,才能够充分使用好单片机的资源。

1.定时器的相关寄存器

1)定时器/计数器工作模式寄存器TMOD(如表1.3所示)表1.3 TMOD

GATE:门控制位。GATE=0,表示定时器/计数器的启动与停止仅受TCON寄存器中的TRX(X=0,1)控制;GATE=1,表示定时器/计数器的启动与停止由TCON寄存器中的TRX (X=0,1)和外部中断引脚(INT0或INT1)上的电平状态共同控制。

C/T:定时器/计数器模式选择位。C/T=1,为计数器模式;C/T=0,为定时器模式。

M1/M0:工作模式选择位,如表1.4所示。表1.4 工作模式的选择

2)定时器/控制器控制寄存器TCON(如表1.5所示)表1.5 TCON

TF1:定时器1溢出标志位。当定时器1记满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器中断,则该位完全不用人为去操作,但是如果使用软件查询方式,当查询到该位置1后,就需要用软件清0。

TR1:定时器1运行控制位。由软件清0关闭定时器1。当GATE=1,且INT1为高电平时,TR1置1,启动定时器1;当GATE=0时,TR1置1,启动定时器1。

TF0:定时器0的溢出标志,其功能及操作方法同TF1。

TR0:定时器0的运行控制位,其功能及操作方法同TR1。

IE1:外部中断1的请求标志。当IT1=0时,INT1为电平触发方式,每个机器周期的S5P2采样INT1引脚,若INT1引脚为低电平,则置1,否则IE1清0;当IT1=1时,INT1为跳变沿触发方式,当第一个机器周期采样到INT1为低电平时,置1。IE1=1,表示外部中断1正向CPU中断申请。当CPU响应中断,转向中断服务程序时,该位由硬件清0。

IT1:外部中断1的触发方式选择位。IT1=0,INT1为电平触发方式,引脚INT1上的低电平有效;IT1=1,INT1为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效。

IE0:外部中断0的请求标志,其功能及操作方法同IE1。

IT0:外部中断0的触发方式选择位,其功能及操作方法同IT1。

2.定时器的应用分析

从上面的知识点可知,每个定时器都有4种工作模式,可通过设置TMOD寄存器中的M1/M0位来进行工作方式的选择。

方式1的计数位数是16位。对于T0来说,由TL0寄存器作为低8位、TH0寄存器作为高8位,组成了16位加1计数器。定时器一旦启动,便在原来的数值上开始加1计数,若在程序开始时,没有设置TH0和TL0,则它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为一16个机器周期,则机器周期为1μs,这样记满TH0和TL0就需要2-1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此,溢出一次共需65536μs,约等于65.6ms。如果要定时50ms,就需要先给TH0和TL0装一个初值,在这个初值的基础上计50000个数后,定时器溢出,此时刚好就是50ms中断一次。当需要定时1s时,写程序时产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间。当要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536。把15536对256求模,即15536%256=60,然后装入TH0中;把15536对256求余,即15536/256=176,然后装入TL0中。

以上就是定时器初值的计算方法,总结如下:当使用方式1时,设机器周期为T,定时器产生一次中断的时间为t,则需要计数的个CY数为N=t/T,装入THX和TLX中的数分别为CYTHX=(65536-N)/256TLX=(65536-N)%256

中断服务程序的写法如下:

在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器进行初始化设置。通常定时器的初始化过程如下:(1)对TMOD赋值,以确定T0和T1的工作方式;(2)计算初值,并将初值写入TH0、TL0或TH1、TL1;(3)采用中断方式时,对IE赋值,开放中断;(4)使TR0和TR1置位,启动定时器/计数器定时或计数。

举例说明:利用定时器0的工作方式1,实现一个发光二极管以1s亮灭闪烁。

程序代码如下:1.2.2 单片机中断的应用

1.中断概念

举例:学生正在教室写作业,忽然被人叫出去。回来后,他继续写作业,这就是生活中的“中断”现象,即正常的工作过程被外部的事件打断了。

在单片机中,中断具有非常重要的作用,如能够处理断电保存,解决快速CPU与慢速外设之间的矛盾等。

对51单片机的中断系统,用一句话概述就是“五源中断,两级管理”。中断请求源(五源中断)如表1.6所示。表1.6 五源中断

研究一下生活中的中断,对于学习单片机的中断很有好处。

1)什么可以引起中断?

在生活中,很多事件可以引起中断:有人按了门铃,电话铃响了,闹钟响了,烧的水开了……把可以引起中断的称为中断源。单片机中也有一些可以引起中断的事件(可称为中断源),如51单片机共有5个中断源:两个外部中断(外部中断源通过该中断接入51单片机),两个定时器/计数器中断(构成两个定时器/计数器的中断源),一个串行口中断(用于接入串口通信的中断源)。

2)中断的嵌套与优先级处理

设想一下,你正在看书,电话铃响了,同时又有人按了门铃,你该先做哪样呢?如果你正在等一个很重要的电话,则你一般不会去理会门铃。反之,如果你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(既不等电话,也不等人上门),你可能会按你通常的习惯去处理。总之,这里存在优先级问题,在单片机中也是如此。优先级问题不仅仅发生在两个中断同时产生的情况下,也发生在一个中断已产生,又有一个中断产生的情况,如你正接电话,有人按门铃,或你正开门与人交谈,又有电话响了。在这些场合中,试想该如何处理呢?

3)中断的响应过程

假如你正在看书,当有事件产生,进入中断之前,你必须先记住现在看到书的第几页了,或拿一个书签放在当前页的位置,然后去处理不同的事情(因为处理完了,还要回来继续看书)。如果是电话铃响,就要到放电话的地方去;如果是门铃响,就要到门那边去。也就是说,不同的中断要在不同的地点处理,而且这个地点通常还是固定的。单片机中也采用类似方法处理五个中断源,即每个中断产生后都到一个固定的地方去找处理这个中断的程序。当然,在去之前首先要保存下面将执行的指令的地址,以便于处理完中断后回到原来的地方继续往下执行程序。

中断响应可以分为以下几个步骤。(1)保护断点:保存将要执行的指令的地址,也就是把这个地址送入堆栈。(2)寻找中断入口:根据5个不同的中断源所产生的中断,查找5个不同的入口地址。

以上两个步骤由单片机自动完成,开发人员无须考虑。在这5个入口地址处存放有中断处理程序(这是程序编写时放在那儿的,如果没把中断程序放在那儿,中断程序就不会被执行到)。(3)执行中断处理程序。(4)中断返回:执行完中断指令后,从中断处返回主程序,继续执行原程序。

5个中断源的符号、名称及产生的条件如表1.7所示(可以与表1.6互补)。表1.7 5个中断源的符号、名称及产生的条件

2.中断的相关寄存器

1)中断允许寄存器IE(如表1.8所示)

在中断源与单片机响应之间有两级控制(类似于开关作用):第一级为1个总开关;第二级为5个分开关。由IE完成这两级控制。表1.8 IE

EA:全局中断允许位。EA=1,表示打开全局中断控制,在此条件下,各个中断的控制寄存器也要设置成打开标志才能有效;EA=0,表示关闭全部中断。

—:无效位。

ET2:定时器/计数器2的中断允许位。ET2=1,表示打开T2中断;ET2=0,表示关闭T2中断。

ES:串行口的中断允许位。ES=1,表示打开串行口中断;ES=0,表示关闭串行口中断。

ET1:定时器/计数器1的中断允许位。ET1=1,表示打开T1中断;ET1=0,表示关闭T1中断。

EX1:外部中断1的中断允许位。EX1=1,表示打开外部中断1中断;EX1=0,表示关闭外部中断1中断。

ET0:定时器/计数器0的中断允许位。ET0=1,表示打开T0中断;ET0=0,表示关闭T0中断。

EX0:外部中断0的中断允许位。EX0=1,表示打开外部中断0中断;EX0=0,表示关闭外部中断0中断。

2)中断优先级寄存器IP(如表1.9所示)

为什么要有中断优先级?单片机同一时间只能响应一个中断请求,若同时来了两个或两个以上的中断请求,就必须有先有后。为此,将5个中断源分成高级、低级两个级别,高级优先。级别配置由IP实现。表1.9 IP

PS:串行口的中断优先级控制位。PS=1,表示串行口中断定义为高优先级中断;PS= 0,表示串行口中断定义为低优先级中断。

PT1:定时器/计数器1的中断优先级控制位。PT1=1,表示定时器/计数器1中断定义为高优先级中断;PT1=0,表示定时器/计数器1中断定义为低优先级中断。

PX1:外部中断1的中断优先级控制位。PX1=1,表示外部中断1中断定义为高优先级中断;PX1=0,表示外部中断1中断定义为低优先级中断。

PT0:定时器/计数器0的中断优先级控制位。PT0=1,表示定时器/计数器0中断定义为高优先级中断;PT0=0,表示定时器/计数器0中断定义为低优先级中断。

PX0:外部中断0的中断优先级控制位。PX0=1,表示外部中断0中断定义为高优先级中断;PX0=0,表示外部中断0中断定义为低优先级中断。

3.中断响应及处理

单片机工作时,在每个机器周期中都会去查询一下各个中断标记,看它们是否是“1”,如果是1,就说明有中断请求。因此,所谓中断其实也是查询,只不过每个周期都查一下而已。换作人来说,就相当于人在看书时,每一秒钟都会抬起头来看一看,查看一下是不是有人按门铃,是否有电话……

了解了上述中断的过程,就不难理解中断响应的条件了。当遇到下列三种情况之一时,CPU将封锁对中断的响应:(1)CPU正在处理一个同级或更高级别的中断请求;(2)现行的机器周期不是当前正执行指令的最后一个周期;(3)当前正执行的指令是返回指令(RETI)或访问IP、IE的指令,则CPU至少再执行一条指令才响应中断。

这些都是与中断有关的,如果正访问IP、IE则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,因此都需要等本指令处理结束,再执行一条指令才可以响应中断。

单片机对中断的响应过程如下(假设已使某中断请求标志置1):(1)先使相应优先级状态触发器置1;(2)执行一个硬件子程序的调用。

中断返回过程如下(RETI执行后):(1)使相应优先级状态触发器清0;(2)从堆栈中弹出栈顶的两个字节内容送PC——恢复断点;(3)CPU接着中断处继续执行原程序。

上面已经讨论了单片机的中断原理及使用的一些问题,在实际设计过程中,还是应本着删繁就简的原则,先实现一个最简单的中断效果,然后逐步深入下去琢磨中断的一些难点问题。另外,在学习单片机的一些较复杂的技术应用时,应以完成项目为主,尽量不要为了学技术而学技术。笔者的建议是无论采用什么技术,一切都以完成项目为第一要务,因为任何技术都是拿来用的。反过来说,只要能完成任务的技术都是好技术,只要能熟练掌握它们即可。1.2.3 单片机系统的按键功能设计

1.按键与单片机的连接

对于一个由单片机构成的系统而言,人机交互中的输入接口是很重要的一部分。从现实的产品来说,绝大多数基于单片机的产品都提供人机交互功能,如各种仪器设备上的各种按钮和开关、手机键盘、MP3上的按键等。最常见的输入部分应该就是按键。对于大多数初学者而言,编写一个好的按键程序是一件很重要的事情。

按键的种类很多,但其原理基本相似。下面以一种轻触开关(如图1.9所示)为例讲解按键程序的写法。

一般情况下,按键与单片机的连接如图1.10所示。图1.9 轻触开关图1.10 按键与单片机的连接

图1.10中的电阻值一般取4.7~10kΩ,内部端口有上拉电阻的单片机则可省略此电阻。单片机通过检测相应引脚上的电平来判断按键是否按下。对于图1.10而言,当P17引脚上的电平为低时,表示按键已经按下;反之,则表明按键没有按下。在程序中只要检测到P17引脚上的电平为低,就可以判断按键按下。下面来看看当按键按下时,P17引脚上的波形是怎么变化的。

如图1.11所示是一个理想波形图。由图可知,当按键按下时,P17引脚的电平马上被拉低到0V。当然,理想的东西都是不现实的,现实中按键产生的波形如图1.12所示。图1.11 理想波形图图1.12 现实中按键产生的波形图

由于按键的机械特性,所以当按键闭合时,并不能马上保持良好的接触,而是来回弹跳。这个时间很短,人的手根本感觉不出来。但是对于一秒钟执行百万条指令的单片机而言,这个时间就相当长了。在这段抖动的时间内,单片机可能读到多次高、低电平的变化。如果对其不进行任何处理,就会认为已经按下或松开按键很多次了。而事实上,手一直按在按键上,并没有重复按动很多次。要想能够正确地判断按键是否按下,就需要避开这段抖动的时间。根据一般按键的机械特点,以及按键的新旧程度等来判断,这段抖动的时间一般在5~20ms之间。

2.按键抖动的软件处理

如图1.13所示的流程图就是处理按键抖动的设计思路,是很多教科书上的做法,但它存在一定的问题,即它根本没有考虑实际情况。图1.13 按键抖动的软件处理流程图

根据这个流程图写的代码如下:

当想做一个数码管加按键调整的时钟时,发现当按键按下去后,数码管不亮,这是为什么呢?原因就在于这个键盘扫描函数。一旦有键按下,该键盘扫描函数浪费了单片机的大部分时间(就是那个什么事情都没做的延时20ms函数)后又要占用单片机[就是while (P17)语句]直到按键释放。到底按键扫描函数该如何写呢?如果把单片机延时的20ms拿出来去做其他事情,就可以充分利用单片机的时间了。

一般情况下,只要前沿去抖动就可以了。也就是说,只需要在按键按下后去抖就可以了,对于按键的释放抖动可以不必要过于关注。当然,这主要和应用的场合有关,一个能有效识别按键按下并支持连发功能的按键已经能够应用到大多数场合了。

3.按键的程序编制

下面以4个独立按键的处理程序为例来进行讲解(支持单击和连

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载