首页 > 文章中心 > 单片机程序设计

单片机程序设计

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

单片机程序设计

单片机程序设计范文第1篇

[关键词]:红外遥控 解码 单片机

1红外遥控系统组成

通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括红外接收器、光电转换放大器、解调等。

2红外遥控发射和接收原理

按下遥控器的某一个键,遥控器会发出一连串经过调制后的信号,这个信号经过红外一体化模块接收后,输出解调后的数字脉冲,每个按键对应不同的脉冲,故识别出不同的脉冲就能识别出不同的按键。按键信息采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。

上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的,然后再通过红外发射二极管产生红外线向空间发射,如图3所示。

3单片机解码程序设计

红外一体化接收头输出信号连接到单片机外中断输入引脚,设置为下降沿中断方式。引导码解码过程只解码带数据的引导码,不对连发码引导码进行解码。这就要求使用过程中,长按操作不起作用。

关键解码流程设计如图4所示。

中断解码完成后,完成酥局梦弧V鞒绦蛑胁檠到完成标志,就对解码数据进行反码校验并进行对应的处理。

4效果与应用

以上设计的单片机解码程序,成功应用于万年历、计算器、电机控制、旋转LED广告灯灯各种单片机项目教学过程中,完全取代矩阵键盘进行操作,电路简单,程序可靠。稍有不足的是要占用一个外中断,并且在中断解码操作时,会占用CPU时间。

对于时序有严格要求的项目应用,可以考虑“外中断+定时器”的方式,在每个下降沿时进入中断,对数据进行处理。两次进中断的时间间隔采用定时器来记录,省略此前中断解码流程中设计的各种延时和等待操作,减少时间占用,提高CPU利用率。

参考文献:

单片机程序设计范文第2篇

[关键词]USB ECP Driver Studio 设备驱动程序

[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0029-02

1 引言

由于现在大多数计算机没有并行口而具有多个USB接口,因此很多并行口设备无法和计算机直接连接使用。利用基于单片机STC11F32XE的USB 转 ECP 模式并行口可以连接其他ECP模式并口设备,以达到让具有ECP接口的设备可以和没有并口的PC进行数据通信的目的。并口采用的是IEEE 1284-A接口, USB 接口驱动芯片采用Philips 半导体公司的PDIUSBD12,该芯片的数据端口D0-D7接单片机的P0 口,引脚WR_N、RD_N、及A0 分别接单片机的P3.6、P3.7、P3.5 引脚。整个硬件电路图如图 1 所示。当 USB 设备硬件设计完成之后,接着就必须根据硬件特点和需要完成的功能,设计出合乎产品的USB驱动程序,否则,设备将无法被PC机识别,不能正常使用。

2 WDM型的USB驱动程序结构

USB设备的驱动程序是一种典型的WDM驱动程序。WDM驱动程序是分层的。对于USB设备驱动程序来说,其驱动程序包括两个层次:设备(功能)驱动程序层和总线(底层)驱动程序层。USB底层驱动程序由操作系统提供,不要开发者自己编写,它位于USB功能驱动程序的下面,负责与实际的USB硬件打交道,实现复杂而繁琐的底层通信;USB功能驱动程序必须要由开发者编写,它不与实际的USB硬件打交道,是把包含URB(USB Request Block,USB 请求块)的IRP发送到USB底层驱动程序,来实现对USB设备信息的发送和接收。(图2) 给出了USB 驱动程序的结构模型。

3 USB驱动开发编程环境的建立

开发一个WMD 驱动程序,必须要搭建合适的开发环境以此来减小开发难度。对于WDM 驱动的开发,一般必须使用的软件是VC++6.0和DDk (Driver Development Kit,驱动程序开发工具包)。但为了进一步降低开发难度,选择使用了第三方驱动开发工具--Driver Studio。它以类的方式对DDK 进行封装,可以十分容易地利用它提供的向导来产生一个必需的驱动程序框架。

一般首先安装VC++6.0,接着安装DDK,如果需要的话,还可以安装Windows SDK 来辅助开发,最后安装Driver Studio 3.2。因为Driver Studio的类库要使用DDK库函数,所以在安装好Driver Studio 之后必须首先要编译出一个库文件,否则会提示找不到库文件vdw_wdm.lib 等错误。编译该库文件的步骤如下:启动VC++6.0,找到并打开Driver Studio3.2 安装目录下的vdwLibs.dsw工程文件,然后选择DriverStudio->DDK Build Settings,在弹出的对话框中设置DDK的安装路径和运行的操作系统。然后选择菜单Build->Batch Build,要根据驱动运行的平台来选择对应的工程文件,这里选择了x86对应的工程,正确选择之后,单击Rebuild All 按钮,开始编译库文件。这个类库只需编译一次,以后开发其他的驱动就不必再次编译了。

4 USB驱动创建方法及步骤

该驱动程序的主要功能包括:端点0采用控制传输,可以保证传输过程中的数据的完整性和正确性,主要负责USB枚举过程中的数据的读写。另外,又增加了端点1和端点2。端点1采用中断传输,这种传输主要用在数据量不大,但对时间要求较严格的设备中。因此,模块满足了实时性的特点;端点2采用批量传输,该种传输通常用在数据量大、对数据的实时性要求不高的场合中,利用该方式可以完成大量数据的快速传输,可以与高速的ECP并行口相匹配,因此,模块满足了高速数据传输的要求。

单击VC菜单栏下的DriverStudio菜单项,选择Driver Wizard菜单,会出现一个驱动向导对话框。单击Start a new Driver Project 将创建一个新的驱动工程。然后按照向导生成该驱动程序的框架。具体步骤如下:①设置工程名和路径。在弹出的对话框中,设置工程名为UsbToECP、路径为D:\。②选择驱动工程的类型。在对话框中选择 WDM Driver,驱动框架选择DriverWorks C++ Framework。③选择WDM驱动类型。在弹出的对话框中选择 WDM Function Driver。④选择驱动总线的类型。在对话框中选择为 USB 总线,然后在分别设定USB Vendor ID 和USB Product ID。 ⑤设置USB 的端点资源。单击Add增加端点。这里增加 4 个端点,Pipe Name 分别是Ep1_In、Ep1_Out、Ep2_In和Ep2_Out。其中Ep1_In和Ep1_Out选择中断传输,端点地址均为1,传输方向分别为输入和输出,最大包长为8字节,最大传输大小为 4096字节。Ep2_In和Ep2_Out选择批量传输,端点地址均为2,传输方向分别为输入和输出,最大包长为64字节,最大传输大小为 40960字节。⑥选择需要处理请求类型。这里选择IRP_MJ_DEVICE_CONTROL、IRP_MJ_READ和IRP_MJ_WRITE。它们分别与API函数 DeviceIoControl、ReadFile和WriteFile一一对应。⑦设备I/O操作方式。配置IRP_MJ_READ和IRP_MJ_WRITE的缓冲方式分别为Buffered。另外还需要增加4个IO Control 的控制代码:EP1_READ、EP1_WRITE、EP2_READ、EP2_WRITE。打开方式选择Interface。⑧添加注册表项。可以根据自己需要增加,这里增加了一个设备名称。⑨设置电源管理。选择Device requires an inrush of power at startup,说明该设备启动时需要大电流,这样做的目的是防止相同的设备同时上电,减少对电源的冲击。步骤10-13按默认配置即可。

5 驱动的编程

USB驱动程序的编程最主要的就是编写端点1和端点2的数据处理函数,其中主要编写的是UsbToECPDevice类成员函数Read()、Write()、及DeviceControl()中调用的4 个IoControl()函数。

Read()函数对应着WIN32 API的ReadFile函数,其参数通过KIrp I传递过来。因为端点1指定的缓冲方式为Buffered 方式,所以调用KIrp类的成员函数I.BufferedReadDest()来获取保存数据的缓冲区地址,调用I.ReadSize()来获取读到的数据长度。如果获取到的缓冲区地址为NULL,则说明参数无效,则以USB_STATUS_INVALID_PARAMETER来完成该IRP,然后返回USB_STATUS_INVALID_PARAMETER。若读取的字节数是0,就直接完成该IRP,不需要进行数据处理。接着创建一个URB来完成数据的处理。因为端点1采用的是中断传输,所以必须创建一个中断传输的 URB并提交它,端点管道KUsbPipe类提供一个创建中断传输URB的函数BuildInterruptTransfer。这样底层的USB 总线驱动程序就会负责从端点 1 读取数据,当完成数据的读取后,提交相应URB的函数就会返回。当URB创建成功后,利用KUsbPipe类的成员函数SubmitUrb()来提交这个URB,否则返回资源不足的错误信息。SubmitUrb()函数返回后,可以用URB的成员变量TransferBufferLength来获取实际读到的字节数,最后删除创建的URB。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

Write()函数的处理方法与Read()函数的方法非常相似,不同之处在于利用KIrp类I的成员函数 BufferedWriteSource()和WriteSize()来分别获取缓冲区的地址和传输的字节数。另外,函数EP1_READ_Handler()和EP1_WRITE_Handler()的实现与Read()和Write()函数基本是一样的,略有不同。

端点2 的EP2_READ_Handler(KIrp I)和EP2_WRITE_Handler(KIrp I)与端点 1的EP1_READ_Handler(KIrp I)和EP1_WRITE_Handler(KIrp I)处理方式几乎是一样的,主要的不同是在创建URB时要用到创建批量传输URB 的函数BuildBulkTransfer(),其参数及意义与BuildInterruptTransfer()相同。

6 驱动的安装

在对端点1和端点2编程完成之后,然后对其进行编译,如果没有错误,可以看到编译报告中有一行“MODULE=.\objfre\i386\UsbToECP.sys”,这个就是所要的驱动文件,另外,在目录下还产生一个inf文件,其也是安装驱动时需要的一个重要的文件,它里面有一些重要的安装信息,可以根据需要进行修改。一般主要是对inf的Stings 进行修改,表1给出了该驱动的Strings 段的几个重要属性的修改。

将该设备与PC机连接,系统会提示安装驱动,首先指定驱动安装所要使用的inf文件所在的位置,该inf文件可以在驱动工程目录的driver目录下找到,是由向导自动生成的。然后选择安装驱动所需要的UsbToECP.sys文件,该文件在D:\ UsbToECP\driver\objfre\i386下。正确安装驱动之后,打开计算机的设备管理器,将会看到该USB设备。如下图3所示。打开图3中的Class for BinBinUsb devices下的BinBinUsb Device属性,选择相应标签,将会看到如下图4的驱动信息。

7 结语

USB设备驱动的开发是设备开发过程中必不可少的一项任务。通过研究利用VC++、DDK和Driver Studio对USB驱动程序的设计方法,成功地设计了基于单片机的USB转并口设备的驱动程序。通过测试,使用该驱动的USB转并口设备运行稳定,达到了预期的效果。这种USB驱动的设计方法简化了开发难度,开发的驱动稳定可靠,必将受到USB设备开发者的广泛关注,同时也给其他的基于WDM驱动的开发提供一个新途径。

[参考文献]

[1] 荣佳波,常明志,井科伟,杨少勇.USB 设备的WDM驱动程序设计[J].应用科技,2004,31(3);39-41.

单片机程序设计范文第3篇

关键词:工作过程;C语言程序设计;单片机课程;电子设计竞赛

在电子信息专业中,C语言主要服务于单片机应用,而单片机的运用对《C语言程序设计》的要求,从思维方式上讲,培养学生的逻辑思维能力,分析问题、解决问题的能力等;从行为能力上讲,培养学生利用C语言编程能力对单片机综合项目进行控制设计。然而,在具体的教学过程中,由于课程本身的难度以及受学生基础、教学内容、教学方法、教学条件等各方面的限制,其教学目标的培养大打折扣。为了学生能够通过学习C语言从而获得与单片机密切结合的综合职业能力,并保证其相关的经验、知识和技能在结构上的系统化,本文以“基于工作过程的学习方法”为核心,将“工作过程中单片机的运用学习”和“课堂上C语言知识的学习”整合为一个有机整体,[1]形成一套新的课程改革模式,从而提高教学质量,增强学生的职业技能,拓宽学生的求职渠道。

一、C语言程序设计在电子类专业中的现状

(1)目前大部分高职电子类专业的人才培养方案中,仍沿用本科院校的课程体系,[2]其《C语言程序设计》教材仍采用本科院校计算机专业教师编写,针对性不强,很难有效的服务于高职电子类专业课程的学习。(2)《C语言程序设计》的学习与专业课程单片机的学习脱钩,使学生学习C语言的目标不明确,很难将C语言知识与专业核心课程单片机的学习有效结合,从而影响单片机教学的有效展开。(3)《C语言程序设计》课程本身的难度以及学生自身的底子薄,形成学生难学、厌学,进而逃课的恶性循环。

二、基于工作过程的C语言课程与单片机课程总体设计

本文提出了一种基于工作过程的C语言课程与单片机课程有效结合的课程改革模式,如下图1所示。

图1 改革的课程体系

从工作过程出发,将单片综合项目的应用分解为C语言课程任务、C语言与单片机的结合、单片机课程任务三个部分,C语言课程任务和单片机课程任务两者服务于C语言与单片机的结合;C语言课程任务主要面向C语言程序设计的知识点学习即C语言的课程领域;C语言与单片机的结合又可分解为C语言在单片机中的算法学习和单片机中的C语言程序设计;单片机课程任务主要面向单片机内部资源的学习即单片机课程领域;最后将 C语言的课程领域和C语言在单片机中的算法学习相结合,形成一门《基于单片机的C语言程序设计》课程,并将单片机课程领域和单片机中的C语言程序设计相结合,形成一门《单片机综合应用》课程。

三、基于单片机运用领域的C语言学习领域重构

(一)C语言学习领域重构。如下图表1所示,将七个典型单片机项目所需要的C语言知识点打勾,根据各个项目所需要的知识点,重新组织C语言课程的学习领域,形成重、难点突出,与专业课程紧密结合,针对性强的具有专业特色的C语言程序设计教程。

表1 基于单片机项目的C语言学习领域重构

(二) C语言学习领域中教学例子选取。在C语言知识讲解中,我们将典型单片机项目分割成多个独立完整的子任务,并将这些子任务稍加调整修改,使C语言知识点贯穿其中,让学生从专业的实际运用中来学习C语言,既保证了C语言知识的系统性,又将C语言理论知识融入实践任务,不仅可以培养学生专业技能,而且还培养学生学习C语言的兴趣。

四、全文总结

本文融“教、学、做”为一体,强化学生能力的培养,将C语言课程与单片机课程进行了有机结合,形成新的课程模式,并对新的课程模式中《基于单片机的C语言程序设计》课程的知识领域进行了重构、教学例子进行了选取,从而促进了人才培养方案的正确修订、课程体系的科学整合。

单片机程序设计范文第4篇

关键词 单片机 教学模式研究 任务驱动 实践教学

中图分类号:G424 文献标识码:A

单片机自20世纪70年代问世以来,已对人类社会产生了巨大的影响。目前单片机在工业控制、智能仪器仪表、办公室自动化、家用电器等诸多领域得到广泛应用。①单片机原理与应用课程已经在许多高等院校的电子电气类、计算机类、控制类、机械类等专业作为专业必修课开设。

本文从该课程的特点和目前教学的不足出发,结合笔者在课程教学中的实际经验,探讨改进单片机课程教学模式的途径,提高课程的教学效果。

1 单片机课程特点与教学现状

单片机原理与应用是一门应用性极强的综合性课程,包含理论与实践两部分,单片机技术是硬件设计与软件编程的有机结合。对于初学者而言,往往感觉单片机概念繁多,内容枯燥,结构抽象,入门较难。其次,单片机常采用汇编语言作为编程语言,而汇编语言是面向机器的语言,缺乏通用性,设计程序时必须对单片机的硬件结构有相当深入的了解。相较于不受具体机器限制且参照一些数学语言设计的高级语言(如C语言)来说,汇编语言缺乏了直观、易懂、可读性好的特点,学习起来难度更大。另外,单片机技术综合性强,涉及内容涵盖了电路、模拟电子、数字电子、接口技术、传感与检测技术、自动控制原理等诸多课程的内容。②

鉴于单片机课程的特点,传统的教学模式存在着以下不足之处:③(1)课程讲授重理论、轻实践,讲授内容仍按照硬件结构、指令系统、汇编语言程序设计、中断与定时器/计数器、接口技术这一固定模式进行,教学以灌输单片机结构知识为主,忽略其实际应用,让学生感到抽象、乏味,失去兴趣。(2)强调单片机应用程序设计的讲授和训练,忽略系统整体设计,使学生缺乏对单片机系统软硬件有机结合的认识,常常出现学生编写的程序与自己设计的单片机系统完全不对应的情况。(3)实践环节相对薄弱,多以验证性和演示性实验为主,设计性、综合性实验不足,实验条件和实验学时有限,学生没有足够的机会在实践中去理解和提高,更谈不上培养学生主动设计和创新的能力。

2 课程教学模式研究

改进单片机课程的教学模式,应通过改进教学方法,调整教学内容,优化实践教学体系,达到激发学生的学习兴趣和主动性,改善教学效果,培养应用型人才的目的。

2.1 改进教学方法

合适的教学方法能够有效地提高学生对课程的兴趣。传统的以教师灌输知识为主的教学方式与单片机的课程特点大为不符,严重影响了学生的学习热情,而引入任务驱动式的教学法能有效地解决这个问题。任务驱动法是一种探究式的教学模式,其主要形式是将教学内容转换成一项或几项任务来完成,通过任务的提出、分析到实现来引导学生主动思考,培养其独立分析和解决问题的能力。譬如,在单片机控制LED闪烁的教学中,首先设定为简单的驱动一个LED定时闪烁任务,使学生掌握延时程序和定时器控制两种不同的方法;接着将其扩展为8个LED的跑马灯控制任务,使学生学习分别应用左移(右移)方式和查表方式实现;继而在该系统上引入按键控制跑马灯的开始和停止,使学生学习按键的使用和按键去抖动的方法。学生在任务中学到知识的同时,获得了成就感,学习兴趣也自然提高了。

2.2 调整教学内容

单片机应用系统的程序设计,既可以采用汇编语言,也可以采用C语言。且在单片机的实际开发中,由于应用系统的规模较大,设计人员更趋于采用C语言进行程序设计。C语言相比于汇编语言,具有良好的可读性,可移植性。采用C语言进行程序设计时,编译器能自动完成变量的存储单元的分配,使得学习编程者可以更多地专注于应用程序的逻辑思想。④此外,在开设单片机课程之前,一般都已开设过C语言程序设计课程。学生对C语言已有基础,利于接受和理解。因此在讲授汇编语言程序设计之后,引入单片机标准C语言的教学内容,可以让学生在两种语言的对照学习中更快地掌握单片机的编程技术,也使得学生对于单片机的学习更具实用性。

2.3 优化实践教学体系

传统的实践教学多以演示性、验证性实验为主,实验设备以单片机实验箱居多。学生进行实验时直接按照实验指导书中现成的电路图在实验箱上进行简单的电路连接并照搬现有的程序代码,并不理解该实验电路的设计原理和程序的设计思想,只是将指导书中的示例进行了简单的验证,没有达到训练学生独立设计的目的。有效的实践教学应该加大实验学时比重,尽量减少验证性实验,增加设计性、综合性实验。在布置实验任务时,应只说明本次实验的目的和功能要求,提前让学生进行预习和准备,待学生有了初步的设计思路和程序初稿方可开始实验。这样,有限的实验时间主要用于学生的自行验证、调试、修改中,即使一个简单的实验也能锻炼学生的独立思考和解决问题的能力。此外,增加独立于课程外的实训环节,以综合性的课题设计来培养学生对单片机应用系统整体开发的能力。引入单片机系统虚拟仿真软件-proteus,与开发工具keil及实验板相结合,从电路原理图设计、软件设计到虚拟系统仿真再到实物系统调试和实现,整个过程环环相扣,锻炼了学生综合设计的能力。

单片机程序设计范文第5篇

关键词:单片机 按键识别 一次响应

中图分类号:TP368.12 文献标识码:A 文章编号:1007-9416(2012)08-0175-02

1、引言

在以单片机为核心控制的应用系统中,键盘按键能实现向单片机输入数据、传送命令等功能,是单片机应用系统中人工干预单片机的主要手段。而单片机对按键闭合与否的判断,主要是通过其引脚上的电压高低进行的。本文以51单片机为例说明,所述键盘按键的硬件电路设计也非常简单——轻触开关的一端接地,另一端连接单片机引脚,该引脚同时接10K上拉电阻[1]。很明显,单片机引脚呈现高电平表示按键开关断开;反之,引脚电压呈现低电平表示按键开关闭合。因此,对单片机的按键识别只要通过对其引脚电平的高低状态的检测,即可确认按键按下与否[2]。

众所周知,按键为机械弹性开关,加之按键按下或抬起瞬间均会产生抖动现象,因此消除按键抖动也是整个系统的关键。为更突出本文的讨论重点,这里不再重点讨论按键去抖的方法。

2、传统按键识别方法

2.1 简单的按键识别

该按键识别方法虽然简单,但当按下按键的瞬间,却可能让系统多次循环处理同一按键事件,造成CPU资源的浪费。以下为该方法的程序设计思路,下述中的“按键确实按下”表示延迟10ms后,按键仍处于按下状态。

(1)初始化按键;

(2)if(按下按键){

延迟10ms去抖;

if(按键确实按下){事件处理,退出}

}else {未按按键,退出}

单片机程序可能是一个循环执行的过程,当按键按下闭合,程序进入按键事件,执行完该事件,若按键仍未被抬起,则程序循环又再一次进入同样的按键事件执行。事实上,如果采用12MHZ外部晶振,单片机处理器执行一个指令通常只要2个机器周期的时间,也即4us。如此短暂的时间,当我们松开按键时,程序可能早已经循环执行很多次按键事件。因此该按键识别的程序思路并不合适。为了不重复执行同一个按键事件,可改进为如下所述的按键识别的方法:

(1)初始化按键;

(2)if(按下按键){

延迟10ms去抖;

if(按键确实按下){事件处理,等待按键释放,退出}

}else {未按按键,退出}

此方法虽然可识别按键释放,即实现每一次按键,系统只会调用一次按键处理事件。但若按键一直不释放,则程序只可在此原地踏步等待,浪费系统执行时间,CPU每个时钟周期均做无用功。解决方法是,在识别到第一次按键,并执行完按键事件后,将忽略后续的按键状态,从而实现对按键的一次响应,解决多次冗余响应的缺陷。

2.2 带标志的按键识别

为了解决多次冗余响应的缺陷,可设置按键按下与释放两种状态的标志,在程序执行过程中,检测标志位内容,识别按键的状态。根据该思路,可在初始化按键时,设置按键按下与否的标志位,并赋予“0”与“1”两种状态。标志状态为“0”表示按键无效,为“1”表示按键被按下。以下为带标志位的按键识别的程序设计思路[2],这里假定标志位为key_mark,初始值为0。

(1)初始化按键;

(2)if(按下按键 && !key_mark){

延迟10ms去抖;

key_mark = 1; //将状态“1”赋予标志位。表示按键已按下

if(按键确实按下){事件处理,退出}

}else if(未按按键){

key_mark = 0,退出}

该方法可行有效,其中标志位key_mark起了至关重要的作用。只有当按键按下,key_mark=0,且延迟10ms去抖后,程序才会确认是否真的有按键被按下。此时马上对key_mark=1,使得下一次查询key_mark标志时,得知按键正处于按下状态。如此,不仅使得按键被按下时可被准确检测到,还可以在按键还没被抬起释放时,不重复响应同一个按键事件。由于此时标志位key_mark的值被赋值为“1”,因此if(按下按键 && !key_mark)将不再成立,直到按键抬起,才重新赋值key_mark为“0”,实现了每一次按键,系统只会调用一次按键处理事件。

3、快速按键识别方法

对于程序员来说,实现同样功能的程序,简洁、高效对设计非常关键。本文讨论的快速按键识别方法,尝试使用单片机C语言中的逻辑运算方法,同样快速有效地解决了按键识别的程序设计问题。该方法在初始化设置后,只需要使用一句异或运算语句,两句赋值语句,即可快速进行按键识别。

下面给出该快速按键识别方法的思路。先初始化三个标志位:key_now,key_old,key_change。其中,key_now表示当前读取到的按键电平;key_old表示之前一次读取到的按键电平;key_change表示按键被按下后出现的变化情况,即当key_change=0,表示按键处于断开状态,key_change=1,表示按键处于闭合状态。这三个标志位的初始化值均为“1”。现在给出该方法的程序设计思路。

(1)初始化按键

(2)key_now = P1.0; //读取当前按键电平(假定使用单片机P1.0引脚连接按键)

key_change = (key_now ^ key_old) ^ key_change;

key_old = key_now;

根据上述方法,当未按下按键时,与按键连接的引脚P1.0为高电平,则key_now也为高电平,key_change与(key_now ^ key_old)异或运算后结果为“0”,并重新赋值给key_change,标志着当前没有按键按下;当按键被按下,引脚P1.0为低电平,key_change与(key_now ^ key_old)异或运算后结果为“1”,同样赋值给key_change,标志着当前按键已按下;若此时按键保持低电平,即按键未抬起释放,则key_now仍为低电平,key_change的异或运算结果仍为“0”;只有当按键被抬起时,引脚P1.0恢复为高电平,对应的key_change异或为“1”。总之,只要有按键按下,key_change对应的位就为“1”,按键弹起后key_change对应的位为“0”,表示按键未被按下。这大大简化了按键的识别,不需要再去进行其他判断,程序设计也简洁明了。

4、结语

本文首先介绍了键盘按键识别的工作原理,并以51单片机为例探讨基于单片机的键盘按键识别方法,这些方法同样适用于AVR、PIC、凌阳单片机等应用的程序设计中。围绕如何进行快速有效的键盘按键识别,本文深入研究了传统的键盘识别方法、带标志位的键盘识别方法,以及一种通过异或运算得到的快速键盘按键识别方法。详细比较各种方法,并采用单片机开发板(外部12M晶振,编程软件为Keil uVision2)试验[4],结果表明上述三种键盘识别程序思路均可,而后者只需要使用三句C语言语句,即可实现键盘按键识别,是一种可行有效的方法。

参考文献

[1]林伸茂编著,管继斌,白雁钧改编.8051单片机彻底研究基础篇.人民邮电出版社,2004.05:105-108.

[2]张毅刚,彭喜元,姜守达,乔立岩编著.新编MCS-51单片机应用设计.哈尔滨工业大学出版社,2003.07:157-164.