首页 > 文章中心 > 单片机原理

单片机原理

前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇单片机原理范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。

单片机原理

单片机原理范文第1篇

一、背景

单片机原理与应用”是一门电子类专业的核心课程,对于基础薄弱的中职学生来说,这门课程的学习难度比较大。究其原因,一方面由于中职学生起点低、基础知识较差;另一方面,当前单片机课程现有的教材教学内容独立化、模块化,各块之间缺乏有机联系,造成了学生难学、教师难教的局面,以至于全部内容学完时,学生对一个完整的单片机开发过程还缺乏了解,这样培养出的学生无法适应企业的需求。所以我们提出:以一个较为具体的涵盖知识点全面的典型项目为引领,在完成这个项目的过程中,学生学会并能运用相关单片机知识,练就了技能。该典型项目就是wifi小车的开发。

二、课程项目设计和实施

1、走访企业,明确课程定位。为了更好的培养适合企业需求的学生,我们特地走访了当地多个单片机产品生产与研发的相关企业,对企业岗位职业能力与工作过程进行调研,了解企业对人才的需求;与企业一线技术人员共同商讨如何选取合适的工程项目作为教学载体,确定教学任务与内容;回访了大量的毕业学生,与在企业一线从事单片机相关电子产品生产和研发的毕业生进行交流,听取毕业生对本课程教学的反馈意见,以他们的亲身经历和切身体会帮助我们发现教学体系中存在的问题,对我们的教学实施提出合理的修改意见。

2、确定课程项目设计的总体思路。在和行业企业的深入交流过程中,我们发现企业在单片机应用产品的研发和生产上有其典型的工作过程。如下图所示:

我们仔细分析了这个过程,结合毕业生的反馈和在校学生的实际情况,确立了以培养学生在相关企业的单片机产品研发与生产岗位上,完成各项工作任务过程中应具备的职业能力为目标进行教学情境设计的思路,具体实现方法为,采用实践教学,设计一个完整的学生感兴趣的单片机产品开发项目,将所有的学习内容贯穿于项目中,分解在多个学习情境中,让学生既完成了教学内容的学习,又体验了企业生产的工作过程。

3、教学项目内容的选取。教学项目内容选择的合适与否是关系到教学效果好坏的关键,本着以提高学生的职业岗位能力与职业素养为目标,我们从多个环节进行了精心思考,挑选教学项目内容。

我们选取了具有典型工作任务的“wifi小车制作项目”作为教学内容的载体。该wifi小车以单片机作为控制核心,包括运动模块(电机)、显示模块、遥控模块以及各种传感与转换模块等。针对wifi 小车各功能部分的实现,设计出不同的学习情境,训练学生分析和设计单片机应用程序的基本技能。

Wifi小车的功能设计具有很强的扩展性,这主要取决与它具有的功能、性能和控制方法,功能越多,所需的技术与器件种类就越多;性能越好,对应的技术含量也越高;控制方法越多控制电路也就越复杂。例如显示模块可以选择led或数码管,也可以选择字符液晶或者图形液晶显示;控制方式可以选择遥控也可以加入声控等,所以选择wifi小车作为教学项目具有很好的可选性与扩展性。

本项目分为4个学习情境,整个情境的实施是按照学习的认知规律、职业成长规律,从简单到复杂,从局部到整体进行学习单片机知识、训练职业岗位能力。

总体上采取知识由浅入深、技术逐渐综合的原则。由一个综合单片机产品制作项目――制作单片机wifi小车,按照不同的功能模块分解成4个学习情境(见下图),①小车零部件的选择和装配②小车的显示系统③小车的运动控制系统④小车智能感应系统, 如下图所示,每个学习情境包含可选的子情境。

每个学习情境均训练对应的职业能力

①、学习情境一训练学生电子产品装配基本功,完成要求如下:

电子元器件的选取与检测

小车电路焊接与装配

②、学习情境二训练学生单片机基础技术与基础器件的集成能力,完成如下功能:

小车的前进、后退、左右转向及停止运行状态显示;

完成各种动作的计时时间显示。

③、学习情境三训练学生接口技术与接口器件的集成能力,完成如下功能:

小车的前进、后退、左右转向及停止驱动控制;无线遥控。

④、学习情境四训练学生将单片机基础技术运用、接口技术运用和传感器等各种技术与器件集成的能力,完成如下功能:

监测距离,自动避障;

4、教学方法的使用。通过实践,我们认识到要提高教学效果必须采用多样化的教学方法,以学生为主体,以教师为引导。为此我们引入了工作过程与教学方法的对照图(参考下图:工作过程学习方法对照图)。以子情境2中的实训项目“汽车转向灯”为例,来具体说明课堂教学实施过程中各种教学方法的使用:首先提出项目要求,明确这个项目做什么,激发学生学习兴趣(采用了项目案例激励教学法),接着引导学生思考,跟老师想(采用项目分析引探法),然后跟老师做,最后学生自己做,自己练,互助学习项目制作(采用协作互助讨论法),老师跟踪检查,指导,评价(采用项目检查评价法),课后布置学生对产品功能进行扩展(采用项目制作进阶法)。通过这样的教学过程,让学生达到了积极思考,乐于实践、快乐学习、享受成功的学习状态,培养了学生的职业岗位能力,为以后顺利走上工作岗位打下坚实的基础。

5、考核方案设计

考核分为三部分,过程性考核(占分50%)、综合性考核(占分15%)、结业性考核(占分35%),其中过程性考核考察学生每一个项目情境的完成情况。综合性考核考察学生对单片机技术的综合运用能力,强调学生的创新意识,鼓励学生多使用新技术、新器件。结业性考核安排在期末,采用现场抽题,考察一个项目的完整制作,学生也可提前申请参加开放性考核,考试合格可免除期末结业性考核,也可以参加各类单片机竞赛,取得好成绩者也可免除结业性考核。

单片机原理范文第2篇

关键词:单片机;C8051F;汇编语言;C51

中图分类号:G642 文献标识码:B

1引言

“单片机原理及应用”是计算机科学与技术、通信工程等专业的一门主要专业课程,因单片机在生产实践中应用广泛,各高校都将该课程定位在以培养学生动手能力和创新能力的目的上。但长期以来国内高校都以MCS-51为该课程的主讲内容,虽然该系列单片机在国内的应用经久不衰,但随着技术的发展,芯片的生产工艺、功能、运行速度、开发环竟、编程语言等都有了很大的变化,在实际的科研开发中更多选用与MCS-51兼容的高档单片机,而很少直接选用标准8051单片机,因此传统的教学内容和知识已经与实际应用脱节,不能满足需要。根据多年的教学经验和科研积累,我们对“单片机原理及应用”课程的教学内容、实验手段、实验内容、教学方法等进行了更新。两年多的教学实践表明,改革后的“单片机原理及应用”很受学生的欢迎,大大提高了学生学习单片机课程的兴趣,达到了该课程培养和锻炼学生动手能力、开发应用系统能力的目的。

2课程改革

2.1更新教学内容

MCS-51单片机及其衍生产品在我国乃至世界范围都获得了非常广泛的应用,尤其是在我国大部分大专院校都采用MCS-51单片机作为教学机型,单片机系统工程师大都熟悉 MCS-51单片机。但随着一些高集成度、高性能的8位和16位RISC单片机的推出,基于标准8051内核的单片机正面临着退出市场的境地。因此一些半导体公司开始对传统8051内核进行大的改造,主要是提高速度和增加片内模拟和数字外设,以期大幅提高单片机的整体性能。

近年来我们承担了较多企业委托的单片机应用开发项目,在实际的科研开发中我们也感觉到用标准8051单片机作微控制器不仅需要扩充大量资源,而且编程调试都比较困难,而随着技术的发展,新一代的单片机芯片已不仅包含微处理器,而且包含应用系统所需的各类外部接口设备,存储器也从光擦除变为电擦除、可在系统编程的FLASH存储器,编程语言从汇编语言为主变为以C51语言为主,以JTAG接口构成的JTAG调试器可以进行非侵入式全速在系统调试,比以前的专用在线仿真器(ICE)要方便得多。因此我们在几个单片机开发项目中都选择了原美国Cygnal集成产品公司(1999年3月成立的一家新兴的半导体公司,专门从事混合信号片上系统单片机的设计与制造,2003年并入Silicon Laboratories公司)推出的C8051F系列产品。C8051F系列单片机是集成混合信号的片上系统(SOC,System Of Chip),与MCS-51兼容的内核CIP-51采用流水线结构,峰值速度可达25MIPS。C8051F具备控制系统所需的模拟和数字外设,包括看门狗(Watchdog)、ADC、DAC、电压比较器、电压基准输出、定时器、PWM、定时器捕捉和方波输出等,并具备多种总线接口,包括UART、SPI、SMBUS(与I2C兼容)总线以及CAN总线等。C8051F系列单片机采用Flash ROM技术,集成JTAG接口,支持在线编程和调试。C8051F系列单片机的诸多特点和优越性,使其广受单片机系统设计工程师的青睐,成为很多测控系统设计的首选机型。

既然实际科研开发中多使用新一代高性能单片机,那么我们的教学内容就应该及时更新,以减少学生工作后的二次学习。为此,2004年课程组在参与编写机械工业出版社的教材《单片机原理及应用》时专门用一章的篇幅把C8051F写了进去。后来我们发现仅仅用一章内容讲C8051F,教学内容的改革还不彻底,因此2006年我们又对教学内容进行了彻底改革,编写了以C8051F为教学机型的教材《C8051F单片机原理及应用》,由中国电力出版社出版,教材除了更新了教学机型外,编程语言也从汇编语言改成以C51语言为主,兼顾汇编语言的形式。我们编写该教材的时候国内还基本上没有同类教材,目前已经有了一些,这说明国内高校已经在注重单片机课程教学内容的改革。在多届学生中的使用实践表明,内容更新后的教材很受学生的欢迎。

2.2更新实验手段

以MCS-51为主讲机型的单片机课程的实验模式多采用PC机+仿真器+目标实验台的方法,我校选用了台湾MICETEK公司Easyscope8052F单片机仿真器,这种仿真器专门仿真51系列单片机,采用Windows环境的仿真软件,价格低,性能好。综合实验板选用改造后的复旦大学教学仪器厂的产品,与PC机连接构成的单片机开发系统结构如图1所示。

传统采用仿真器的实验模式虽然能满足学生实验、课程设计之用,但SOC型单片机出现后,实验模式可以更加逼近实际开发应用的形式,根据原有单片机实验系统的使用经验,2003年我们提出了一个新的单片机实验系统方案,与新华龙电子有限公司合作,设计出NCD-CIP51F020系统实验设备,该系统由SOC单片机集成开发环境(IDE)、可用于以太网测控的NMC-20XX核心模块、系统实验板三部分组成,应用该设备可完成单片机系统的许多典型应用实验,并可做较复杂的应用系统实验,如高速数据采集、嵌入式Web实验等。片内JTAG调试电路允许对安装在最终应用系统上的产品进行全速、非侵入式(不占用系统资源)、在系统调试。该调试系统支持观察和修改存储器和寄存器,支持断点、观察点、单步及运行和停机命令。使用JTAG调试时,所有模拟和数字外设都可以全功能运行。Silicon Laboratories提供的集成开发环境包括编辑器、宏汇编器、调试器与编程器,同时也支持第三方提供的汇编器和C51编译器(如Keil等)。采用SOC单片机JTAG接口的先进调试环境如图2所示。

2.3更新教学方法

我们除了注重教学内容的更新,使学生学到最新最实用的知识外,还注重教学手段和方法的改革与研究。

首先,课程组注重现代先进教育手段的应用。C8051F单片机的内部资源丰富、原理复杂,因此新课程的内容要远比传统的MCS-51多且增加了大量复杂的图、表,传统的板书式教学难以胜任,所以在课时量不可能增加的情况下,先进的多媒体教学方法成为必然。其实课程组早在2003年就开始用多媒体方式讲授该课程,教学内容更新后课程组重新制作了该课程的多媒体课件,课件结构清晰、层次分明、图文并茂,结合计算机动画把复杂的内容简单化、抽象的内容具体化,明显提高了课堂教学效率。课程组还开发了该课程的教学网站,与课程相关的课件、实验软件、参考资料等都放在网上供同学随时下载或浏览,网站也提供了师生交流的平台。

其次,课程组注重教学方法的研究与改革。在多年的计算机硬件课程教学中我们发现,由于内容枯燥、知识面广等原因,学生对计算机硬件课程的学习兴趣大大降低,甚至有些硬件选修课程因为选修的人数太少而开不出来。这种学习中喜软怕硬的现象必须引起重视,否则培养出来的学生很难满足用人单位的需要,这也是近年来嵌入式系统方向毕业生比较容易找工作原因的一个方面。教学中我们发现学生并非对所有硬件内容都不感兴趣,对有些内容兴趣还是比较高的,比如“数字逻辑电路设计”课程中“自动售货机设计”、“单片机”课程中“日历时钟的液晶显示模块的设计”等。因此我们设想可以在讲解具体内容前先把学生感兴趣的问题提出来,然后在解决问题的过程中把相关内容讲解清楚,这就是所谓的“案例”法教学。我们设计了部分“案例”在计算机硬件课程中试点,取得了满意的效果。我们提出的计算机硬件课程“案例”教学法得到江苏大学2007年校教改重点项目的立项资助,将对计算机硬件课程“案例”教学法进行更深入的研究。

3结束语

我校采用SOC型单片机C8051F作为“单片机原理及应用”课程的主讲机型,对该课程的教学内容进行了全面更新,已在多届学生中进行讲授,学生对该课程的学习兴趣大幅提高,实验和课程设计质量也比以前有较大改观。“单片机原理及应用”已经建设成江苏大学校级精品课程。对计算机硬件课程采用“案例”教学法进行了一些研究,单片机课程的部分内容采用“案例”教学法进行了试点,取得了较好的效果。“案例”教学法是我们近年来在计算机硬件课程上的试点,目前还不成熟,我们将在“案例”开发、课件制作等环节对“案例”教学法进行更深入的研究。

参考文献

单片机原理范文第3篇

【关键词】单片机;教学;改革

当今世界,单片机在工业过程控制、智能仪表、计算机集成控制、人工智能、通信设备的智能化方面应用非常广泛,而且随着电子和计算机技术的发展,以单片机和各种微处理器为核心必然是实现智能化技术的主流方向。同时,《单片机原理与应用》是高职院校电子、电气等相关专业最重要的核心课程之一,是一门实践性、应用性很强的学科,该方向对学生进行毕业设计和就业都起着重要的作用。

《单片机原理与应用》传统教学一般包括理论课和实践课。理论课学生普通反应知识抽象、难学、难懂,学了后面又忘了前面,学生学得吃力,老师教得辛苦。实践课主要采用验证性实验,学生只要连线正确、程序输入无误就能看到结果,这样往往造成学生只关注实验结果,而忽略了思考过程。学生无法从中提高分析问题、思考问题、解决问题能力,甚至到最后还是无法独立设计一个简单的单片机系统,实践动手能力非常差。这样的教学方法不能体现单片机实践性和应用性强的特点,也与社会发展脱轨,因此,《单片机原理与运用》教学改革迫在眉睫。我们总结了以往教学过程中的一些经验和教训,提出以下几点《单片机原理与运用》教学改革的思路和方法。

1.教学内容选取

以培养学生具备从事单片机系统设计岗位能力和相关职业群为目标,增强学生实践动手能力和工程实际运用能力为导向,来选取教学内容。在本课程的开始的时候,介绍单片机的发展现状,例举日常生活中单片机控制的设备,把科研项目或往届毕业设计中的一些应用板带进课堂,通过图片、实物展示使学生对单片机有一定的感性认识,激发他们的学习兴趣和热情。

选取以单片机C语言贯穿各章节,并且是项目化教学形式的教材。C语言可读性、可维护性和可移植性都比汇编语言好,在实际单片机设计中,基本上都采用C语言。项目教学改变了传统教材内容安排强调只是系统性为主的思路;把课程教学内容划分为若干个项目形式来完成,项目又以任务的方式出现,突出体现高职生理论知识“必需、够用”的原则。

多增加日常生活常见案例为项目,每个项目又包括几个任务,通过每个任务的完成过程,使学生学习相应的理论知识。通过常见案例的剖析,引起学生的注意,激发他们的兴趣,每个任务完成后,教师进行知识点得总结,这样学生在实践动手中不知不觉就掌握的理论知识。比如交通灯控制系统,这一项目可以分成单片机控制单灯亮灭、流水灯控制、定时器控制流水灯、带时间显示系统等,其中通过单片机控制单灯亮灭这一任务的设计,学生可以学习单片机结构、I/O口、单片机最小系统等基本知识。通过流水灯控制这一任务,学生可以学习单片机C语言的各种语句等。

2.教学方法使用

我们以项目为教学单元,以任务驱动进行教学。我们的教学是在一体化教室实施,只要在一体化教室中通过仿企业的工作环境进行项目化教学,教学过程才能实现真正的教、学、做融为一体,并充分调用学生学习的主动性和创造性。

每个任务包括任务目标要求、学生知识与能力准备、计划、实施过程、评估。教师先布置任务,说明这个任务要到达的功能及要求。教师可根据教学内容,制作多媒体课件,将理论知识通过多媒体手段以声音、图像、文字等方面表现出来,使枯燥抽象的理论知识变得生动直观,学生更容易理解。也可以通过Flas演示或Proteus仿真软件展示任务的运行结果,使学生对任务要求更加清楚。学生分组后,每个小组进行任务设计的讨论,并确定设计方案。学生任务实施过程中,教师对学生操作过程中存在的问题进行实时点评,实施后,教师对每组的实施结果进行验收和评估,最后总结任务实现过程中碰到的普遍问题、知识运用的难点关键点。这样的教学方法能提高学生分析问题、思考问题、解决问题能力,而且通过每个任务的制作,学生积极性提高、自主学习能力和动手能力增强。

另外,教师可以把多媒体课件、仪器设备电路图、设备的使用方法、任务要求、本课程相关的学习资料等挂在网上,进行资源共享,供学生查阅学习,通过网络来提高学生的学习兴趣。

3.加强实践环节

实践环节是《单片机原理与运用》课程的重要环节,通过实践环节,可以提高学生动手操作能力。我们把实践环节分成基础性实践、开放性实践、综合设计实践三个部分。

基础性实践主要是实现指令练习、基本程序结构编写,或是一些验证理论知识准确性的实验,通过这一环节,学生所学的理论知识得以巩固。开发性实践要求学生具有扎实的理论基础,具有分析问题解决问题的能力,培养学生对常见接口的硬件设计、软件编程及仿真器下载调试的能力。在综合设计实践过程中,教师只提出实验目的和要求,学生要自主确定设计方案,并设计硬件电路图、制作电路PCB图,并在自己做的PCB板上焊接元器件。硬件调试成功后,再把编写好的程序利用仿真器下载到电路板上,进行调试。这样,学生熟悉了单片机系统设计的整个过程,他们的实践动手能力也得到很好的提高。

除了上面三个实践环节外,我们还要鼓励学生参加全国电子设计大赛和大学生创新科技项目,使学生在实践过程中不断的学习新知识,提高设计创新能力。

4.考核方式确定

传统的教学模式中,课程考核是由期末闭卷考核占70%,平时表现占30%组成,这样的考核方式只能一定程度上反应学生理论知识的掌握情况,很难体现学生的分析能力和实践动手能力,也与单片机课程实践性强的特点不相符合。

一个好的考核方法对于学习一门课程至关重要。考核不仅是对教师教学效果的检验和学生水平的测试,同时也是学生学习习惯和学习方法的导向。笔者提出的考核方式包括期末考核30%、项目考核50%、平时表现20%。其中平时表现包括出勤表现、作业完成情况。期末考核是对课程基础知识进行闭卷测试。项目考核是每个项目成绩的平均分,每完成一个项目,教师根据学生的工作态度、完成情况、回答问题情况进行评分。每个项目完成后,学生都能看到自己的成果,这样也调动了学生的学习兴趣和学习热情。这样的课程考核方式不仅包括基础知识掌握程度考核,还包括学生的分析、学习、动手、应用等方面能力的考核,能比较客观的反应学生的学习情况。

5.总结

教学改革实施后,课堂气氛变的更加活跃,学生学习兴趣更加浓厚。实践表明,我们的教学改革方案不仅提高了学生学习积极性、应用能力和动手能力,而且对学生的独立思考和分析问题、解决问题的能力的提高也起到了很好效果。当然,教学改革是一个无止境的过程,我们还要不断更新教学观念,不断的探索和实践,来提高教学质量和效果。

参考文献

[1]莫莉,赵悦等.“单片机原理”课程教改探析[J].教育与教学研究,2010(1).

[2]张培仁,孙占辉等.基于C语言编程MCS-51单片机及应用[M].北京:清华大学出版社,2003.

[3]欧阳慧平,王茜等.系统化的“单片机应用技术”课程建设与改革[J].教育与职业,2011(2).

[4]牛分中,宋风娟.高校单片机课程实践教学的改革与探讨[J].教育与职业,2008(21).

单片机原理范文第4篇

一、考核知识点:

1、计算机的数据表示和数据运算

2、计算机的各种编码

3、计算机的组成及工作过程

二、考核要求:

1、识记计算机的各种编码

2、领会计算机的组成及工作过程

3、简明应用计算机的数据表示和数据运算

第二章51单片机的硬件结构和原理

一、考核知识点:

1、单片机的发展史及各方面的应用

2、51单片机的分类和内部结构

3、单片机的引脚和功能

4、单片机工作的时序

二、考核要求:

1、识记单片机的发展史及各方面的应用

2、识记单片机的引脚和功能

3、领会单片机工作的时序

4、简明应用51单片机的分类和内部结构

第三章51单片机指令系统

一、考核知识点:

1、单片机的寻址方式

2、单片机的指令系统

3、助记符指令和二进制代码指令的异同

二、考核要求:

1、领会助记符指令和二进制代码指令的异同

2、综合应用单片机的寻址方式

3、综合应用单片机的指令系统

第四章汇编语言程序设计

一、考核知识点:

1、伪指令

2、汇编语言设计技巧

3、汇编语言到机器语言的编译过程

二、考核要求:

1、领会伪指令

2、简明应用汇编语言设计技巧

3、综合应用汇编语言到机器语言的编译过程

第五章51单片机的中断系统

一、考核知识点:

1、中断基本概念

2、中断系统的程序编制

3、中断系统的初步应用

二、考核要求:

1、领会中断基本概念

2、简明应用中断系统解决工程问题

3、综合简明应用中断系统的程序编制

第六章51单片机的内部定时器/计数器及串行接口

一、考核知识点:

1、单片机内部定时器/计数器的结构及工作原理

2、定时器/计数器的程序编制

3、定时器/计数器的初步应用

4、串行口的基本概念

5、串行口的程序编制

6、串行口的初步应用

二、考核要求:

1、识记串行口的基本概念

2、领会单片机内部定时器/计数器的结构及工作原理

3、简明应用定时器/计数器解决工程问题

4、简明应用串行口的程序编制

5、简明应用串行口解决工程问题

6、综合应用定时器/计数器的程序编制

第七章单片机的系统扩展与接口技术

一、考核知识点:

1、单片机外部总线的扩展

2、外部存储器的扩展

3、I/O接口的扩展

4、管理功能部件的扩展

5、A/D和D/A接口功能的扩展

二、考核要求:

1、识记单片机外部总线的扩展

2、识记管理功能部件的扩展

3、简明应用A/D和D/A接口功能的扩展

4、综合应用外部存储器的扩展

5、综合应用I/O接口的扩展

第八章单片机应用系统设计

一、考核知识点:

1、单片机应用系统的开发过程

2、单片机开发工具的分类和使用

3、单片机应用系统的软件和硬件调试过程

二、考核要求:

1、识记单片机应用系统的软件和硬件调试过程

2、领会单片机应用系统的开发过程

3、领会单片机开发工具的分类和使用

第九章单片机系统的抗干扰技术

一、考核知识点:

1、单片机干扰源与分类

2、干扰对单片机系统的影响

3、硬件抗干扰技术

4、软件抗干扰技术

5、数字滤波

二、考核要求:

1、识记单片机干扰源与分类

2、识记干扰对单片机系统的影响

3、识记数字滤波

4、简明应用硬件抗干扰技术

5、简明应用软件抗干扰技术

第十章其它单片机简介

一、考核知识点:

1、AT89C系列单片机的特点与性能

2、其它8位单片机的特点与性能

3、16位、32位单片机的特点与性能

二、考核要求:

1、识记其它8位单片机的特点与性能

2、识记16位、32位单片机的特点与性能

3、领会AT89C系列单片机的特点与性能

《单片机原理及应用技术》考试大纲

《单片机原理及应用技术》课程是一门面向应用的专业技术课。单片机原理与应用介绍了单片机的基本知识和单片机技术的应用,其内容与工程实际紧密联系,实用性很强,是一门在理论指导下,偏重于实际应用的课程。本课程具有实用性强、理论和实践结合、软硬件结合等特点。本课程围绕使用较为广泛的MCS-51系列单片机进行学习。本课程已成为理、工科电子类专业的一门基础课程,这是从电子系统设计角度考虑的,它体现了电子系统设计的方法和硬件结构的变化。通过该课程的学习,要求学生掌握80C51单片机的工作原理、编程技术,掌握单片机应用系统的扩展方法和实际应用。因此,以单片机为内核,分析和设计一个简单的计算机应用系统是我们学习本课程要达到的目的。

第一部分考试大纲

1单片机概述

本章为单片机的基本概念。

1.掌握有关单片机的基本概念、单片机的特点、单片机的应用。

2.理解单片机的总体组成。

3.了解单片微型计算机的产生、发展历史、主要品种及系列。

2单片机结构和原理

本章以80C51单片机为例介绍了主要硬件结构和主要功能,着重掌握系统所提供的资源特性及其功能特性。

1.掌握80C51的内部结构。

2.掌握80C51单片机的存储器组成。

3.掌握单片机并行输入/输出端口结构及功能。

4.了解单片机的时序概念和复位工作方式。

5.掌握单片机引脚功能

3指令系统

1.掌握指令与伪指令的正确格式。

2.掌握七种寻址方式的使用及寻址方式的含义。

3.掌握

五类指令的功能和使用,特别是传送指令。

4.理解书中所列例题与习题。

4汇编语言程序设计举例

本章为MCS-51的一些常用伪指令,介绍顺序结构程序设计、分支结构程序设计、循环结构程序设计和子程序的设计。

1.程序设计的基本步骤、各种基本的结构化程序设计方法;读懂较复杂的常用程序。

2.掌握数据传送指令的编写。

3.理解算术运算程序设计。

4.理解数码转换程序设计。

5.理解查表程序设计。

6.理解子程序设计和参数传递。

7.理解逻辑运算程序设计

5中断系统

1.掌握有关中断、中断源、中断优先级等概念。

2.掌握中断响应过程。

3.掌握中断优先级排列。

4.掌握中断允许寄存器IE、中断优先级寄存器IP各位的含义及设置。

5.掌握外部中断的两种触发方式:电平触发、边沿触发。

6定时/计数器

1.掌握定时器/计数器的四种工作方式及有何不同。

2.掌握TMOD和TCON中各位的含义、作用。

4.掌握不同工作方式计数初值与定时时间的关系,即能根据定时时间算出计数初值,完成定时器的初始化编程和简单应用编程。

7串行通信

1.理解有关通信、协议的概念。

2.理解串行口的四种工作方式。

3.掌握SBUF的含义及作用。

4.了解串行口的工作原理。

5.了解SCON中每一位的含义及SMOD位的作用。

6.掌握串行通信总线RS-232C标准、RS-232C电平转换。

7.了解RS-232C与MCS-51的接口。

8系统扩展技术

1.掌握总线、驱动、锁存和译码、地址重叠的概念。

2.掌握程序存储器的扩展:EPROM程序存储器及其扩展方法。

3.掌握数据存储器的扩展:静态存储器SRAM及其扩展方法。

4.掌握简单I/O口的扩展。

5.掌握8255A可编程并行接口:结构、控制字、工作方式、与8255A的接口方法。

9A/D和D/A转换器接口技术

1.掌握DAC0832与单片机的接口方法与编程。

2.掌握ADC0809与单片机的接口方法与编程。

10键盘/显示接口技术

1.掌握LED显示器结构、工作原理和显示方式。

2.掌握键盘接口原理。

3.理解LED显示器与80C51单片机接口。

4.理解键输入程序设计方法。

5.了解行列式键盘与80C51单片机接口。

11、功率接口技术

1.掌握简单开关量接口、光电耦合接口和继电器接口。

2.晶闸管与故态继电器的应用接口。

12、单片机系统设计技术

掌握单片机系统的设计、开发、调试的原则、步骤及方法。

13、实用举例

了解一两个典型的单片机开发应用系统的设计思想和实现方法。

14、新型单片机介绍

了解MCS-51常见8位单片机。

第二部分考试考核改革方案

一、考试考核要求

《单片机技术及应用》选择具有代表性的、使用较为广泛的MCS-51系列单片机进行学习(具体以80C51为例),介绍了80C51单片机的硬件组成、软件编程及一般应用系统组成。通过本课程的学习,要求掌握80C51单片机的系统结构、指令系统、程序设计方法、系统扩展方法、单片机常用接口等应用技术。本课程的教学过程由面授辅导、自学、实验及作业四个环节组成,因此本课程考试考核要求为:

1.作业、实验成绩与期末考试成绩共同评定为课程总成绩。

2.作业、实验占课程总分的60,期末理论考试占总分的40。

为使学生不把注意力仅仅放在期末考试上,培养学生系统学习的能力,加强学生各方面能力的培养,平时、实验课、作业、考试都纳入本课程的成绩评定。平时的成绩包括出勤、课堂提问和随堂测试。期末考试可以选择笔试、口试和进行实际实验、设计等多种形式。

二、平时成绩考核要求及说明

1.每章作业按要求完成后交教师批改,完成作业80为12分(及格);所有作业均完成,且质量较好者,20分(满分)。中间情况酌情给分。

2.每次实验均能按照教师安排进行,实验态度好,至少完成5个实验且实验报告完整,为18分(及格);能基本独立完成6个或以上实验,实验报告完整、无误,实验质量高,30分(满分)。中间情况酌情给分。如果实验有创新的特点,酌情加分。

3.作业与实验的平均分为平时成绩,满分50分。

4.课程设计单独计算成绩,考评方法见其大纲。

三、理论考试说明

1.单片机技术及应用理论考试,采用闭卷笔试形式,考试时间120分钟。

2.期末考试试题根据教学大纲,其范围和难度按照本方案中制订的考试考核内容和要求确定。考试命题覆盖考试大纲要求范围。

3.期末考试试题类型有以下几种:

①填空题;

②选择题;

③判断题;

④简答题

⑤综合应用题。

四、考试考核要求层次

按照教学大纲的要求,理论考试要求分为掌握、理解和了解三个层次。

掌握:

对于本课程的重点内容要求学生达到掌握的程度。即能够全面、深入理解和熟练掌握所学内容,并能够用其分析、初步设计和解答与应用相关的问题,能够举一反三。要求学生掌握的内容也就是考试的主要内容,在考试中所占比例约70。

理解:

对于本课程的一般内容要求学生能够理解。即要求学生能够较好地理解所学内容,并且对所涉及的内容能够进行简单分析和判断。要求学生理解的内容也是考试的内容,在考试中所占比例约25。

了解:

对于本课程的次要内容要求学生能够了解。要求学生了解的内容,一般是指在眼下不必进一步深入和扩展,有些也许需要学生自己今后在工作中进行深入研究。对要求了解的内容,在考试中占较小比例,不超过5。

实验五:按键电路、显示电路实验

一、实验目的:

1.掌握独立式按键电路与矩阵式按键电路的设计方法。

2.掌握数码管显示电路的工作原理

3.掌握源程序编辑软件UltraEdit,编译软件KeilC51、仿真软件Proteus的使用方法

4.掌握硬件仿真器ME-52A的使用方法

二、实验器材:

1.单片机实验板

2.单片机硬件仿真器ME-51A

3.计算机

4.电源

三、实验要求:

1.电路如图5所示,用单片机的P3口所接的四个独立式按键控制p1口流水灯花样的方法;具体表现为:p3.0、P3.1、P3.2、P3.3四个小按键分别实现了四个控制:

(1)跑灯:即P1.0---1.7亮点流动:

(2)流水灯:即P1.0-1.7依次点

亮(3)交叉闪烁:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7轮流点亮

(4)停止;在任何状态下按此键程序停止运行.

2.电路如图6所示,用P2口所接的4×4矩阵式键盘作为输入,在P1口所接的数码管上显示出每个按键的0~F序号,键盘的布局如下表所示:

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

四、实验原理:

1.独立式按键电路显示如图5所示,从图中可看出,判断有无键按下,只要检测P3.0~P3.3相应端口的高低电平即可,若检测有某一端口为低电平,表明该端口有按键按下,经延时消抖后转去执行相应的功能子程序。若为高电平,表明无键按1.独立式按键电路如图5所示,下,继续检测。

示例程序如下:

ORG000H

LJMPSTAR1

ORG0030H

STAR1:MOVP3,#0FFH;置P3口为输入态

JNBP3.0,FUN0;判别P3.0是否有键按下,是,则转FUN0

JNBP3.1,FUN1;判别P3.1是否有键按下,是,则转FUN1

JNBP3.2,FUN2;判别P3.2是否有键按下,是,则转FUN2

JNBP3.3,FUN3;判别P3.3是否有键按下,是,则转FUN3

JNBF0,STAR1;曾经有键按下F0置1

RET

图5

FUN0:LCALLDL10MS;消岸抖动

JBP3.0,STAR1

WAITL0:JNBP3.0,WAITL0;等待键释放

SETBF0

FUN01:LCALLFUN00

LCALLSTAR1

LJMPFUN01

FUN1:LCALLDL10MS;消岸抖动

JBP3.1,STAR1

WAITL1:JNBP3.1,WAITL1;等待键释放

SETBF0

FUN10:LCALLFUN11

LCALLSTAR1

LJMPFUN10

FUN2:LCALLDL10MS;消岸抖动

JBP3.2,STAR1

WAITL2:JNBP3.2,WAITL2;等待键释放

SETBF0

FUN20:LCALLFUN22

LCALLSTAR1

LJMPFUN20

FUN3:LCALLDL10MS;消岸抖动

JBP3.3,STAR1

WAITL3:JNBP3.3,WAITL3;等待键释放

CLRF0

MOVP1,#0FFH;关显示

LJMPSTAR1

FUN00:MOVA,#0FEH;跑灯子程序

FUN000:MOVP1,A

LCALLDL05S

JNBACC.7,OUT

RLA

AJMPFUN000

OUT:RET

FUN11:MOVA,#0FEH;流水灯子程序

FUN111:MOVP1,A

LCALLDL05S

JZOUT

RLA

ANLA,P1

AJMPFUN111

FUN22:MOVA,#0AAH;交叉点亮子程序

MOVP1,A

LCALLDL30S

CPLA

MOVP1,A

LCALLDL30S

RET

;____________;

;延时程序;

;____________;

DL512:MOVR2,#0FFH

LOOP1:DJNZR2,LOOP1

RET

DL10MS:MOVR3,#14H

LOOP2:LCALLDL512

DJNZR3,LOOP2

RET

DL05S:MOVR4,#0AH

LOOP3:LCALLDL10MS

DJNZR4,LOOP3

RET

DL30S:MOVR5,#03H

LOOP4:LCALLDL05S

DJNZR5,LOOP4

RET

END

2.矩阵式按键电路显示如图6所示。采用扫描方式进行按键的识别检测,并将对应按键的键号用查表指令将对应的代码显示在数码管上。

图6

参考程序如下:

ORG0000H

LJMPSTART

ORG0030H

START:MOVSP,#60H;设置堆栈指针

SCAN:MOVR3,#0F7H;置行扫描初值

MOVR1,#00H;到TABLE表中取码的指针

SCAN1:MOVA,R3

MOVP2,A;扫描输出

MOVA,P2;重读P2口状态

MOVR4,A;暂存于R4吕中

SETBC;C=1

MOVR5,#03H;扫描4列初值

L1:RLCA;A中内容循环左移

JNCKEYIN;C=0,有键按下,转消抖

INCR1;取码指针加1

DJNZR5,L1;无键按下,继续检测

MOVA,R3;扫描下一行

SETBC

RRCA

MOVR3,A

JCSCAN1;4行是否扫描完,未完,继续

LJMPSCAN

KEYIN:MOVR7,#10;削除抖动

D2:MOVR6,#248

DJNZR6,$

DJNZR7,D2

D3:MOVA,P2;按键放开否?

XRLA,R4

JZD3

MOVA,R1

MOVDPTR,#TABLE;到TABLE中取码

MOVCA,@A DPTR

MOVP1,A

LJMPSCAN

TABLE:DB0C0H,0F9H,0A4H,0B0H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH

END

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EH

END

五、实验步骤:

1.运行UltraEdit-32源程序编辑软件,输入、编辑汇编语言源程序。

2.运行KeiluVision2源程序编译软件,对源程序进行编译,得到目标代码文件。

3.运行Proteus模拟仿真软件,打开已绘制好的仿真电路原理图,进行模拟仿真。

4.把硬件仿真器ME-52A与单片实验板连接好,再用硬件仿真器进行仿真验证。

六、实验分析与总结

1.用仿真系统调试简单程序结构、分支程序结构、循环程序结构、子程序结构和中断结构的关键在于,如何将对程序的分析理解和开发系统提供的基本功能有机地结合起来,其前提条件是必须对源程序的作用、结构特点、运行过程与结果有较全面的认识,并能根据程序运行过程中出现的现象和结果分析并判断产生各种故障现象的原因,再运用排除法逐一检验各种判断是否准确。

2.掌握程序结构特点的基础上,合理选择观测点,通过观察在观测点处参数及路径的变化检验程序运行的结果。

3.高调试程序的效率,应对单片机开发系统所提供的几种程序运行调试方式有

足够的了解并能熟练地运用。例如,在调试过程中,若要观察最终结果,则可选择全速运行调试;若要观察相关指令的运行结果或运行路径的变化过程,则可选择单步运行;若要检查子程序的运行过程,则可选择跟踪运行调试;若要检查循环程序或中断服务程序,则可选择断点运行调试;若要定点检查程序运行到某处的结果时,则可选择快速运行到光标处调试。但实际中究竟选用哪种方法更适宜或哪几种方法结合使用更快捷,将随着分析能力与操作的熟练程度逐步提高。4.程序运行结果是否正确时,应运用单片机开发系统所提供的交互界面,将程序运行过程中程序计数器PC(地址)的变化、各单元(内部RAM和外部RAM)内容的变化、特殊功能寄存器内容的变化、堆栈指针SP内容的变化与程序的理论分析结果相对照。

5.程序和调试程序时,需要多次反复的过程,并非一次就能排除全部故障,特别是单片机应用系统的硬件电路和汇编程序相结合的综合调试就更加复杂,因此,必须通过反复调试,不断修改硬件和软件,直到最终符合设计要求为止。如果在调试中能够根据实验现象预先对产生故障的原因加以判断和分析,并制定出相应的调试方法和步骤,可缩小排除故障的范围,提高调试效率。

七、思考与练习

填空题

1、设X=5AH,Y=36H,则X与Y“或”运算为__7EH_______,X与Y的“异或”运算为___6CH_____。

2、若机器的字长为8位,X=17,Y=35,则X+Y=__110100_____,X-Y=_11101110______(要求结果写出二进制形式)。

3、单片机的复位操作是____高电平______(高电平/低电平),单片机复位后,堆栈指针SP的值是___07h_____。

4、单片机中,常用作地址锁存器的芯片是__74HC373____________,常用作地址译码器芯片是_____74HC138____________。

5、若选择内部程序存储器,应该设置为_____高_______(高电平/低电平),那么,PSEN信号的处理方式为___不用__________________。

6、单片机程序的入口地址是____0000H__________,外部中断1的入口地址是______0013H_________。

7、若采用6MHz的晶体振荡器,则MCS-51单片机的振荡周期为__0.5us_______,机器周期为_____2us__________。

8、扩展芯片的选择方法有两种,它们分别是___线选法_______________和_____译码法__________。

9、单片机的内部RAM区中,可以位寻址的地址范围是____20H~2FH______________,特殊功能寄存器中,可位寻址的地址是___是能被8整除的地址_________________。

10、子程序返回指令是___ret______,中断子程序返回指令是__reti。

11、8051单片机的存储器的最大特点是内部RAM与外部RAM分开编址。

12、8051最多可以有32个并行输入输出口,最少也可以有8个并行口。

13、函数是C语言的基本单位。

14、串行口方式2接收到的第9位数据送SCON寄存器的RB8位中保存。

15、MCS-51内部提供3个可编程的16位定时/计数器,定时器有4种工作方式。

16、一个函数由两部分组成,即说明部分和语句部分。

17、串行口方式3发送的第9位数据要事先写入SCON寄存器的TB8位。

18、利用8155H可以扩展3个并行口,256个RAM单元。

19、C语言中输入和输出操作是由库函数scanf和printf等函数来完成。

二、选择题

1、C语言中最简单的数据类型包括(B)。

A、整型、实型、逻辑型B、整型、实型、字符型

C、整型、字符型、逻辑型D、整型、实型、逻辑型、字符型

2、当MCS-51单片机接有外部存储器,P2口可作为(C)。

A、数据输入口B、数据的输出口

C、准双向输入/输出口D、输出高8位地址

3、下列描述中正确的是(D)。

A、程序就是软件B、软件开发不受计算机系统的限制

C、软件既是逻辑实体,又是物理实体D、软件是程序、数据与相关文档的集合

4、下列计算机语言中,CPU能直接识别的是(D)。

A、自然语言B、高级语言C、汇编语言D、机器语言

5、MCS-5l单片机的堆栈区是设置在(C)中。

A、片内ROM区B、片外ROM区C、片内RAM区D、片外RAM区

6、以下叙述中正确的是(C)。

A、用C语言实现的算法必须要有输入和输出操作

B、用C语言实现的算法可以没有输出但必须要有输入

C、用C程序实现的算法可以没有输入但必须要有输出

D、用C程序实现的算法可以既没有输入也没有输出

7、定时器/计数器工作方式1是(D)。

A、8位计数器结构B、2个8位计数器结构

C、13位计数结构D、16位计数结构

8、C语言提供的合法的数据类型关键字是(B)。

A、DoubleB、shortC、integerD、Char

9、片内RAM的20H~2FH为位寻址区,所包含的位地址是(B)。

A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH

10、以下能正确定义一维数组的选项是(B)。

A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};

C、chara={’A’,’B’,’C’};D、inta[5]="0123";

11、数据的存储结构是指(D)。

A、存储在外存中的数据B、数据所占的存储空间量

C、数据在计算机中的顺序存储方式D、数据的逻辑结构在计算机中的表示

12、下列关于栈的描述中错误的是(C)。

A、栈是先进后出的先性表B、栈只能顺序存储

C、栈具有记忆作用D、对栈的插入和删除操作中,不需要改变栈底指针

13、在寄存器间接寻址方式中,间址寄存器中存放的数据是(B)。

A、参与操作的数据B、操作数的地址值

C、程序的转换地址D、指令的操作码

14、MCS-51单片机的复位信号是(A)有效。

A、高电平B、低电平C、脉冲D、下降沿

15、为了使模块尽可能独立,要求(B)。

A、模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强

B、模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱

C、模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱

D、模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强

16、若MCS-51单片机使用晶振频率为6MHz时,其复位持续时间应该超过(B)。

A、2μsB、4μsC、8μsD、1ms

17、以下选项中可作为C语言合法常量的是(A)

A、-80B、-080C、-8e1.0D、-80.0e

18、能够用紫外光擦除ROM中程序的只读存储器称为(C)。

A、掩膜ROMB、PROMC、EPROMD、EEPROM

19、以下不能定义为用户标识符是(D)。

A、MainB、_0C、_intD、sizeof

20、下选项中,不能作为合法常量的是(B)。//幂不能为小数

A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0

21、以下叙述中错误的是(C)

A、对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B、数组名代表的是数组所占存储区的首地址,其值不可改变

C、当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息

D、可以通过赋初值的方式确定数组元素的个数

22、以下与函数fseek(fp,0L,SEEK_SET)有相同作用的是(D)

A、feof(f

p)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

23、存储16×16点阵的一个汉字信息,需要的字节数为(A)

A、32B、64C、128D、256

24、已知1只共阴极LED显示器,其中a笔段为字形代码的最低位,若需显示数字1,则它的字形代码应为(B)。

A、06HB、F9HC、30HD、CFH

25、在C语言中,合法的长整型常数是(A)

A、OLB、4962710C、324562&D、216D

26、以下选项中合法的字符常量是(B)

A、"B"B、’\010’C、68D、D

27、若PSW.4=0,PSW.3=1,要想把寄存器R0的内容入栈,应使用(D)指令。

A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H

28、在片外扩展一片2764程序存储器芯片要(B)地址线。

A、8根B、13根C、16根D、20根

29、设MCS-51单片机晶振频率为12MHz,定时器作计数器使用时,其最高的输入计数频率应为(C)

A、2MHzB、1MHzC、500kHzD、250kHz

30、下列数据字定义的数表中,(A)是错误的。

A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH

三、判断题

(√)1、在对某一函数进行多次调用时,系统会对相应的自动变量重新分配存储单元。

(×)2、在C语言的复合语句中,只能包含可执行语句。

(√)3、自动变量属于局部变量。

(×)4、Continue和break都可用来实现循环体的中止。

(√)5、字符常量的长度肯定为1。

(×)6、在MCS-51系统中,一个机器周期等于1.5μs。

(√)7、C语言允许在复合语句内定义自动变量。

(√)8、若一个函数的返回类型为void,则表示其没有返回值。

(×)9、所有定义在主函数之前的函数无需进行声明。

(×)10、定时器与计数器的工作原理均是对输入脉冲进行计数。

(×)11、END表示指令执行到此结束。

(√)12、ADC0809是8位逐次逼近式模/数转换接口。

(√)13、MCS-51的相对转移指令最大负跳距是127B。

(×)14、MCS-51的程序存储器只是用来存放程序的。

(√)15、TMOD中的GATE=1时,表示由两个信号控制定时器的的启停。

(×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范围内。

(×)17、MCS-51系统可以没有复位电路。

(×)18、片内RAM与外部设备统一编址时,需要专门的输入/输出指令。

(√)19、锁存器、三态缓冲寄存器等简单芯片中没有命令寄存和状态寄存等功能。

(√)20、使用8751且=1时,仍可外扩64KB的程序存储器。

四、简答题

1、在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?

答:(1)确定T/C的工作方式——编程TMOD寄存器;

(2)计算T/C中的计数初值,并装载到TH和TL;

(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器;

(4)启动定时器/计数器——编程TCON中TR1或TR0位。

2、什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方?答:多个函数可以同时使用的函数,称为重入函数。

通常情况下,C51函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。

重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。

3、8051引脚有多少I/O线?他们和单片机对外的地址总线和数据总线有什么关系?地址总线和数据总线各是几位?

答:8051引脚共有40个引脚,8051的地址总线由P2和P0口提供,P2口是地址总线的高8位,P0口是地址总线的低8位;数据总线由P0口提供;P0口的地址总线和数据总线是分时进行的,P0口的地址总线需要外接地址锁存器完成地址锁存。

地址总线共16位,数据总线是8位。

4、在有串行通信时,定时器/计数器1的作用是什么,怎样确定串行口的波特率?

答:在有串行通信时,定时器/计数器1的作用是串行口发生器。

串行口的波特率根据串行口的工作方式具有不同的计算方式:

方式0的波特率固定为晶体振荡器的十二分之一;

方式1的波特率=2SMOD.(定时器1的溢出率)/32;

方式2波特率=2SMOD.(fosc/64);

方式3波特率同方式1(定时器l作波特率发生器)。

5、如何消除键盘的抖动?怎样设置键盘中的复合键?

答:由于按键是机械开关结构,所以当用手按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但通常不会大于10ms。

若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约10ms后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟10ms后再扫描处理并不迟。

复合键可以仿照计算机复合键的处理方法,通常可以假设一个键具有复合功能,再与其它减的键值组合成复合键。

1、矩阵式键盘的结构与工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。

2、矩阵式键盘的按键识别方法

确定矩阵式键盘上何键被按下介绍一种“行扫描法”。

行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。

1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

下面给出一个具体的例子:

图仍如上所示。8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源 5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。

1、检测当前是否有键被按下。检测的方法是P1.4-P

1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。

2、去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。

3、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:

P1.71110

P1.61101

P1.51011

P1.40111

在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值

4、为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。

键盘扫描程序:

从以上分析得到键盘扫描程序的流程图如图2所示。程序如下

SCAN:MOVP1,#0FH

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT1

SJMPNEXT3

NEXT1:ACALLD20MS

MOVA,#0EFH

NEXT2:MOVR1,A

MOVP1,A

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,KCODE;

MOVA,R1

SETBC

RLCA

JCNEXT2

NEXT3:MOVR0,#00H

RET

KCODE:MOVB,#0FBH

NEXT4:RRCA

INCB

JCNEXT4

MOVA,R1

SWAPA

NEXT5:RRCA

INCB

INCB

INCB

INCB

JCNEXT5

NEXT6:MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT6

MOVR0,#0FFH

RET

键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。

到本课为止,本站教程暂告一个段落!感谢大家的关心和支持!

矩阵按键部分由16个轻触按键按照4行4列排列,连接到JP50端口。将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.判断键盘中有无键按下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

下面给出一个具体的例子:

电路图路径:G:\图片\电路图片\xl100097.jpg

8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。

1.检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。

2.去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。

3.若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:

P1.71110

P1.61101

P1.51011

P1.40111

在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。

4.为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。

实验目的:通过XL1000的16位矩阵按键,在数码管上分别显示0---9,A,B,C,D,E,F。

接线方法:1用一条8PIN数据排线,把矩阵按键部份的JP50,接到CPU部份的P1口JP44.

2接8位数码管的数据线。将数码管部份的数据口JP5接到CPU部份的P0口JP51.

3接8位数码管的显示位线。将数码管部份的显示位口JP8接到CPU部份的P2口JP52.

参考程序:

;本程序实现扫描按键显示功能.

;分别按16个键盘显示分别显示数字123A456B789C*0#D

;键盘口P1,数码管显示第二位p21,数码管段位p0口

org0000h

ajmpmain

org0030h

main:

movdptr,#tab;将表头放入DPTR

lcallkey;调用键盘扫描程序

movca,@a dptr;查表后将键值送入ACC

movp0,a;将Acc值送入P0口

CLRP2.1;开显示

ljmpmain;返回反复循环显示

KEY:

LCALLKS;调用检测按键子程序

JNZK1;有键按下继续

LCALLDELAY2;无键按调用延时去抖

AJMPKEY;返回继续检测按键

K1:LCALLDELAY2

LCALLDELAY2;有键按下延时去抖动

LCALLKS;再调用检测按键程序

JNZK2;确认有按下进行下一步

AJMPKEY;无键按下返回继续检测

K2:MOVR2,#0EFH;将扫描值送入R2暂存

MOVR4,#00H;将第一列值送入R4暂存

K3:MOVP1,R2;将R2的值送入P1口

L6:JBP1.0,L1;P1.0等于1跳转到L1

MOVA,#00H;将第一行值送入ACC

AJMPLK;跳转到键值处理程序

L1:JBP1.1,L2;P1.1等于1跳转到L2

MOVA,#04H;将第二行的行值送入ACC

AJMPLK;跳转到键值理程序进行键值处理

L2:JBP1.2,L3;P1.2等于1跳转到L3

MOVA,#08H;将第三行的行值送入ACC

AJMPLK;跳转到键值处理程序

L3:JBP1.3,NEXT;P1.3等于1跳转到NEXT处

MOVA,#0cH;将第四行的行值送入ACC

LK:ADDA,R4;行值与列值相加后的键值送入A

PUSHACC;将A中的值送入堆栈暂存

K4:LCALLDELAY2;调用延时去抖动程序

LCALLKS;调用按键检测程序

JNZK4;按键没有松

开继续返回检测POPACC;将堆栈的值送入ACC

RET

NEXT:

INCR4;将列值加一

MOVA,R2;将R2的值送入A

JNBACC.7,KEY;扫描完至KEY处进行下一扫描

RLA;扫描未完将A中的值右移一位进行下一列的扫描

MOVR2,A;将ACC的值送入R2暂存

AJMPK3;跳转到K3继续

KS:MOVP1,#0FH;将P1口高四位置0低四位值1

MOVA,P1;读P1口

XRLA,#0FH;将A中的值与A中的值相异或

RET;子程序返回

DELAY2:;40ms延时去抖动子程序

MOVR5,#08H

L7:MOVR6,#0FAH

L8:DJNZR6,L8

DJNZR5,L7

RET

tab:

db28h,34h,28h,34h,0a9h,60h,20h,7ah,

20h,21h,61h,74h,30h,62h,0a2h,7eh

;0h0hc9878654a321轮流显示键盘因为无法表达*#就用H表示,B用8表示

end

这是我做成功的4X4键盘扫描源程序,P1.0-P1.3做四根列线,P1.4-P1.7做四根行线。

数码管的字型表是按照标准接法做的,按对应的按键数码管显示对应的数字。

以下是源程序:

KEYBUFEQU30H

ORG00H

START:MOVKEYBUF,#2

MOVP2,#00001111B

WAIT:

MOVP1,#0FFH

CLRP1.4

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK1

MOVKEYBUF,#0

LJMPDK1

NK1:CJNEA,#0DH,NK2

MOVKEYBUF,#1

LJMPDK1

NK2:CJNEA,#0BH,NK3

MOVKEYBUF,#2

LJMPDK1

NK3:CJNEA,#07H,NK4

MOVKEYBUF,#3

LJMPDK1

NK4:NOP

DK1:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK1A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK1A

NOKEY1:

MOVP1,#0FFH

CLRP1.5

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK5

MOVKEYBUF,#4

LJMPDK2

NK5:CJNEA,#0DH,NK6

MOVKEYBUF,#5

LJMPDK2

NK6:CJNEA,#0BH,NK7

MOVKEYBUF,#6

LJMPDK2

NK7:CJNEA,#07H,NK8

MOVKEYBUF,#7

LJMPDK2

NK8:NOP

DK2:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK2A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK2A

NOKEY2:

MOVP1,#0FFH

CLRP1.6

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK9

MOVKEYBUF,#8

LJMPDK3

NK9:CJNEA,#0DH,NK10

MOVKEYBUF,#9

LJMPDK3

NK10:CJNEA,#0BH,NK11

MOVKEYBUF,#10

LJMPDK3

NK11:CJNEA,#07H,NK12

MOVKEYBUF,#11

LJMPDK3

NK12:NOP

DK3:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK3A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK3A

NOKEY3:

MOVP1,#0FFH

CLRP1.7

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK13

MOVKEYBUF,#12

LJMPDK4

NK13:CJNEA,#0DH,NK14

MOVKEYBUF,#13

LJMPDK4

NK14:CJNEA,#0BH,NK15

MOVKEYBUF,#14

LJMPDK4

NK15:CJNEA,#07H,NK16

MOVKEYBUF,#15

LJMPDK4

NK16:NOP

DK4:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK4A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK4A

NOKEY4:

LJMPWAIT

DELY10MS:

MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

TABLE:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0-9

DB088H,083H,0C6H,0A1H,086H,08EH,089H,0CFH,0C7H,0C8H;A,B,C,D,E,F,H,I,L,N,

END

;P3.1数据采集控制

;P2.6P2.7个位十位显示转换控制

;P1口接8个开关模拟数据

;P1.0-P1.3为个位开关量输入

;P1.4-P1.7为十位开关量输入

;此程序仅供参考

;功能P1口接8个开关输入量4个一组,分别为个位,十位输入

;P0口接一个数码管,依次显示输入量。P3.1控制是否读入

;开关量。P2.6P2.7控制是否显示个位

或十位

ORG100h

LJMPSTAR

STAR:MOVP1,#0FFH

SETBP3.1数据读入标志

MOVR0,#100,循环工作次数

LOOP:JBP3.1,$P3.1低电平时,采集P1口数据开关量处理显示阶段不再应答P3.1

MOVA,P1

PUSHACC

ANLA,#0FH取个位数值

MOVR1,A个位数值保存到R1

POPACC

ANLA,#0F0H

SWAPA高4位转成字节信息

MOVR2,A十位数值保存到R2

MOVDPTR,#TABLED

MOVA,R1

MOVCA,@A DPTR

MOVP0,A

CLRP2.6个位显示

ACALLDELAY500MS

SETBP2.6

MOVA,R2

MOVCA,@A DPTR

MOVP0,A

CLRP2.7十位显示

ACALLDELAY500MS

SETBP2.7

DJNZR0,LOOP

DELAY500MS:延时500毫秒子程略

RET

TABLED:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80H,90H,88h,83h,0c6h,0a1h,86h,8eh

END

#include

typedefunsignedcharBYTE;

BYTEcodeTABLED[16]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0X0f8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};

BYTEDATled;

sbitP26=P2^6;

sbitP27=P2^7;

sbitP31=P3^1;

intTIME;

voidtimedelay(DTIME)

intDTIME;

{

intI;

for(I=0;I4;

P0=TABLED[TEMP];

P27=0;

timedelay(TIME);

P27=1;

}

}

}

1.实验任务

在8X8 LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。

2.电路原理图

图4.24.1

3.硬件电路连线

(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上;

(2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;

4.程序设计内容

(1).8X8 点阵LED工作原理说明

8X8点阵LED结构如下图所示

图4.24.2

从图4.24.2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:

一根竖柱:对应的列置1,而行则采用扫描的方法来实现。

一根横柱:对应的行置0,而列则采用扫描的方法来实现。

5.汇编源程序

ORG00H

START:NOP

MOVR3,#3

LOP2:MOVR4,#8

MOVR2,#0

LOP1:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

INCR2

LCALLDELAY

DJNZR4,LOP1

DJNZR3,LOP2

MOVR3,#3

LOP4:MOVR4,#8

MOVR2,#7

LOP3:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

DECR2

LCALLDELAY

DJNZR4,LOP3

DJNZR3,LOP4

MOVR3,#3

LOP6:MOVR4,#8

MOVR2,#0

LOP5:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

INCR2

LCALLDELAY

DJNZR4,LOP5

DJNZR3,LOP6

MOVR3,#3

LOP8:MOVR4,#8

MOVR2,#7

LOP7:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

DECR2

LCALLDELAY

DJNZR4,LOP7

DJNZR3,LOP8

LJMPSTART

DELAY:MOVR5,#10

D2:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABA:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

TABB:DB01H,02H,04H,08H,10H,20H,40H,80H

END

6.C语言源程序

#include0;j--);

}

voidmain(void)

{

unsignedchari,j;

while(1)

{

for(j=0;j<3;j )

//fromlefttoright3time

{

for(i=0;i<8;i )

{

P3=taba[i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromrighttoleft3time

{

for(i=0;i<8;i )

{

P3=taba[7-i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromtoptobottom3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[7-i];

delay1();

}

}

for(j=0;j<3;j )

//frombottomtotop3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[i];

delay1();

}

}}

}

LED点阵显示实验

一.实验要求

编程实现中英文字符的显示。

二.实验目的

1.了解LED点阵显示的基本原理和实现方法。

2.掌握点阵汉字库的编码和从标准字库中提取汉字编码的方法。

三.实验电路及连线

点阵显示模块WTD3088的(红色)列输入线接至内部LED的阴极端,行输入线接至内部LED的阳极端(若阳极端输入为高电平,阴极端输入低电平,则该LED点亮)。发光点的分布如图22-0所示。

Fig22-0WTD3088LED分布

如图22-1示,本实验模块使用74LS374来控制列输入线的电平值。将74LS374的某输出置0,则对应的LED阴极端被置低。如图22-2示,本实验模块使用74LS273来控制行输入线,并通过9013提供电流驱动。将74LS273的某输出置1,则对应的LED阳极端被置高。每次系统重新开启或总清后,74LS273输出为全0,LED显示被关闭。

通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。

Fig22-1LED模块及列扫描电路

Fig22-2行扫描电路

Fig22-3地址译码电路

本实验模块使用4块WTD3088组成16×16点阵,以满足汉字显示的要求。为了方便的控制四个单元,使用了一片74LS139译码,产生四个地址片选信号:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的两片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的两片74LS374。

实验接线:按示例程序,模块的CSLED接51/96地址的8000H。

四.实验说明

使用高亮度LED发光管构成点阵,通过编程控制可以显示中英文字符、图形及视频动态图形。LED显示以其组构方式灵活、亮度高、技术成熟、成本低廉等特点在证券、运动场馆及各种室内/外显示场合得到广泛的应用。

所显示字符的点阵数据可以自行编写(即直接点阵画图),也可从标准字库(如ASC16、HZ16)中提取。后者需要正确掌握字库的编码方法和字符定位的计算。

实验盘片中“字符转换”子目录下提供的Basc16.exe,BHz16.exe可方便的将单个字符的码表从标准字库Asc16,Hzk16中提取出来。具体使用方法是运行上述可执行程序,根据提示输入所需字符(如是汉字还需要先启动dos下的汉字环境,如ucdos,pdos95等)。程序将该字符的码表提取出来,存放在该字符ASC或区位码为文件名称的.dat文件中。用户只需将该文件中内容拷贝、粘贴到自己的程序中即可。但需要注意字节排列顺序、字节中每一位与具体显示点的一一对应关系,必要时还要对码表稍作修改。同一目录下还提供了上述可执行程序的源文件,使用BC3.1编写,供用户参考。

五.实验程序框图

用户应留心其中行扫描的实现及码表的处理。

六.实验程序:

(一)提供LEDA51演示Asc16字符的简单点阵显示。

;________*LED点阵显示示例程序______________________*

;__该程序显示Asc16字符__

;__为了简单起见,程序只显示一个字符__

;__该程序针对T598实验机的模块14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQUCSLED 2H;列1374

CSC2EQUCSLED 3H;列2374

ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;关闭行

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;关闭列

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H;每次为单行扫描

DISP:

MOVA,R5

MOVDPTR,#ASCE;此处设定所要显示的字符

MOVCA,@A DPTR

CPLACC;代码取反,决定显示的阴阳

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

MOVDPTR,#ASCE

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延时子程序,协调字符显示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符点阵字库______________*

;ASC16字符编码排列

;0

;1

;|

;|

;14

;15

;高位D7--D0

;请注意编码的排列次序和实际显示点阵分布的关系

ASCA:DB00H,00H,10H,38H,6CH,0C6H,0C6H,0FEH

DB0C6H,0C6H,0C6H,0C6H,00H,00H,00H,00H

ASCE:DB00H,00H,0FEH,66H,62H,68H,78H,68H

DB60H,62H,66H,0FEH,00H,00H,00H,00H

ASCD:DB00H,00H,0F8H,6CH,66H,66H,66H,66H

DB66H,66H,6CH,0F8H,00H,00H,00H,00H

ASCK:DB00H,00H,0E6H,66H,66H,6CH,78H,78H

DB6CH,66H,66H,0E6H,00H,00H,00H,00H

;____________________________________________________

END

(二)LEDHZ51两个示例程序。和Hz16字符的简单点阵显示。

;________*LED点阵显示示例程序______________________*

;__该程序显示hz16字符__

;__为了简单起见,程序只显示一个字符__

;__该程序针对T598实验机的模块14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQUCSLED 2H;列1374

CSC2EQUCSLED 3H;列2374ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;关闭LED显示

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;关闭LED显示

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H

DISP:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延时子程序,协调字符显示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符点阵字库______________*

;HZ16字符编码排列

;01

;23

;|

;|

;2829

;3031

;高位D7--D0

HZAI:DB00H,78H,3FH,80H,11H,10H,09H,20H

DB7FH,0FEH,42H,02H,82H,04H,7FH,0F8H

DB04H,00H,07H,0F0H,0AH,20H,09H,40H

DB10H,80H,11H,60H,22H,1CH,0CH,08H

HZDI:DB00H,80H,40H,80H,20H,88H,2FH,0FCH

DB08H,88H,08H,88H,0E8H,88H,2FH,0F8H

DB28H,88H,28H,88H,28H,88H,2FH,0F8H

DB28H,08H,50H,06H,8FH,0FCH,00H,00H

HZKE:DB01H,00H,01H,04H,0FFH,0FEH,01H,00H

DB01H,10H,1FH,0F8H,10H,10H,10H,10H

DB10H,10H,1FH,0F0H,14H,50H,04H,40H

DB04H,40H,08H,42H,10H,42H,60H,3EH

;____________________________________________________

END

基于89C51的计算机可锁定加密键盘设计

摘要:介绍PC键盘和键盘接口的PS/2通信协议,以及用89C51实现可锁定键盘的软件和硬件设计方法。具有安全可靠、容错能力强、可以直接采用标准键盘进行改装、便于实现等优点,并保留标准键盘的全部功能。

关键词:PS/289C51C51键盘

引言

在智能仪器、自动控制等领域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。为适应开放式、模块化的要求,嵌入式PC具有标准的PC接口,如VGA显示器控制接口、以太网接口、RS232接口、PC/AT键盘接口等。所以,可以用标准的PC键盘对嵌入式PC进行操作与控制。键盘在输入指令之后,可能很长一段时间不用。为计算机安全和防止误触发,需要将键盘锁定,还要对某些键采取屏蔽措施,但是PC标准键盘不能满足这些要求。本文介绍一种用89C51设计实现的可锁定加密PC/AT键盘。

1键盘功能及工作原理

PC键盘功能主要有按键识别、去抖、重键处理、发送扫描码、自动重发、接收键盘命令、处理命令等。键盘有编码键盘和非编码键盘。编码键盘程序设计简单,但硬件电路复杂,价格较高;非编码键盘用软件来实现识别键、编码转换、去抖等功能,硬件电路简单,价格便宜。现代微机系统中广泛采用非编码键盘。PC键盘多采用18行×8列的二维矩阵行列结构。采用行扫描法识别按下的按键。

2PS/2协议

PS/2协议是外设与主机之间通信的一种同步双向串行协议。在该协议中主机拥有较高的优先级,在一定条件下可以终止外设正在进行的发送过程。PS/2协议采用的传送数据帧的格式为:1位起始位(0)、8位数据位、1位奇偶校验位、1位停止位(1)。数据发送时低位在前,高位在后。外设每收到主机发来的1帧数据,都要紧随该帧的停止位发送一个握手位ACK(0)应答主机。然后,外设还要发1帧应答数据(0xF0),表示外设已经完整地接收到了主机的命令;而主机则不需发送握手位,也不需要发送应答帧。

2.1键盘到PC键盘接口的通信

当时钟线和数据线均为高电平时,允许键盘发送数据,系统将接收数据;当时钟线被拉为低电平时,表明系统禁止数据传输。图1给出了发送时序,包含1个低电平触发的起始位、8位数据位、1个奇校验位和1个高电平的结束位。

2.2PC系统到键盘的通信协议

若时钟线出现高电平,数据线出现低电平,表明系统请求发送,键盘准备产生同步时钟脉冲串,并接收数据。包含了1个低电平触发的起始位、8位数据位、1个奇校验位、1个应答位、1个高电平的结束位。图2为时序图。

(1)键盘命令及执行过程

①FFH:复位键盘。系统通过此软件复位命令使键盘进入程序复位和内部自测试,称为基本保证测试(BAT)。复位键盘的过程如下:

a.键盘收到FFH后立即回送ACK(FAH)作答;

b.键盘接口收到ACK后,将键盘时钟和数据线置为高电平;

c.键盘检测到此状态后开始BAT操作;

d.如果BAT正确完成,键盘发送AAH以表示结束,

否则以FDH(或其它任何值)表示诊断有误。

②FEH:重新发送。当系统检测

到从键盘送来的任何传输错误时,它便向键盘发送FEH命令。键盘接收到此命令后,将重新送出原来的内容。③FDH~F7H:空操作(保留未用)。

④F6H:设置缺省值。此命令使键盘所有条件复位到电源接通时的缺省状态,键盘继续扫描。

⑤F5H:设置缺省值和停止键盘。此命令使键盘所有条件复位到电源接通时的缺省状态,并停止键盘扫描,等待下一个键盘命令。

⑥F4H:启动键盘。键盘接收到此命令后,用ACK(FAH)作答,清除输出缓冲器,并启动键盘开始扫描。

⑦F3H:设置拍发速率和延时参数。每当按下任一键时,键盘以拍发速率连续送出键的接通码,直到键被释放为止。延时参数是指按下一键后,键盘输出的响应时间。

系统缺省设置:拍发速率=10个/s±20,延时=500ms±20。

当要改变设置时可以使用F3H命令,并后跟一个字节的参数。参数定义如表1所列。

表1

D7

D6D5

D4D3

D2D1D0

C

B

A

计算拍发速率和响应延时的公式如下:

拍发速率=1/[(8 A)×2B×0.00417](1/s)

响应延时=(1 C)×250(ms)

注:缺省的延时参数值为2CH。

此命令的执行过程如下:

a.键盘收到F3H命令后,用FAH予以响应,并停止

扫描和等待随后的参数;

b.键盘若收到随后的设置参数,用另一个ACK响

应,并按其参数设置新的拍发速率和响应延时,

之后重新开始扫描(若键盘原来是开放的);

c.键盘若收到FAH命令,但无随后的设置参数,则

键盘结束命令设置,并保持原来的拍发速率和响

应延时,停止扫描。

⑧F2H,F1,EFH:保留未用。

⑨F0H:设置键盘扫描码命令。此命令用于设置键盘的扫描码,后跟参数指定三种扫描码的哪一种。键盘复位时,默认扫描码是第二种。

⑩EEH:回送命令。此命令用于辅助诊断,要求键盘接收到EEH时也要回送EEH予以响应。若键盘原来是开放的,则继续扫描。

EDH:置位/复位LED指示器。键盘右上角有三个LED指示器,分别反映Caps、Num和Scroll三个键的锁定情况。参数字节如表2所列。

表2

D7D3

D2

D1

D0

保留

1=激励CapsLED

1=激励NumLED

1=激励ScrollLED

此命令执行过程与F3H相似。若命令后跟参数,则按参数设定LED状态并继续扫描。若仅有命令无参数,则不改变LED原状态,并停止扫描。

(2)键盘响应

键盘在下列四种情况下都会向键盘接口发送数据。

①按下任一键,键盘以拍发速率向接口发送键盘接通扫描码。

②释放所按下的键,键盘发送断开扫描码。

③系统向键盘发送键盘命令后,键盘回送应答。

④当用户按键速度超出键盘所能容纳的最大键个数时,键盘做出响应。

后三种情况称为键盘响应。响应字节有7个,定义如下。

①FEH:重新发送响应。当键盘收到一个无效的键盘命令,或者检测到奇偶错的键盘命令时,键盘回送响应字节为FEH,要求系统重发键盘命令。

②FAH:正常应答。对任何一个有效的键盘命令,键盘回送FAH予以响应。

③00H:超限应答。当用户按键速度超出键盘所能容纳的最大键符个数时(16个字节的缓冲器),键盘发送00H。

④FDH:诊断故障应答。键盘接受软件复位命令,执行自测试过程中。若检测到故障,则以FDH应答。此时,键盘停止扫描并等待下一个键盘命令。

⑤AAH:诊断正常应答。键盘在软件复位过程中,正常完成BAT测试,以AAH应答。

⑥FEH:回响命令的应答,对键盘FEH命令的应答。

⑦F0H:断开扫描码前缀,键盘对键符按下后释放的应答,第一个字节为F0H,第二个字节为接通扫描码(有几个键例外)。

3硬件设计

PC系列键盘采用18行×8列的矩阵行列结构。89C51单片机有4个8位I/O端口,因此可以采用P0、P2口再加上P3口的2个(P3.6和P3.7)作为行扫描线。P1口作为列输入线(如果用P0口作列输入线,必须加上拉电阻)。采用P3.0、P3.1作为数据线和时钟线与PC系统进行通信,用P3.2、P3.4、P3.5控制键盘上的3个指示灯。硬件原理如图3所示。

键盘与计算机通过一个五芯(PS/2接口为六芯)插座相接,4个有效引脚的定义分别是电源(VCC)、地(GND)、串行时钟线(SCK)、串行数据线(SIO)。

4软件设计

①消抖及重键处理:通过软件上延时程序来消除抖动;采用后按键优先处理,即多键同时按下时,只重复发送最后按下键的扫描码。

②程序包括键盘扫描子程序、发送键码子程序、发送数据子程序、接收命令子程序、定时器1中断服务程序、主程序等。键盘扫描子程序用于扫描键状态,将被按键的位置号存入缓冲器中;发送键码子程序用于将缓冲区键的接通码或断开码发送给计算机键盘接口或者存在键盘密码缓冲区中;发送数据子程序用于将数据发给计算机键盘接口;接收命令子程序用于接收计算机键盘接口发来的键盘命令;定时器1中断服务子程序用于给程序中的延时提供标准时钟,并具有软件看门狗功能,防止软件出现死机现象;主程序用于系统初始化,子程序调度,锁定状态的显示等。

图6发送缓冲区键码子程序流程图

图4~6是主要软件模块的流程图。单片机源程序见本刊网络补充版(.com)。

5结论

本文介绍的PC/AT键盘具有结构简单、设计灵活、安全可靠的特点,可用于标准PC和嵌入式PC。本键盘可以在标准的键盘基础上进行改造,只需换掉原来的控制芯片即可,可节省设计成本。

单片机C51编程几个有用的模块(1)

KeilC51常用功能模块使用说明

说明

本文档包括单片机系统中常用到的时钟中断、通讯及键盘扫描等模块(见所附源程序)的说明。这些模块使用前后台系统模型。为达到最大的灵活性,需要在用户工程中定义config.h文件,在其中定义各模块可选参数的设置,而不是直接更改源代码。

这些可选内容大部分为宏定义,如果不定义宏相应的功能在编译时被屏蔽,不会增加代码长度。具体可选内容见各模块中的说明。

在Config.h文件中还要包含一个单片机硬件的资源头文件。

各模块使用了定义在Common.h中的一些数据类型。如:BIT(bit)BYTE(unsignedchar)等,具体请参见源程序。

时钟模块

在单片机软件设计中,时钟是重要资源,为了充分利用时钟资源,故设计本时钟模块。本模块使用定时器0,在完成用户指定功能的同时,还能够自动处理一些其它模块中与时钟相关的信息。

时钟模块由声明文件Timer.h以及实现文件Timer.c组成。

用户应该在Config.h中定义宏TIMER_RELOAD来设定定时器0的重装载初值。推荐的定时器0的中断时间大于1毫秒。

在程序的初始化阶段调用时钟模块的初始化函数InitTimerModule()之后,就可以使用时钟模块所以支持的各种功能。具体描述如下:

延时:当用户需要进行一定时间的延时时,可以通过调用Delay()来进行,参数为时钟中断的次数。如时钟中断周期为1ms,想进行100ms的延时,则可以调用Delay(100)。

注意:

如果延时的绝对时间小于时钟中断的周期,则不能够用本方法做到延时。

定时:当程序中需要使用定时功能时,如等待某外部事件,如果在一定时间内发生则继续执行,如果在这段时间内发生,则认为出现错误,转向错误处理机制。

在此推荐一种编程模式,但用户可以用自己认为更合理的方式处理此类问题。

这里简单说明一下关于阻塞式函数及非阻塞式函数。简单说,阻塞式函数就是当检测完成条件,如

果不能够完成则等待,如:

voidCheckSomething()

{

//gbitSuccessFlagisaglobalvariable

while(gbitSuccessFlag==FALSE)

{

//donothingbutwaiting

}

}

可以看到,当bitSuccessFlag没有被设置为TRUE时,函数保持等待状态不返回,这样就是阻塞式的函数。

另外一种情况:

BITCheckSomething()

{

if(gbitSuccessFlag==TRUE)

{

//…

returnTRUE;

}

returnFALSE;

}

在这里,如果所检测的事件有没有完成,函数进行检测之后,立刻返回,通过返回值报告完成情况,如果没有完成,则等待调用者分配再次执行的机会。这样的函数就是非阻塞函数。

在应用定时功能时,首先要将检测函数定义成非阻塞函数。如上面的第二个版本的CheckSomething。

然后下面模式:

BITbitDone=FALSE;

ResetClock();//cleartimerinterrupttimescounter

while(GetClock()

{

if(CheckSomething()==TRUE)

{

bitDone=TRUE;

break;

}

}

if(bitDone==FALSE)

{

//processtimeout

}或者简单写成:

BITbitDone=FALSE;

ResetClock();

while(GetClock()=(z))

当然,用户也可以将IsPackageHeader和IsPackageTailer定义成为函数,通过BIT类型的返回值来向调用者提供与相应宏相同的信息。

另一种办法需要在Config.h文件中定义宏SCOMM_ComplexPackageFormat。(需要注意的是,不能够同时定义SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否则会造成严重的不可预见性错误。

这时需要提供回调函数QueryPackageFormat,原形如下:

BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);

函数中三个参数的含义与使用简单数据包格式时判断数据包尾的宏的参数相同。

函数通过返回值来通知作为调用者的接收函数对接收到的数据如何处理,但目前这种方法仅为需要处理复杂数据包格式时的一种可选方法,但不推荐。用户如果想使用这种方法可以自己更改接收函数中相应的

#ifdefSCOM_ComplexPackageFormat

#endif//SCOMM_ComplexPackageFormat

预编译指令之间的内容。

例如指定QueryPackageFormat的返回值的含义:

0:继续找数据包头或继续找数据包尾。

1:找到数据包头。

2:找到数据包尾。

3:数据包出错,需要抛弃。

然后更改源代码来实现上面的协议。

注意:当用户需要使用字符串的时候,可以利用简单的包装函数将字符串转换为字节数组。所以没有必要提供专用的字符串处理函数。

键盘扫描模块

键盘扫描模块有两种工作方式,一种为自动的由时钟模块调用,另一种是由程序员自行调用。

1)由时钟模块自动调用的方式

将时钟模块实现文件(Timer.h)及键盘扫描模块的实现文件(KBScan。c)包含进工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。时钟模块自动对时钟中断进行计数,当达到TIMER_KBSCANDELAY宏所定义的值后,自动调用键盘扫描模块中的函数KBScanProcess()进行键盘扫描,也就是说,这个宏的值可以决定按键消抖动的时间。

用户应该提供两个回调函数OnKBScan()及OnKeysPressed()。在函数OnKBScan中进行键盘扫描,并返回扫描码。扫描码的类型缺省为BYTE,当键盘规模较大时,BYTE不能够完全包含键盘信息时,可在Config.h文件中重定义宏KBvalue,如下:

#defineKBvalueWORD

这样,就可以使用16位的键盘扫描码,如果此时还达不到要求,可以将键盘扫描码定义成一个结构,但这样做将会增加代码量及消耗更多的RAM资源,故不推荐。

扫描模块调用OnKBScan取得扫描码,并调用用户可以重定义的宏IsNoKeyPressed来判断是否有键按下,缺省的IsNoKeyPressed实现如下:

#defineIsNoKeyPressed(x)((x)==0x00)

即认为OnKBScan返回0扫描码时为没有键按下,如果扫描函数返回其它非零扫描码做为无键按下的扫描码时,可以在Config.h文件中重定义IsNoKeyPressed宏的实现。

8位键盘扫描码(缺省值)时,相应的扫描函数为:

BYTEOnKBScan()

当扫描模块经过软件消抖动之后,发现有键按下,就会调用另一个回调函数OnKeysPressed。函数的声明应该如下:

voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)

其中中的参数byKBvalue的类型为BYTE,此为缺省值,如果使用其它类型的扫描码,就将此参数变为相应类型。这个值由OnKBScan返回。另一个参数byState在通常情况下为零。但当用户在Config.h中定义宏KBSCAN_BRUSTCOUNT,同时键盘上的某键被按住不放时,扫描模块对它自己的调用(注意这里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是时钟中断足够的次数后调用扫描模块,而KBSCAN_BRUSHCOUNT为扫描模块自身的被调用次数)进行计数,当达到KBSCAN_BRUSTCOUNT时,扫描模块调用OnKeysPressed,此时第一个参数的含义不变,而byState变成1,同时计数器复位,又经过一段时间后,用值为3的byState调用OnKeysPressed。这样就可以很方便的实现多功能键或者检测某键的长时间被按下。

2)由用户自行调用

由用户自行在程序中调用扫描模块,而不是由时钟中断自行调用。其它与方式1相同。

注意:

1)函数KBScanProcess为非阻塞函数,它将在很快的时间内返回,等待再次分配给它执行的机会。

2)函数KBScanProcess是在时钟中断外部运行的,它的过程可以被任何中断打断,但不影响系统运行。

3)byState的最大值为250,之后被复位为零。

应用举例

现在来举例说明上述几个模块的使用方法。

硬件环境描述:

为了控制一盏灯,需要单片机提供一个做控制功能的开关量,这里不描述外部接口电路,只说明当单片机的P10脚为高电平时,灯灭,当P10脚为低电平时,灯亮。

可以通过计算机由串口发送命令来控制,或通过一个按键(pus

hbutton不是自锁式的按键)来手动控制(按键接在P11脚上,当键没有按下时,P11电平为高,键按下时,引脚电平被接低),当使用按键手动控制的时候,需要给计算机发送通知。

设定串口通讯指令如下:

数据包由0xff做包头,4个字节长,第二个字节为命令代码,第三个字节为数据,最后一个字节为校验位。

命令和数据代码有如下组合:

(计算机发给单片机)

0x100x01:计算机控制灯亮。(数据位是非零值即可)

0x100x00:计算机控制灯灭。

(单片机发给计算机)

0x110x01:单片机正常执行控制指令,返回。(数据位是非零值即可)

0x110x00:单片机不能够正常执行控制指令,或控制指令错(不明含义的数据包或校验错等)。

0x120x01:手动控制灯亮。(数据位是非零值即可)

0x120x00:手动控制灯灭。建立工程:

在硬盘上建立文件夹Projects,在Projects下建立Common文件夹及Example文件夹。将各模块的头文件及实现文件拷贝到Common文件夹下(推荐使用这样的文件组织结构,其它工程也可以建立在Projects下,各工程共享Common文件夹中的代码)。

启动KeilC的IDE,在Example下建立新工程,将各模块的实现文件包含进工程。

在Example文件夹下建立Output文件夹,更改工程设置,将Output作为输出文件和List文件的输出文件夹(推荐使用这样的结构,当保存工程文件时,可以简单的删除Output文件夹中的内容而不会误删有用的工程文件)。

建立工程配置头文件Config.h及工程主文件Example.c,并将Exmaple.c文件加入工程。

输入代码:

代码的具体编写过程略。下面是最后的Config.h文件及Example.c文件。

//

//file:onfig.h

//

#ifndef_CONFIG_H_

#define_CONFIG_H_

#include//使用AT89C52做控制

#include“../Common/Common.h”//使用自定义的数据类型

#defineTIMER_RELOAD922//11.0592MHz晶振,1ms中断周期

#defineTIMER_KBSCANDELAY40//40ms重检测按键状态,即40ms消抖

#defineSCOMM_AsyncInterface//使用异步通讯服务

#defineIsPackageHeader(x)((x)==0xff)//判断包头是不是0xff

#defineIsPackageTailer(x,y,z)((y)<=(z))//判断包的长度是不是足够

#endif//_CONFIG_H_

//

//file:xample.c

//

#include

#include“../Common/Common.h”

#include“../Common/Timer.h”

#include“../Common/Scomm.h”

#include“../Common/KBScan.h”

BITgbitLampState=1;//灯的状态,缺省为off

staticvoidInitialize()

{

InitTimerModule();//初始化时钟模块

InitSCommModule(0xfd,TRUE);//初始化通讯模块,11.0592MHz晶振,

//波特率为19200

EA=1;//开中断

}

voidmain()

{

Initialize();//初始化

while(TRUE)//主循环

{

ImpTimerService();//实现时钟中断服务,如键盘扫描

AsyncRecePackage(4);//接收4个字节长的数据包

}

}

//在中断外部响应时钟中断事件

voidOnTimerEvent()

{

//donothing

}

//控制外部灯

staticvoidTriggerLamp(BITbEnable)

{

P10=~bEnable;//需要反相控制

}

//键扫描回调函数

BYTEKBScan()

{

BITb;

P11=1;//读之前拉高引脚电平

b=P11;//读入引脚状态

return~b;//数据反相做扫描码

}

//计算校验和

staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)

{

BYTEby,bySum=0;

for(by=0;by

return0–bySum;

}

//接收到键盘消息回调函数

voidOnKeyPressed(BYTEbyvalue,BYTEbyState)

{

BYTEby[4];

if(byState==0)

{

switch(byvalue)

{

case0x01:

gbitLampState=~gbitLampState;//灯状态取反

TriggerLamp(gbitLampState);//执行控制

by[0]=0xff;//构造数据包

by[1]=0x12;

by[2]=(BYTE)gbitLampState;

by[3]=CalcCheckSum(by,3);//求校验和

SendPackage(by,4);//发送数据包

break;

//处理其它扫描码

default:

break;

}

}

//接收到数据包回调函数

voidOnRecePackage(BYTE*pbyBuf,BYTEbyBufLen)

{

BYTEby[4];

by[0]=0xff;

by[1]=0x11;

if(byBufLen!=4||pbyBuf[3]!=CalcCheckSum(pbyBuf,3))

{

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//处理长度或校验和不正确

}

switch(pbyBuf[1])

{

case0x10:

gbitLampState=(BIT)pbyBuf[2];

TriggerLamp(gbitLampState);

by[2]=1;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//发送成功执行通知

break;

default://不知道的命令

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//发送没有成功执行通知

break;

}

}

4.课程设计单独计算成绩,考评方法见其大纲。

三、理论考试说明

1.单片机技术及应用理论考试,采用闭卷笔试形式,考试时间120分钟。

2.期末考试试题根据教学大纲,其范围和难度按照本方案中制订的考试考核内容和要求确定。考试命题覆盖考试大纲要求范围。

3.期末考试试题类型有以下几种:

①填空题;

②选择题;

③判断题;

④简答题⑤综合应用题。

四、考试考核要求层次

按照教学大纲的要求,理论考试要求分为掌握、理解和了解三个层次。

掌握:

对于本课程的重点内容要求学生达到掌握的程度。即能够全面、深入理解和熟练掌握所学内容,并能够用其分析、初步设计和解答与应用相关的问题,能够举一反三。要求学生掌握的内容也就是考试的主要内容,在考试中所占比例约70。

理解:

对于本课程的一般内容要求学生能够理解。即要求学生能够较好地理解所学内容,并且对所涉及的内容能够进行简单分析和判断。要求学生理解的内容也是考试的内容,在考试中所占比例约25。

了解:

对于本课程的次要内容要求学生能够了解。要求学生了解的内容,一般是指在眼下不必进一步深入和扩展,有些也许需要学生自己今后在工作中进行深入研究。对要求了解的内容,在考试中占较小比例,不超过5。实验五:按键电路、显示电路实验一、实验目的:1.掌握独立式按键电路与矩阵式按键电路的设计方法。2.掌握数码管显示电路的工作原理3.掌握源程序编辑软件UltraEdit,编译软件KeilC51、仿真软件Proteus的使用方法4.掌握硬件仿真器ME-52A的使用方法二、实验器材:1.单片机实验板2.单片机硬件仿真器ME-51A3.计算机4.电源三、实验要求:1.电路如图5所示,用单片机的P3口所接的四个独立式按键控制p1口流水灯花样的方法;具体表现为:p3.0、P3.1、P3.2、P3.3四个小按键分别实现了四个控制:(1)跑灯:即P1.0---1.7亮点流动:(2)流水灯:即P1.0-1.7依次点亮(3)交叉闪烁:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7轮流点亮(4)停止;在任何状态下按此键程序停止运行.2.电路如图6所示,用P2口所接的4×4矩阵式键盘作为输入,在P1口所接的数码管上显示出每个按键的0~F序号,键盘的布局如下表所示:FEDCBA9876543210四、实验原理:1.独立式按键电路显示如图5所示,从图中可看出,判断有无键按下,只要检测P3.0~P3.3相应端口的高低电平即可,若检测有某一端口为低电平,表明该端口有按键按下,经延时消抖后转去执行相应的功能子程序。若为高电平,表明无键按1.独立式按键电路如图5所示,下,继续检测。示例程序如下:ORG000HLJMPSTAR1ORG0030HSTAR1:MOVP3,#0FFH;置P3口为输入态JNBP3.0,FUN0;判别P3.0是否有键按下,是,则转FUN0JNBP3.1,FUN1;判别P3.1是否有键按下,是,则转FUN1JNBP3.2,FUN2;判别P3.2是否有键按下,是,则转FUN2JNBP3.3,FUN3;判别P3.3是否有键按下,是,则转FUN3JNBF0,STAR1;曾经有键按下F0置1RET图5FUN0:LCALLDL10MS;消岸抖动JBP3.0,STAR1WAITL0:JNBP3.0,WAITL0;等待键释放SETBF0FUN01:LCALLFUN00LCALLSTAR1LJMPFUN01FUN1:LCALLDL10MS;消岸抖动JBP3.1,STAR1WAITL1:JNBP3.1,WAITL1;等待键释放SETBF0FUN10:LCALLFUN11LCALLSTAR1LJMPFUN10FUN2:LCALLDL10MS;消岸抖动JBP3.2,STAR1WAITL2:JNBP3.2,WAITL2;等待键释放SETBF0FUN20:LCALLFUN22LCALLSTAR1LJMPFUN20FUN3:LCALLDL10MS;消岸抖动JBP3.3,STAR1WAITL3:JNBP3.3,WAITL3;等待键释放CLRF0MOVP1,#0FFH;关显示LJMPSTAR1FUN00:MOVA,#0FEH;跑灯子程序FUN000:MOVP1,ALCALLDL05SJNBACC.7,OUTRLAAJMPFUN000OUT:RETFUN11:MOVA,#0FEH;流水灯子程序FUN111:MOVP1,ALCALLDL05SJZOUTRLAANLA,P1AJMPFUN111FUN22:MOVA,#0AAH;交叉点亮子程序MOVP1,ALCALLDL30SCPLAMOVP1,ALCALLDL30SRET;____________;;延时程序;;____________;DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RETDL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RETDL05S:MOVR4,#0AHLOOP3:LCALLDL10MSDJNZR4,LOOP3RETDL30S:MOVR5,#03HLOOP4:LCALLDL05SDJNZR5,LOOP4RETEND2.矩阵式按键电路显示如图6所示。采用扫描方式进行按键的识别检测,并将对应按键的键号用查表指令将对应的代码显示在数码管上。图6参考程序如下:ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60H;设置堆栈指针SCAN:MOVR3,#0F7H;置行扫描初值MOVR1,#00H;到TABLE表中取码的指针SCAN1:MOVA,R3MOVP2,A;扫描输出MOVA,P2;重读P2口状态MOVR4,A;暂存于R4吕中SETBC;C=1MOVR5,#03H;扫描4列初值L1:RLCA;A中内容循环左移JNCKEYIN;C=0,有键按下,转消抖INCR1;取码指针加1DJNZR5,L1;无键按下,继续检测MOVA,R3;扫描下一行SETBCRRCAMOVR3,AJCSCAN1;4行是否扫描完,未完,继续LJMPSCANKEYIN:MOVR7,#10;削除抖动D2:MOVR6,#248DJNZR6,$DJNZR7,D2D3:MOVA,P2;按键放开否?XRLA,R4JZD3MOVA,R1MOVDPTR,#TABLE;到TABLE中取码MOVCA,@A DPTRMOVP1,ALJMPSCANTABLE:DB0C0H,0F9H,0A4H,0B0H,80H,90H,88H,83H,0C6H,0A1H,86H,8EHENDDB80H,90H,88H,83HDB0C6H,0A1H,86H,8EHEND五、实验步骤:1.运行UltraEdit-32源程序编辑软件,输入、编辑汇编语言源程序。2.运行KeiluVision2源程序编译软件,对源程序进行编译,得到目标代码文件。3.运行Proteus模拟仿真软件,打开已绘制好的仿真电路原理图,进行模拟 仿真。4.把硬件仿真器ME-52A与单片实验板连接好,再用硬件仿真器进行仿真验证。六、实验分析与总结1.用仿真系统调试简单程序结构、分支程序结构、循环程序结构、子程序结构和中断结构的关键在于,如何将对程序的分析理解和开发系统提供的基本功能有机地结合起来,其前提条件是必须对源程序的作用、结构特点、运行过程与结果有较全面的认识,并能根据程序运行过程中出现的现象和结果分析并判断产生各种故障现象的原因,再运用排除法逐一检验各种判断是否准确。2.掌握程序结构特点的基础上,合理选择观测点,通过观察在观测点处参数及路径的变化检验程序运行的结果。3.高调试程序的效率,应对单片机开发系统所提供的几种程序运行调试方式有足够的了解并能熟练地运用。例如,在调试过程中,若要观察最终结果,则可选择全速运行调试;若要观察相关指令的运行结果或运行路径的变化过程,则可选择单步运行;若要检查子程序的运行过程,则可选择跟踪运行调试;若要检查循环程序或中断服务程序,则可选择断点运行调试;若要定点检查程序运行到某处的结果时,则可选择快速运行到光标处调试。但实际中究竟选用哪种方法更适宜或哪几种方法结合使用更快捷,将随着分析能力与操作的熟练程度逐步提高。4.程序运行结果是否正确时,应运用单片机开发系统所提供的交互界面,将程序运行过程中程序计数器PC(地址)的变化、各单元(内部RAM和外部RAM)内容的变化、特殊功能寄存器内容的变化、堆栈指针SP内容的变化与程序的理论分析结果相对照。5.程序和调试程序时,需要多次反复的过程,并非一次就能排除全部故障,特别是单片机应用系统的硬件电路和汇编程序相结合的综合调试就更加复杂,因此,必须通过反复调试,不断修改硬件和软件,直到最终符合设计要求为止。如果在调试中能够根据实验现象预先对产生故障的原因加以判断和分析,并制定出相应的调试方法和步骤,可缩小排除故障的范围,提高调试效率。七、思考与练习填空题

1、设X=5AH,Y=36H,则X与Y“或”运算为__7EH_______,X与Y的“异或”运算为___6CH_____。

2、若机器的字长为8位,X=17,Y=35,则X+Y=__110100_____,X-Y=_11101110______(要求结果写出二进制形式)。

3、单片机的复位操作是____高电平______(高电平/低电平),单片机复位后,堆栈指针SP的值是___07h_____。

4、单片机中,常用作地址锁存器的芯片是__74HC373____________,常用作地址译码器芯片是_____74HC138____________。

5、若选择内部程序存储器,应该设置为_____高_______(高电平/低电平),那么,PSEN信号的处理方式为___不用__________________。

6、单片机程序的入口地址是____0000H__________,外部中断1的入口地址是______0013H_________。

7、若采用6MHz的晶体振荡器,则MCS-51单片机的振荡周期为__0.5us_______,机器周期为_____2us__________。

8、扩展芯片的选择方法有两种,它们分别是___线选法_______________和_____译码法__________。

9、单片机的内部RAM区中,可以位寻址的地址范围是____20H~2FH______________,特殊功能寄存器中,可位寻址的地址是___是能被8整除的地址_________________。

10、子程序返回指令是___ret______,中断子程序返回指令是__reti。

11、8051单片机的存储器的最大特点是内部RAM与外部RAM分开编址。

12、8051最多可以有32个并行输入输出口,最少也可以有8个并行口。

13、函数是C语言的基本单位。

14、串行口方式2接收到的第9位数据送SCON寄存器的RB8位中保存。

15、MCS-51内部提供3个可编程的16位定时/计数器,定时器有4种工作方式。

16、一个函数由两部分组成,即说明部分和语句部分。

17、串行口方式3发送的第9位数据要事先写入SCON寄存器的TB8位。

18、利用8155H可以扩展3个并行口,256个RAM单元。

19、C语言中输入和输出操作是由库函数scanf和printf等函数来完成。

二、选择题

1、C语言中最简单的数据类型包括(B)。

A、整型、实型、逻辑型B、整型、实型、字符型

C、整型、字符型、逻辑型D、整型、实型、逻辑型、字符型

2、当MCS-51单片机接有外部存储器,P2口可作为(C)。

A、数据输入口B、数据的输出口

C、准双向输入/输出口D、输出高8位地址

3、下列描述中正确的是(D)。

A、程序就是软件B、软件开发不受计算机系统的限制

C、软件既是逻辑实体,又是物理实体D、软件是程序、数据与相关文档的集合

4、下列计算机语言中,CPU能直接识别的是(D)。

A、自然语言B、高级语言C、汇编语言D、机器语言

5、MCS-5l单片机的堆栈区是设置在(C)中。

A、片内ROM区B、片外ROM区C、片内RAM区D、片外RAM区

6、以下叙述中正确的是(C)。

A、用C语言实现的算法必须要有输入和输出操作

B、用C语言实现的算法可以没有输出但必须要有输入

C、用C程序实现的算法可以没有输入但必须要有输出

D、用C程序实现的算法可以既没有输入也没有输出

7、定时器/计数器工作方式1是(D)。

A、8位计数器结构B、2个8位计数器结构

C、13位计数结构D、16位计数结构

8、C语言提供的合法的数据类型关键字是(B)。

A、DoubleB、shortC、integerD、Char

9、片内RAM的20H~2FH为位寻址区,所包含的位地址是(B)。

A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH

10、以下能正确定义一维数组的选项是(B)。

A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};

C、chara={’A’,’B’,’C’};D、inta[5]="0123";

11、数据的存储结构是指(D)。

A、存储在外存中的数据B、数据所占的存储空间量

C、数据在计算机中的顺序存储方式D、数据的逻辑结构在计算机中的表示

12、下列关于栈的描述中错误的是(C)。

A、栈是先进后出的先性表B、栈只能顺序存储

C、栈具有记忆作用D、对栈的插入和删除操作中,不需要改变栈底指针

13、在寄存器间接寻址方式中,间址寄存器中存放的数据是(B)。

A、参与操作的数据B、操作数的地址值

C、程序的转换地址D、指令的操作码

14、MCS-51单片机的复位信号是(A)有效。

A、高电平B、低电平C、脉冲D、下降沿

15、为了使模块尽可能独立,要求(B)。

A、模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强

B、模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱

C、模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱

D、模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强

16、若MCS-51单片机使用晶振频率为6MHz时,其复位持续时间应该超过(B)。

A、2μsB、4μsC、8μsD、1ms

17、以下选项中可作为C语言合法常量的是(A)

A、-80B、-080C、-8e1.0D、-80.0e

18、能够用紫外光擦除ROM中程序的只读存储器称为(C)。

A、掩膜ROMB、PROMC、EPROMD、EEPROM

19、以下不能定义为用户标识符是(D)。

A、MainB、_0C、_intD、sizeof

20、下选项中,不能作为合法常量的是(B)。//幂不能为小数

A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0

21、以下叙述中错误的是(C)

A、对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B、数组名代表的是数组所占存储区的首地址,其值不可改变

C、当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息

D、可以通过赋初值的方式确定数组元素的个数

22、以下与函数fseek(fp,0L,SEEK_SET)有相同作用的是(D)

A、feof(fp)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

23、存储16×16点阵的一个汉字信息,需要的字节数为(A)

A、32B、64C、128D、256

24、已知1只共阴极LED显示器,其中a笔段为字形代码的最低位,若需显示数字1,则它的字形代码应为(B)。

A、06HB、F9HC、30HD、CFH

25、在C语言中,合法的长整型常数是(A)

A、OLB、4962710C、324562&D、216D

26、以下选项中合法的字符常量是(B)

A、"B"B、’\010’C、68D、D

27、若PSW.4=0,PSW.3=1,要想把寄存器R0的内容入栈,应使用(D)指令。

A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H

28、在片外扩展一片2764程序存储器芯片要(B)地址线。

A、8根B、13根C、16根D、20根

29、设MCS-51单片机晶振频率为12MHz,定时器作计数器使用时,其最高的输入计数频率应为(C)

A、2MHzB、1MHzC、500kHzD、250kHz

30、下列数据字定义的数表中,(A)是错误的。

A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH

三、判断题

(√)1、在对某一函数进行多次调用时,系统会对相应的自动变量重新分配存储单元。

(×)2、在C语言的复合语句中,只能包含可执行语句。

(√)3、自动变量属于局部变量。

(×)4、Continue和break都可用来实现循环体的中止。

(√)5、字符常量的长度肯定为1。

(×)6、在MCS-51系统中,一个机器周期等于1.5μs。

(√)7、C语言允许在复合语句内定义自动变量。

(√)8、若一个函数的返回类型为void,则表示其没有返回值。

(×)9、所有定义在主函数之前的函数无需进行声明。

(×)10、定时器与计数器的工作原理均是对输入脉冲进行计数。

(×)11、END表示指令执行到此结束。

(√)12、ADC0809是8位逐次逼近式模/数转换接口。

(√)13、MCS-51的相对转移指令最大负跳距是127B。

(×)14、MCS-51的程序存储器只是用来存放程序的。

(√)15、TMOD中的GATE=1时,表示由两个信号控制定时器的的启停。

(×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范围内。

(×)17、MCS-51系统可以没有复位电路。

(×)18、片内RAM与外部设备统一编址时,需要专门的输入/输出指令。

(√)19、锁存器、三态缓冲寄存器等简单芯片中没有命令寄存和状态寄存等功能。

(√)20、使用8751且=1时,仍可外扩64KB的程序存储器。

四、简答题

1、在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?

答:(1)确定T/C的工作方式——编程TMOD寄存器;

(2)计算T/C中的计数初值,并装载到TH和TL;

(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器;

(4)启动定时器/计数器——编程TCON中TR1或TR0位。

2、什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方?

答:多个函数可以同时使用的函数,称为重入函数。

通常情况下,C51函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。

重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。

3、8051引脚有多少I/O线?他们和单片机对外的地址总线和数据总线有什么关系?地址总线和数据总线各是几位?

答:8051引脚共有40个引脚,8051的地址总线由P2和P0口提供,P2口是地址总线的高8位,P0口是地址总线的低8位;数据总线由P0口提供;P0口的地址总线和数据总线是分时进行的,P0口的地址总线需要外接地址锁存器完成地址锁存。

地址总线共16位,数据总线是8位。

4、在有串行通信时,定时器/计数器1的作用是什么,怎样确定串行口的波特率?

答:在有串行通信时,定时器/计数器1的作用是串行口发生器。

串行口的波特率根据串行口的工作方式具有不同的计算方式:

方式0的波特率固定为晶体振荡器的十二分之一;

方式1的波特率=2SMOD.(定时器1的溢出率)/32;

方式2波特率=2SMOD.(fosc/64);

方式3波特率同方式1(定时器l作波特率发生器)。

5、如何消除键盘的抖动?怎样设置键盘中的复合键?

答:由于按键是机械开关结构,所以当用手按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但通常不会大于10ms。

若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约10ms后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟10ms后再扫描处理并不迟。

复合键可以仿照计算机复合键的处理方法,通常可以假设一个键具有复合功能,再与其它减的键值组合成复合键。1、矩阵式键盘的结构与工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。

2、矩阵式键盘的按键识别方法

确定矩阵式键盘上何键被按下介绍一种“行扫描法”。

行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。

1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为 高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

下面给出一个具体的例子:

图仍如上所示。8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源 5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。

1、检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。

2、去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。

3、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:

P1.71110

P1.61101

P1.51011

P1.40111

在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值

4、为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。

键盘扫描程序:

从以上分析得到键盘扫描程序的流程图如图2所示。程序如下

SCAN:MOVP1,#0FH

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT1

SJMPNEXT3

NEXT1:ACALLD20MS

MOVA,#0EFH

NEXT2:MOVR1,A

MOVP1,A

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,KCODE;

MOVA,R1

SETBC

RLCA

JCNEXT2

NEXT3:MOVR0,#00H

RET

KCODE:MOVB,#0FBH

NEXT4:RRCA

INCB

JCNEXT4

MOVA,R1

SWAPA

NEXT5:RRCA

INCB

INCB

INCB

INCB

JCNEXT5

NEXT6:MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT6

MOVR0,#0FFH

RET

键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。

到本课为止,本站教程暂告一个段落!感谢大家的关心和支持!矩阵按键部分由16个轻触按键按照4行4列排列,连接到JP50端口。将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.判断键盘中有无键按下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。下面给出一个具体的例子:电路图路径:G:\图片\电路图片\xl100097.jpg8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。1.检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。2.去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。3.若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:P1.71110P1.61101P1.51011P1.40111在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。4.为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。实验目的:通过XL1000的16位矩阵按键,在数码管上分别显示0---9,A,B,C,D,E,F。接线方法:1用一条8PIN数据排线,把矩阵按键部份的JP50,接到CPU部份的P1口JP44.2接8位数码管的数据线。将数码管部份的数据口JP5接到CPU部份的P0口JP51.3接8位数码管的显示位线。将数码管部份的显示位口JP8接到CPU部份的P2口JP52.参考程序:;本程序实现扫描按键显示功能.;分别按16个键盘显示分别显示数字123A456B789C*0#D;键盘口P1,数码管显示第二位p21,数码管段位p0口org0000hajmpmainorg0030hmain:movdptr,#tab;将表头放入DPTRlcallkey;调用键盘扫描程序movca,@a dptr;查表后将键值送入ACCmovp0,a;将Acc值送入P0口CLRP2.1;开显示ljmpmain;返回反复循环显示KEY:LCALLKS;调用检测按键子程序JNZK1;有键按下继续LCALLDELAY2;无键按调用延时去抖AJMPKEY;返回继续检测按键K1:LCALLDELAY2LCALLDELAY2;有键按下延时去抖动LCALLKS;再调用检测按键程序JNZK2;确认有按下进行下一步AJMPKEY;无键按下返回继续检测K2:MOVR2,#0EFH;将扫描值送入R2暂存MOVR4,#00H;将第一列值送入R4暂存K3:MOVP1,R2;将R2的值送入P1口L6:JBP1.0,L1;P1.0等于1跳转到L1MOVA,#00H;将第一行值送入ACCAJMPLK;跳转到键值处理程序L1:JBP1.1,L2;P1.1等于1跳转到L2MOVA,#04H;将第二行的行值送入ACCAJMPLK;跳转到键值理程序进行键值处理L2:JBP1.2,L3;P1.2等于1跳转到L3MOVA,#08H;将第三行的行值送入ACCAJMPLK;跳转到键值处理程序L3:JBP1.3,NEXT;P1.3等于1跳转到NEXT处MOVA,#0cH;将第四行的行值送入ACCLK:ADDA,R4;行值与列值相加后的键值送入APUSHACC;将A中的值送入堆栈暂存K4:LCALLDELAY2;调用延时去抖动程序LCALL KS;调用按键检测程序JNZK4;按键没有松开继续返回检测POPACC;将堆栈的值送入ACCRETNEXT:INCR4;将列值加一MOVA,R2;将R2的值送入AJNBACC.7,KEY;扫描完至KEY处进行下一扫描RLA;扫描未完将A中的值右移一位进行下一列的扫描MOVR2,A;将ACC的值送入R2暂存AJMPK3;跳转到K3继续KS:MOVP1,#0FH;将P1口高四位置0低四位值1MOVA,P1;读P1口XRLA,#0FH;将A中的值与A中的值相异或RET;子程序返回DELAY2:;40ms延时去抖动子程序MOVR5,#08HL7:MOVR6,#0FAHL8:DJNZR6,L8DJNZR5,L7RETtab:db28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh;0h0hc9878654a321轮流显示键盘因为无法表达*#就用H表示,B用8表示end这是我做成功的4X4键盘扫描源程序,P1.0-P1.3做四根列线,P1.4-P1.7做四根行线。

数码管的字型表是按照标准接法做的,按对应的按键数码管显示对应的数字。

以下是源程序:

KEYBUFEQU30H

ORG00H

START:MOVKEYBUF,#2

MOVP2,#00001111B

WAIT:

MOVP1,#0FFH

CLRP1.4

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK1

MOVKEYBUF,#0

LJMPDK1

NK1:CJNEA,#0DH,NK2

MOVKEYBUF,#1

LJMPDK1

NK2:CJNEA,#0BH,NK3

MOVKEYBUF,#2

LJMPDK1

NK3:CJNEA,#07H,NK4

MOVKEYBUF,#3

LJMPDK1

NK4:NOP

DK1:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK1A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK1A

NOKEY1:

MOVP1,#0FFH

CLRP1.5

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK5

MOVKEYBUF,#4

LJMPDK2

NK5:CJNEA,#0DH,NK6

MOVKEYBUF,#5

LJMPDK2

NK6:CJNEA,#0BH,NK7

MOVKEYBUF,#6

LJMPDK2

NK7:CJNEA,#07H,NK8

MOVKEYBUF,#7

LJMPDK2

NK8:NOP

DK2:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK2A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK2A

NOKEY2:

MOVP1,#0FFH

CLRP1.6

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK9

MOVKEYBUF,#8

LJMPDK3

NK9:CJNEA,#0DH,NK10

MOVKEYBUF,#9

LJMPDK3

NK10:CJNEA,#0BH,NK11

MOVKEYBUF,#10

LJMPDK3

NK11:CJNEA,#07H,NK12

MOVKEYBUF,#11

LJMPDK3

NK12:NOP

DK3:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK3A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK3A

NOKEY3:

MOVP1,#0FFH

CLRP1.7

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK13

MOVKEYBUF,#12

LJMPDK4

NK13:CJNEA,#0DH,NK14

MOVKEYBUF,#13

LJMPDK4

NK14:CJNEA,#0BH,NK15

MOVKEYBUF,#14

LJMPDK4

NK15:CJNEA,#07H,NK16

MOVKEYBUF,#15

LJMPDK4

NK16:NOP

DK4:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK4A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK4A

NOKEY4:

LJMPWAIT

DELY10MS:

MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

TABLE:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0-9

DB088H,083H,0C6H,0A1H,086H,08EH,089H,0CFH,0C7H,0C8H;A,B,C,D,E,F,H,I,L,N,

END;P3.1数据采集控制

;P2.6P2.7个位十位显示转换控制

;P1口接8个开关模拟数据

;P1.0-P1.3为个位开关量输入

;P1.4-P1.7为十位开关量输入

;此程序仅供参考

;功能P1口接8个开关输入量4个一组,分别为个位,十位输入

;P0口接一个数码管,依次显示输入量。P3.1控制是否读入

;开关量。P2.6P2.7控制是否显示个位或十位

ORG100h

LJMPSTAR

STAR:MOVP1,#0FFH

SETBP3.1数据读入标志

MOVR0,#100,循环工作次数

LOOP:JBP3.1,$P3.1低电平时,采集P1口数据开关量处理显示阶段不再应答P3.1

MOVA,P1

PUSHACC

ANLA,#0FH取个位数值

MOVR1,A个位数值保存到R1

POPACC

ANLA,#0F0H

SWAPA高4位转成字节信息

MOVR2,A十位数值保存到R2

MOVDPTR,#TABLED

MOVA,R1

MOVCA,@A DPTR

MOVP0,A

CLRP2.6个位显示

ACALLDELAY500MS

SETBP2.6

MOVA,R2

MOVCA,@A DPTR

MOVP0,A

CLRP2.7十位显示

ACALLDELAY500MS

SETBP2.7

DJNZR0,LOOP

DELAY500MS:延时500毫秒子程略

RET

TABLED:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

DB80H,90H,88h,83h,0c6h,0a1h,86h,8eh

END#include

typedefunsignedcharBYTE;

BYTEcodeTABLED[16]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0X0f8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};

BYTEDATled;

sbitP26=P2^6;

sbitP27=P2^7;

sbitP31=P3^1;

intTIME;

voidtimedelay(DTIME)

intDTIME;

{

intI;

for(I=0;I<=DTIME;I );

}

voidmain()

{

intTEMP;

P26=1;

P27=1;

P31=1;

P1=0xFF;

TIME=1000;

while(1){

while(P31==0){

DATled=P1;

TEMP=DATled&0x0f4;

P0=TABLED[TEMP];

P27=0;

timedelay(TIME);

P27=1;

}

}

}1.实验任务在8X8 LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。2.电路原理图图4.24.13.硬件电路连线(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上;(2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;4.程序设计内容(1).8X8 点阵LED工作原理说明8X8点阵LED结构如下图所示图4.24.2从图4.24.2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:一根竖柱:对应的列置1,而行则采用扫描的方法来实现。一根横柱:对应的行置0,而列则采用扫描的方法来实现。5.汇编源程序

ORG00H

START:NOP

MOVR3,#3

LOP2:MOVR4,#8

MOVR2,#0

LOP1:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

INCR2

LCALLDELAY

DJNZR4,LOP1

DJNZR3,LOP2

MOVR3,#3

LOP4:MOVR4,#8

MOVR2,#7

LOP3:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

DECR2

LCALLDELAY

DJNZR4,LOP3

DJNZR3,LOP4

MOVR3,#3

LOP6:MOVR4,#8

MOVR2,#0

LOP5:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

INCR2

LCALLDELAY

DJNZR4,LOP5

DJNZR3,LOP6

MOVR3,#3

LOP8:MOVR4,#8

MOVR2,#7

LOP7:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

DECR2

LCALLDELAY

DJNZR4,LOP7

DJNZR3,LOP8

LJMPSTART

DELAY:MOVR5,#10

D2:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABA:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

TABB:DB01H,02H,04H,08H,10H,20H,40H,80H

END

6.C语言源程序

#include

unsignedcharcodetaba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f0;j--);

}

voidmain(void)

{

unsignedchari,j;

while(1)

{

for(j=0;j<3;j )

//fromlefttoright3time

{

for(i=0;i<8;i )

{

P3=taba[i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromrighttoleft3time

{

for(i=0;i<8;i )

{

P3=taba[7-i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromtoptobottom3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[7-i];

delay1();

}

}

for(j=0;j<3;j )

//frombottomtotop3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[i];

delay1();

}

}

}

}LED点阵显示实验一.实验要求

编程实现中英文字符的显示。

二.实验目的

1.了解LED点阵显示的基本原理和实现方法。

2.掌握点阵汉字库的编码和从标准字库中提取汉字编码的方法。

三.实验电路及连线

点阵显示模块WTD3088的(红色)列输入线接至内部LED的阴极端,行输入线接至内部LED的阳极端(若阳极端输入为高电平,阴极端输入低电平,则该LED点亮)。发光点的分布如图22-0所示。

Fig22-0WTD3088LED分布

如图22-1示,本实验模块使用74LS374来控制列输入线的电平值。将74LS374的某输出置0,则对应的LED阴极端被置低。如图22-2示,本实验模块使用74LS273来控制行输入线,并通过9013提供电流驱动。将74LS273的某输出置1,则对应的LED阳极端被置高。每次系统重新开启或总清后,74LS273输出为全0,LED显示被关闭。

通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。

Fig22-1LED模块及列扫描电路Fig22-2行扫描电路

Fig22-3地址译码电路

本实验模块使用4块WTD3088组成16×16点阵,以满足汉字显示的要求。为了方便的控制四个单元,使用了一片74LS139译码,产生四个地址片选信号:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的两片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的两片74LS374。

实验接线:按示例程序,模块的CSLED接51/96地址的8000H。

四.实验说明

使用高亮度LED发光管构成点阵,通过编程控制可以显示中英文字符、图形及视频动态图形。LED显示以其组构方式灵活、亮度高、技术成熟、成本低廉等特点在证券、运动场馆及各种室内/外显示场合得到广泛的应用。

所显示字符的点阵数据可以自行编写(即直接点阵画图),也可从标准字库(如ASC16、HZ16)中提取。后者需要正确掌握字库的编码方法和字符定位的计算。

实验盘片中“字符转换”子目录下提供的Basc16.exe,BHz16.exe可方便的将单个字符的码表从标准字库Asc16,Hzk16中提取出来。具体使用方法是运行上述可执行程序,根据提示输入所需字符(如是汉字还需要先启动dos下的汉字环境,如ucdos,pdos95等)。程序将该字符的码表提取出来,存放在该字符ASC或区位码为文件名称的.dat文件中。用户只需将该文件中内容拷贝、粘贴到自己的程序中即可。但需要注意字节排列顺序、字节中每一位与具体显示点的一一对应关系,必要时还要对码表稍作修改。同一目录下还提供了上述可执行程序的源文件,使用BC3.1编写,供用户参考。

五.实验程序框图

用户应留心其中行扫描的实现及码表的处理。

六.实验程序:(一)提供LEDA51演示Asc16字符的简单点阵显示。

;________*LED点阵显示示例程序______________________*

;__该程序显示Asc16字符__

;__为了简单起见,程序只显示一个字符__

;__该程序针对T598实验机的模块14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQUCSLED 2H;列1374

CSC2EQUCSLED 3H;列2374

ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;关闭行

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;关闭列

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H;每次为单行扫描

DISP:

MOVA,R5

MOVDPTR,#ASCE;此处设定所要显示的字符

MOVCA,@A DPTR

CPLACC;代码取反,决定显示的阴阳

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

MOVDPTR,#ASCE

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延时子程序,协调字符显示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符点阵字库______________*

;ASC16字符编码排列

;0

;1

;|

;|

;14

;15

;高位D7--D0

;请注意编码的排列次序和实际显示点阵分布的关系

ASCA:DB00H,00H,10H,38H,6CH,0C6H,0C6H,0FEH

DB0C6H,0C6H,0C6H,0C6H,00H,00H,00H,00H

ASCE:DB00H,00H,0FEH,66H,62H,68H,78H,68H

DB60H,62H,66H,0FEH,00H,00H,00H,00H

ASCD:DB00H,00H,0F8H,6CH,66H,66H,66H,66H

DB66H,66H,6CH,0F8H,00H,00H,00H,00H

ASCK:DB00H,00H,0E6H,66H,66H,6CH,78H,78H

DB6CH,66H,66H,0E6H,00H,00H,00H,00H

;____________________________________________________

END

(二)LEDHZ51两个示例程序。和Hz16字符的简单点阵显示。

;________*LED点阵显示示例程序______________________*

;__该程序显示hz16字符__

;__为了简单起见,程序只显示一个字符__

;__该程序针对T598实验机的模块14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQU CSLED 2H;列1374

CSC2EQUCSLED 3H;列2374

ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;关闭LED显示

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;关闭LED显示

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H

DISP:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延时子程序,协调字符显示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符点阵字库______________*

;HZ16字符编码排列

;01

;23

;|

;|

;2829

;3031

;高位D7--D0

HZAI:DB00H,78H,3FH,80H,11H,10H,09H,20H

DB7FH,0FEH,42H,02H,82H,04H,7FH,0F8H

DB04H,00H,07H,0F0H,0AH,20H,09H,40H

DB10H,80H,11H,60H,22H,1CH,0CH,08H

HZDI:DB00H,80H,40H,80H,20H,88H,2FH,0FCH

DB08H,88H,08H,88H,0E8H,88H,2FH,0F8H

DB28H,88H,28H,88H,28H,88H,2FH,0F8H

DB28H,08H,50H,06H,8FH,0FCH,00H,00H

HZKE:DB01H,00H,01H,04H,0FFH,0FEH,01H,00H

DB01H,10H,1FH,0F8H,10H,10H,10H,10H

DB10H,10H,1FH,0F0H,14H,50H,04H,40H

DB04H,40H,08H,42H,10H,42H,60H,3EH

;____________________________________________________

END基于89C51的计算机可锁定加密键盘设计摘要:介绍PC键盘和键盘接口的PS/2通信协议,以及用89C51实现可锁定键盘的软件和硬件设计方法。具有安全可靠、容错能力强、可以直接采用标准键盘进行改装、便于实现等优点,并保留标准键盘的全部功能。关键词:PS/289C51C51键盘引言

在智能仪器、自动控制等领域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。为适应开放式、模块化的要求,嵌入式PC具有标准的PC接口,如VGA显示器控制接口、以太网接口、RS232接口、PC/AT键盘接口等。所以,可以用标准的PC键盘对嵌入式PC进行操作与控制。键盘在输入指令之后,可能很长一段时间不用。为计算机安全和防止误触发,需要将键盘锁定,还要对某些键采取屏蔽措施,但是PC标准键盘不能满足这些要求。本文介绍一种用89C51设计实现的可锁定加密PC/AT键盘。

1键盘功能及工作原理

PC键盘功能主要有按键识别、去抖、重键处理、发送扫描码、自动重发、接收键盘命令、处理命令等。键盘有编码键盘和非编码键盘。编码键盘程序设计简单,但硬件电路复杂,价格较高;非编码键盘用软件来实现识别键、编码转换、去抖等功能,硬件电路简单,价格便宜。现代微机系统中广泛采用非编码键盘。PC键盘多采用18行×8列的二维矩阵行列结构。采用行扫描法识别按下的按键。2PS/2协议

PS/2协议是外设与主机之间通信的一种同步双向串行协议。在该协议中主机拥有较高的优先级,在一定条件下可以终止外设正在进行的发送过程。PS/2协议采用的传送数据帧的格式为:1位起始位(0)、8位数据位、1位奇偶校验位、1位停止位(1)。数据发送时低位在前,高位在后。外设每收到主机发来的1帧数据,都要紧随该帧的停止位发送一个握手位ACK(0)应答主机。然后,外设还要发1帧应答数据(0xF0),表示外设已经完整地接收到了主机的命令;而主机则不需发送握手位,也不需要发送应答帧。

2.1键盘到PC键盘接口的通信

当时钟线和数据线均为高电平时,允许键盘发送数据,系统将接收数据;当时钟线被拉为低电平时,表明系统禁止数据传输。图1给出了发送时序,包含1个低电平触发的起始位、8位数据位、1个奇校验位和1个高电平的结束位。2.2PC系统到键盘的通信协议

若时钟线出现高电平,数据线出现低电平,表明系统请求发送,键盘准备产生同步时钟脉冲串,并接收数据。包含了1个低电平触发的起始位、8位数据位、1个奇校验位、1个应答位、1个高电平的结束位。图2为时序图。(1)键盘命令及执行过程①FFH:复位键盘。系统通过此软件复位命令使键盘进入程序复位和内部自测试,称为基本保证测试(BAT)。复位键盘的过程如下:a.键盘收到FFH后立即回送ACK(FAH)作答;b.键盘接口收到ACK后,将键盘时钟和数据线置为高电平;c.键盘检测到此状态后开始BAT操作;d.如果BAT正确完成,键盘发送AAH以表示结束,

否则以FDH(或其它任何值)表示诊断有误。②FEH:重新发送。当系统检测到从键盘送来的任何传输错误时,它便向键盘发送FEH命令。键盘接收到此命令后,将重新送出原来的内容。③FDH~F7H:空操作(保留未用)。④F6H:设置缺省值。此命令使键盘所有条件复位到电源接通时的缺省状态,键盘继续扫描。⑤F5H:设置缺省值和停止键盘。此命令使键盘所有条件复位到电源接通时的缺省状态,并停止键盘扫描,等待下一个键盘命令。⑥F4H:启动键盘。键盘接收到此命令后,用ACK(FAH)作答,清除输出缓冲器,并启动键盘开始扫描。⑦F3H:设置拍发速率和延时参数。每当按下任 一键时,键盘以拍发速率连续送出键的接通码,直到键被释放为止。延时参数是指按下一键后,键盘输出的响应时间。

系统缺省设置:拍发速率=10个/s±20,延时=500ms±20。

当要改变设置时可以使用F3H命令,并后跟一个字节的参数。参数定义如表1所列。

表1D7D6D5D4D3D2D1D00CBA

计算拍发速率和响应延时的公式如下:

拍发速率=1/[(8 A)×2B×0.00417](1/s)

响应延时=(1 C)×250(ms)注:缺省的延时参数值为2CH。此命令的执行过程如下:a.键盘收到F3H命令后,用FAH予以响应,并停止扫描和等待随后的参数;b.键盘若收到随后的设置参数,用另一个ACK响应,并按其参数设置新的拍发速率和响应延时,之后重新开始扫描(若键盘原来是开放的);c.键盘若收到FAH命令,但无随后的设置参数,则键盘结束命令设置,并保持原来的拍发速率和响应延时,停止扫描。⑧F2H,F1,EFH:保留未用。⑨F0H:设置键盘扫描码命令。此命令用于设置键盘的扫描码,后跟参数指定三种扫描码的哪一种。键盘复位时,默认扫描码是第二种。⑩EEH:回送命令。此命令用于辅助诊断,要求键盘接收到EEH时也要回送EEH予以响应。若键盘原来是开放的,则继续扫描。EDH:置位/复位LED指示器。键盘右上角有三个LED指示器,分别反映Caps、Num和Scroll三个键的锁定情况。参数字节如表2所列。

表2D7D3D2D1D0保留1=激励CapsLED1=激励NumLED1=激励ScrollLED

此命令执行过程与F3H相似。若命令后跟参数,则按参数设定LED状态并继续扫描。若仅有命令无参数,则不改变LED原状态,并停止扫描。(2)键盘响应键盘在下列四种情况下都会向键盘接口发送数据。①按下任一键,键盘以拍发速率向接口发送键盘接通扫描码。②释放所按下的键,键盘发送断开扫描码。③系统向键盘发送键盘命令后,键盘回送应答。④当用户按键速度超出键盘所能容纳的最大键个数时,键盘做出响应。后三种情况称为键盘响应。响应字节有7个,定义如下。

①FEH:重新发送响应。当键盘收到一个无效的键盘命令,或者检测到奇偶错的键盘命令时,键盘回送响应字节为FEH,要求系统重发键盘命令。②FAH:正常应答。对任何一个有效的键盘命令,键盘回送FAH予以响应。③00H:超限应答。当用户按键速度超出键盘所能容纳的最大键符个数时(16个字节的缓冲器),键盘发送00H。④FDH:诊断故障应答。键盘接受软件复位命令,执行自测试过程中。若检测到故障,则以FDH应答。此时,键盘停止扫描并等待下一个键盘命令。⑤AAH:诊断正常应答。键盘在软件复位过程中,正常完成BAT测试,以AAH应答。⑥FEH:回响命令的应答,对键盘FEH命令的应答。⑦F0H:断开扫描码前缀,键盘对键符按下后释放的应答,第一个字节为F0H,第二个字节为接通扫描码(有几个键例外)。3硬件设计

PC系列键盘采用18行×8列的矩阵行列结构。89C51单片机有4个8位I/O端口,因此可以采用P0、P2口再加上P3口的2个(P3.6和P3.7)作为行扫描线。P1口作为列输入线(如果用P0口作列输入线,必须加上拉电阻)。采用P3.0、P3.1作为数据线和时钟线与PC系统进行通信,用P3.2、P3.4、P3.5控制键盘上的3个指示灯。硬件原理如图3所示。

键盘与计算机通过一个五芯(PS/2接口为六芯)插座相接,4个有效引脚的定义分别是电源(VCC)、地(GND)、串行时钟线(SCK)、串行数据线(SIO)。

4软件设计①消抖及重键处理:通过软件上延时程序来消除抖动;采用后按键优先处理,即多键同时按下时,只重复发送最后按下键的扫描码。②程序包括键盘扫描子程序、发送键码子程序、发送数据子程序、接收命令子程序、定时器1中断服务程序、主程序等。键盘扫描子程序用于扫描键状态,将被按键的位置号存入缓冲器中;发送键码子程序用于将缓冲区键的接通码或断开码发送给计算机键盘接口或者存在键盘密码缓冲区中;发送数据子程序用于将数据发给计算机键盘接口;接收命令子程序用于接收计算机键盘接口发来的键盘命令;定时器1中断服务子程序用于给程序中的延时提供标准时钟,并具有软件看门狗功能,防止软件出现死机现象;主程序用于系统初始化,子程序调度,锁定状态的显示等。

图6发送缓冲区键码子程序流程图

图4~6是主要软件模块的流程图。单片机源程序见本刊网络补充版(.com)。

5结论

本文介绍的PC/AT键盘具有结构简单、设计灵活、安全可靠的特点,可用于标准PC和嵌入式PC。本键盘可以在标准的键盘基础上进行改造,只需换掉原来的控制芯片即可,可节省设计成本。单片机C51编程几个有用的模块(1)KeilC51常用功能模块使用说明

说明

本文档包括单片机系统中常用到的时钟中断、通讯及键盘扫描等模块(见所附源程序)的说明。这些模块使用前后台系统模型。为达到最大的灵活性,需要在用户工程中定义config.h文件,在其中定义各模块可选参数的设置,而不是直接更改源代码。

这些可选内容大部分为宏定义,如果不定义宏相应的功能在编译时被屏蔽,不会增加代码长度。具体可选内容见各模块中的说明。

在Config.h文件中还要包含一个单片机硬件的资源头文件。

各模块使用了定义在Common.h中的一些数据类型。如:BIT(bit)BYTE(unsignedchar)等,具体请参见源程序。

时钟模块

在单片机软件设计中,时钟是重要资源,为了充分利用时钟资源,故设计本时钟模块。本模块使用定时器0,在完成用户指定功能的同时,还能够自动处理一些其它模块中与时钟相关的信息。

时钟模块由声明文件Timer.h以及实现文件Timer.c组成。

用户应该在Config.h中定义宏TIMER_RELOAD来设定定时器0的重装载初值。推荐的定时器0的中断时间大于1毫秒。

在程序的初始化阶段调用时钟模块的初始化函数InitTimerModule()之后,就可以使用时钟模块所以支持的各种功能。具体描述如下:

延时:当用户需要进行一定时间的延时时,可以通过调用Delay()来进行,参数为时钟中断的次数。如时钟中断周期为1ms,想进行100ms的延时,则可以调用Delay(100)。

注意:

如果延时的绝对时间小于时钟中断的周期,则不能够用本方法做到延时。

定时:当程序中需要使用定时功能时,如等待某外部事件,如果在一定时间内发生则继续执行,如果在这段时间内发生,则认为出现错误,转向错误处理机制。

在此推荐一种编程模式,但用户可以用自己认为更合理的方式处理此类问题。

这里简单说明一下关于阻塞式函数及非阻塞式函数。简单说,阻塞式函数就是当检测完成条件,如果不能够完成则等待,如:

voidCheckSomething()

{

//gbitSuccessFlagisaglobalvariable

while(gbitSuccessFlag==FALSE)

{

//donothingbutwaiting

}

}

可以看到,当bitSuccessFlag没有被设置为TRUE时,函数保持等待状态不返回,这样就是阻塞式的函数。

另外一种情况:

BITCheckSomething()

{

if(gbitSuccessFlag==TRUE)

{

//…

returnTRUE;

}

returnFALSE;

}

在这里,如果所检测的事件有没有完成,函数进行检测之后,立刻返回, 通过返回值报告完成情况,如果没有完成,则等待调用者分配再次执行的机会。这样的函数就是非阻塞函数。

在应用定时功能时,首先要将检测函数定义成非阻塞函数。如上面的第二个版本的CheckSomething。

然后下面模式:

BITbitDone=FALSE;

ResetClock();//cleartimerinterrupttimescounter

while(GetClock()

{

if(CheckSomething()==TRUE)

{

bitDone=TRUE;

break;

}

}

if(bitDone==FALSE)

{

//processtimeout

}

或者简单写成:

BITbitDone=FALSE;

ResetClock();

while(GetClock()=(z))

当然,用户也可以将IsPackageHeader和IsPackageTailer定义成为函数,通过BIT类型的返回值来向调用者提供与相应宏相同的信息。

另一种办法需要在Config.h文件中定义宏SCOMM_ComplexPackageFormat。(需要注意的是,不能够同时定义SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否则会造成严重的不可预见性错误。

这时需要提供回调函数QueryPackageFormat,原形如下:

BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);

函数中三个参数的含义与使用简单数据包格式时判断数据包尾的宏的参数相同。

函数通过返回值来通知作为调用者的接收函数对接收到的数据如何处理,但目前这种方法仅为需要处理复杂数据包格式时的一种可选方法,但不推荐。用户如果想使用这种方法可以自己更改接收函数中相应的

#ifdefSCOM_ComplexPackageFormat

#endif//SCOMM_ComplexPackageFormat

预编译指令之间的内容。

例如指定QueryPackageFormat的返回值的含义:

0:继续找数据包头或继续找数据包尾。

1:找到数据包头。

2:找到数据包尾。

3:数据包出错,需要抛弃。

然后更改源代码来实现上面的协议。

注意:当用户需要使用字符串的时候,可以利用简单的包装函数将字符串转换为字节数组。所以没有必要提供专用的字符串处理函数。

键盘扫描模块

键盘扫描模块有两种工作方式,一种为自动的由时钟模块调用,另一种是由程序员自行调用。

1)由时钟模块自动调用的方式

将时钟模块实现文件(Timer.h)及键盘扫描模块的实现文件(KBScan。c)包含进工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。时钟模块自动对时钟中断进行计数,当达到TIMER_KBSCANDELAY宏所定义的值后,自动调用键盘扫描模块中的函数KBScanProcess()进行键盘扫描,也就是说,这个宏的值可以决定按键消抖动的时间。

用户应该提供两个回调函数OnKBScan()及OnKeysPressed()。在函数OnKBScan中进行键盘扫描,并返回扫描码。扫描码的类型缺省为BYTE,当键盘规模较大时,BYTE不能够完全包含键盘信息时,可在Config.h文件中重定义宏KBvalue,如下:

#defineKBvalueWORD

这样,就可以使用16位的键盘扫描码,如果此时还达不到要求,可以将键盘扫描码定义成一个结构,但这样做将会增加代码量及消耗更多的RAM资源,故不推荐。

扫描模块调用OnKBScan取得扫描码,并调用用户可以重定义的宏IsNoKeyPressed来判断是否有键按下,缺省的IsNoKeyPressed实现如下:

#defineIsNoKeyPressed(x)((x)==0x00)

即认为OnKBScan返回0扫描码时为没有键按下,如果扫描函数返回其它非零扫描码做为无键按下的扫描码时,可以在Config.h文件中重定义IsNoKeyPressed宏的实现。

8位键盘扫描码(缺省值)时,相应的扫描函数为:

BYTEOnKBScan()

当扫描模块经过软件消抖动之后,发现有键按下,就会调用另一个回调函数OnKeysPressed。函数的声明应该如下:

voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)

其中中的参数byKBvalue的类型为BYTE,此为缺省值,如果使用其它类型的扫描码,就将此参数变为相应类型。这个值由OnKBScan返回。另一个参数byState在通常情况下为零。但当用户在Config.h中定义宏KBSCAN_BRUSTCOUNT,同时键盘上的某键被按住不放时,扫描模块对它自己的调用(注意这里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是时钟中断足够的次数后调用扫描模块,而KBSCAN_BRUSHCOUNT为扫描模块自身的被调用次数)进行计数,当达到KBSCAN_BRUSTCOUNT时,扫描模块调用OnKeysPressed,此时第一个参数的含义不变,而byState变成1,同时计数器复位,又经过一段时间后,用值为3的byState调用OnKeysPressed。这样就可以很方便的实现多功能键或者检测某键的长时间被按下。

2)由用户自行调用

由用户自行在程序中调用扫描模块,而不是由时钟中断自行调用。其它与方式1相同。

注意:

1)函数KBScanProcess为非阻塞函数,它将在很快的时间内返回,等待再次分配给它执行的机会。

2)函数KBScanProcess是在时钟中断外部运行的,它的过程可以被任何中断打断,但不影响系统运行。

3)byState的最大值为250,之后被复位为零。应用举例

现在来举例说明上述几个模块的使用方法。

硬件环境描述:

为了控制一盏灯,需要单片机提供一个做控制功能的开关量,这里不描述外部接口电路,只说明当单片机的P10脚为高电平时,灯灭,当P10脚为低电平时,灯亮。

可以通过计算机由串口发送命令来控制,或通过一个按键(pushbutton不是自锁式的按键)来手动控制(按键接在P11脚上,当键没有按下时,P11电平为高,键按下时,引脚电平被接低),当使用按键手动控制的时候,需要给计算机发送通知。

设定串口通讯指令如下:

数据包由0xff做包头,4个字节长,第二个字节为命令代码,第三个字节为数据,最后一个字节为校验位。

命令和数据代码有如下组合:

(计算机发给单片机)

0x100x01:计算机控制灯亮。(数据位是非零值即可)

0x100x00:计算机控制灯灭。

(单片机发给计算机)

0x110x01:单片机正常执行控制指令,返回。(数据位是非零值即可)

0x110x00:单片机不能够正常执行控制指令,或控制指令错(不明含义的数据包或校验错等)。

0x120x01:手动控制灯亮。(数据位是非零值即可)

0x120x00:手动控制灯灭。

建立工程:

在硬盘上建立文件夹Projects,在Projects下建立Common文件夹及Example文件夹。将各模块的头文件及实现文件拷贝到Common文件夹下(推荐使用这样的文件组织结构,其它工程也可以建立在Projects下,各工程共享Common文件夹中的代码)。

启动KeilC的IDE,在Example下建立新工程,将各模块的实现文件包含进工程。

在Example文件夹下建立Output文件夹,更改工程设置,将Output作为输出文件和List文件的输出文件夹(推荐使用这样的结构, 当保存工程文件时,可以简单的删除Output文件夹中的内容而不会误删有用的工程文件)。

建立工程配置头文件Config.h及工程主文件Example.c,并将Exmaple.c文件加入工程。

输入代码:

代码的具体编写过程略。下面是最后的Config.h文件及Example.c文件。

//

//file:onfig.h

//

#ifndef_CONFIG_H_

#define_CONFIG_H_

#include//使用AT89C52做控制

#include“../Common/Common.h”//使用自定义的数据类型

#defineTIMER_RELOAD922//11.0592MHz晶振,1ms中断周期

#defineTIMER_KBSCANDELAY40//40ms重检测按键状态,即40ms消抖

#defineSCOMM_AsyncInterface//使用异步通讯服务

#defineIsPackageHeader(x)((x)==0xff)//判断包头是不是0xff

#defineIsPackageTailer(x,y,z)((y)<=(z))//判断包的长度是不是足够

#endif//_CONFIG_H_

//

//file:xample.c

//

#include

#include“../Common/Common.h”

#include“../Common/Timer.h”

#include“../Common/Scomm.h”

#include“../Common/KBScan.h”

BITgbitLampState=1;//灯的状态,缺省为off

staticvoidInitialize()

{

InitTimerModule();//初始化时钟模块

InitSCommModule(0xfd,TRUE);//初始化通讯模块,11.0592MHz晶振,

//波特率为19200

EA=1;//开中断

}

voidmain()

{

Initialize();//初始化

while(TRUE)//主循环

{

ImpTimerService();//实现时钟中断服务,如键盘扫描

AsyncRecePackage(4);//接收4个字节长的数据包

}

}

//在中断外部响应时钟中断事件

voidOnTimerEvent()

{

//donothing

}

//控制外部灯

staticvoidTriggerLamp(BITbEnable)

{

P10=~bEnable;//需要反相控制

}

//键扫描回调函数

BYTEKBScan()

{

BITb;

P11=1;//读之前拉高引脚电平

b=P11;//读入引脚状态

return~b;//数据反相做扫描码

}

//计算校验和

staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)

{

BYTEby,bySum=0;

for(by=0;by

return0–bySum;

}

//接收到键盘消息回调函数

voidOnKeyPressed(BYTEbyvalue,BYTEbyState)

{

BYTEby[4];

if(byState==0)

{

switch(byvalue)

{

case0x01:

gbitLampState=~gbitLampState;//灯状态取反

TriggerLamp(gbitLampState);//执行控制

by[0]=0xff;//构造数据包

by[1]=0x12;

by[2]=(BYTE)gbitLampState;

by[3]=CalcCheckSum(by,3);//求校验和

SendPackage(by,4);//发送数据包

break;

//处理其它扫描码

default:

break;

}

}

//接收到数据包回调函数

voidOnRecePackage(BYTE*pbyBuf,BYTEbyBufLen)

{

BYTEby[4];

by[0]=0xff;

by[1]=0x11;

if(byBufLen!=4||pbyBuf[3]!=CalcCheckSum(pbyBuf,3))

{

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//处理长度或校验和不正确

}

switch(pbyBuf[1])

{

case0x10:

gbitLampState=(BIT)pbyBuf[2];

TriggerLamp(gbitLampState);

by[2]=1;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//发送成功执行通知

break;

default://不知道的命令

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//发送没有成功执行通知

break;

单片机原理范文第5篇

关键词:单片机 教学改革 培养能力

一、引言

单片机在现代电子系统智能化中扮演着至关重要的角色。无论是现代工业、农业及生活领域,还是尖端科技等诸多领域,都离不开单片机,其应用率和普及率是其他类型的计算机不能比拟的。单片机技术被广泛地应用在智能仪器仪表、机电一体化产品、实时工业控制、分布系统的前端模块、家用电器、医疗和军事等领域。所以单片机原理与应用是电子、自动化等专业的一门必修课。单片机原理与应用是电气信息类、自动化类、机电设备类、计算机类及仪器仪表类等专业的专业基础课或专业课。单片机教学的改革就是使学生将学到的单片机理论知识转化为适应就业和工作需要的实际能力。

二、改革单片机原理及应用教学的意义

(一)单片机原理及应用教学存在的问题

传统的理论教学是按教材编写的顺序,先讲单片机的硬件基础知识,然后讲指令系统、汇编语言编程,接着是讲接口技术,教学形式和手段单一、方法简单呆板。在教学中,学生普遍反映单片机概念多、太抽象、难入门、指令太难记。学生感到枯燥乏味,学习难度很大,课堂教学效果不够理想。

传统实训课则以教师为中心,基本都是教师先进行讲解、示范,然后学生开始实操训练,学生模仿教师按实训步骤操作实训项目。在这个过程中,教师巡回查看辅导学生。实训考核则是操作一个操作过的题目,教师要据学生实训项目完成的结果和所用的时间给出学生实训实操考核成绩。用一个模式,完全按照指导书上规定的步骤做相同的实训。学生感到学习内容枯燥无味,没有兴趣。学生的学习积极性和教师的授课积极性都受到极大的挫伤。

(二)改革单片机原理及应用教学的意义

针对单片机原理应用教学存在的问题,要对单片机原理及应用教学进行改革,培养学生学习单片机原理及应用课程的兴趣,着重培养学生的学习能力、综合运用知识的能力、动手能力和创新能力,培养高技能人才。

三、单片机原理及应用理论教学改革

(一)单片机原理及应用理论课中,引入案例教学

本着“理论够用”就可以的原则,把够用的理论优化整合到一个个案例中,案例中包含的理论由简到难,符合理论掌握的逻辑顺序,使“死”的大量的理论内容分散活化到每一个实际案例中。在应用中学习理论,理论因运用的具体而不再抽象,每个案例中学到的理论数量适中、迁移和内化的程度高,解决了单片机概念多、太抽象、难入门、指令太难记忆等问题。

案例教学有利于培养学生学习单片机原理及应用的兴趣,一个个案例生动具体,给学生展示单片机应用的广阔前景,使学生对学习单片机原理及应用产生浓厚兴趣。学生在学习抽象内容之前,教师可以通过案例给学生介绍单片机无比优越的性价比,并且应用大量的事例说明单片机的应用无所不在。将抽象的教学内容与这些生动的现实应用实例相结合,给学生一个能看到、能听到、能摸着的学习目标,提高了学生学习单片机原理及应用的兴趣。

案例教学有利于培养学生学习单片机原理应用的积极性。案例教学过程中,可以渗透就业热点介绍,使学生认识到单片机从低端应用到高端应用都有广阔前景。学好单片机原理及应用既能为低端应用打好基础,又能为高端处理器的学习做好准备。如此,使学生把学习单片机原理及应用与自己的就业前景结合起来,学生学习积极性得到调动。

单片机原理及应用理论课教学中,使用案例教学,能缩短理论与实践的距离,培养学生综合运用知识、解决实际问题的能力。不少学生都反映,在理论课上学到的理论知识,到实践中不知道怎么使用,怎么入手。其原因就是没有把理论与实际相结合好,使用案例进行理论教学,使学生接触到了与实际应用相近的案例,可以缩短学生学习时间。比如,以一个完整的项目开发为案例,介绍交通信号灯控制系统,这样增强了趣味性,学生也很容易接受,而且可以促进学生思维发展,实现分析、反思、体验和感悟。当其领悟后,就能模仿,也会举一反三。

(二)单片机原理及应用理论课中,丰富教学手段

学生觉得单片机原理及应用难学抽象,很大一部分原因,是传统教学的讲授加板书,无法为学生展示单片机内部数据动态流动的过程和图景。学生脑海中形不成单片机内部数据动态流动的过程和图景,产生了极大的困惑。制作生动形象的多媒体课件可以解决这个问题,利用多媒体课件把单片机中难懂的寻址方式指令举例和有代表性的指令,做成动画准确生动呈现出其数据流动的完整过程,学生瞬间就理解了寻址方式和典型指令,并且迅速发展了学生的形象思维能力、抽象思维能力和举一反三的能力。

单片机原理及应用课程信息量大,要求授课容量大,制作生动形象的多媒体课件可以满足这一要求,利用多媒体课件授课,节省了板书和大量的画图时间,可以在有限的课时内讲深、讲透课程内容;利用多媒体课件演示,可以随机重复,前后可以随意翻看的特点,便于突出重点、突破难点。实践表明,将传统教学的讲授加板书与计算机辅助教学手段相结合,丰富了教学手段,提高了教学效率,激发了学生学习的积极性和主动性,收到了良好的教学效果。

四、单片机原理及应用实践教学改革

(一)单片机原理及应用实训课中,多开发趣味实训项目

利用单片机编程可以实现许多电子电路,这是非常有趣的。例如,利用位操作指令可以实现各种门电路和组合逻辑电路;利用循环或定时器能实现软延时;利用定时器可以实现各种矩形脉冲发生器,这些都可以从示波器上观察到有趣的结果。这些实训项目可以激发学生的学习兴趣,调动学生的学习积极性和主动性。

(二)单片机原理及应用实训课中,引入模块化教学

把实践教学内容优化整合成若干个模块,每个模块中包含的知识点和技能又可分解到若干个实训题目中,例如灯光控制模块,包含了闪灯控制、排灯控制、转灯控制、流水灯控制、交通信号灯控制。每个模块的教学又可分成三个层次,对学生来说就是三个层面的学习,即模仿学习、举一反三和创新。就拿灯光控制模块来说,直接按照实训指导书上的程序进行实训就是模仿学习,在此基础上对指导书上的程序进行改编实现延时和灯光花样的变化是举一反三,最后编制一个全新的灯光控制程序实现创新设计。这样的学习符合学生的思维发展规律,使其发挥主观能动性及创造性思维,有效培养了学生的学习能力,综合运用知识解决实际问题的能力和创新能力。

五、小结

单片机原理及应用理论教学和实践教学手段和方法很多,这里从个人教学改革心得出发探讨了几个做法。在今后的教学改革中只要不断改进教学方法, 使用各种教学手段,激发学生的学习兴趣,注重学习能力的培养和综合运用知识解决实际问题的能力的培养,就能获得良好的教学效果。但要深入教学改革,还需要不断努力和探索。

参考文献:

[1]周绍平.单片机教学改革的实践与思考.扬州职业大学学报,2004,8(2):60~62

[2]廖平.单片机实验教学的改革.实验室研究与探索,2004(7):36~38

[3]陈 亮.单片机课程的教学改革.实验室研究与探索,2008(9):121~123

[4]徐海黎,刘明.单片机课程教学的改革.南通大学学报(教育科学版),2005(4):96~97