单片机按键总结Word格式文档下载.docx
- 文档编号:18846085
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:20
- 大小:31.30KB
单片机按键总结Word格式文档下载.docx
《单片机按键总结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机按键总结Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。
2.采取串键保护措施。
串键:
是指同时有一个以上的键按下,串键会引起CPU错误响应。
通常采取的策略:
单键按下有效,多键同时按下无效。
3.处理连击。
连击:
是一次按键产生多次击键的效果。
要有对按键释放的处理,为了消除连击,使得一次按键只产生一次键功能的执行。
否则的话,键功能程序的执行次数将是不可预知,由按键时间决定。
连击是可以利用的。
连击对于用计数法设计的多功能键特别有效。
三、键盘工作方式
单片及应用系统中,键盘扫描只是CPU的工作内容之一。
CPU忙于各项任务时,如何兼顾键盘的输入,取决于键盘的工作方式。
考虑仪表系统中CPU任务的份量,来确定键盘的工作方式。
键盘的工作方式选取的原则是:
既要保证能及时响应按键的操作,又不过多的占用CPU的工作时间。
键盘的工作方式有:
查询方式、中断扫描方式。
四、键盘电路结构
独立式按键接口设计
独立式按键就是各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。
因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。
优点:
电路配置灵活,软件结构简单。
缺点:
每个按键需占用一根I/O口线,在按键数量较多时,I/O口浪费大,电路结构显得复杂。
因此,此键盘是用于按键较少或操作速度较高的场合。
也可以用扩展I/O口搭接独立式按键接口电路,可采用8255扩展I/O口,用三态缓冲器扩展。
这两种配接方式,都是把按键当作外部RAM某一工作单元的位来对待,通过读片外RAM的方法,识别按键的工作状态。
上电路中独立式按键电路,各按键开关均采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的高电平。
如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
矩阵式键盘接口设计
矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上。
节省I/O口。
矩阵键盘工作原理:
行线通过上拉电阻接到+5V上。
无按键,行线处于高电平状态,有键按下,行线电平状态将由与此行线相连的列线电平决定。
列线电平为低,则行线电平为低;
列线电平为高,则行线电平为高。
五、双功能及多功能键设计
在单片机应用系统中,为简化硬件线路,缩小整个系统的规模,总希望设置最少的按键,
获得最多的控制功能。
矩阵键盘与独立式按键键盘相比,硬件电路大大节省。
可通过软件的方法让一键具有多功能。
方法:
选择一个RAM工作单元,对某一个按键进行按键计数,根据不同计数值,转到子程序。
这种计数多功能键最好与显示器结合用,以便知道当前计数值,同时配合一个启动键。
复合键是使用软件实现一键多功能的另一个途径。
所谓复合键,就是两个或两个以上的键的联合,当这些键同时按下时,才能执行相应的功能程序。
实际情况做不到“同时按下”,他们的时间差别可以长到50ms,解决策略是:
定义一个或两个引导键,这些引导键按下时没什么意义,执行空操作。
引导键的例子:
微机键盘上的CTRL、SHIFT、ALT。
一是操作变得复杂,二是操作时间变长。
多功能键的利用,应具体情况具体分析。
要求速度的场合最好做一键一功能。
如果系统功能很多,一键一功能不现实,可采取一键多功能。
六、功能开关及拨码盘接口设计
设计原因:
键盘输入灵活性大,操纵方便。
但某些重要功能或数据由键盘输入,误操作将产生一些不良后果。
因此常设定静态开关的方法来执行这些功能或输入数据。
静态开关一经设定,将不再改变,一直维持设定的开关状态。
通常这些开关状态是在单片机系统加电时由CPU读入内存RAM的,以后CPU将不再关注这些开关的状态,因此,即使加电后,这些开关的状态发生变化,也不会影响CPU的正常工作,只有在下一次加电时,这些新状态才能生效。
第一,功能开关:
主要是根据开关的状态执行一些重要的功能。
第二,拨码盘:
单片机应用系统中,有时要输入一些控制参数,这些参数一经设定,将维持不变,除非给系统断电后重新设定。
这时使用数字拨码盘既简单直观,又方便可靠。
七、按键介绍
常用的按键有三种:
机械触点式按键、导电橡胶式和柔性按键。
机械触点式按键是利用弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。
但是触点处易侵入灰尘而导致接触不良,体积相对较大。
导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。
但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。
柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。
凸球型动作幅度触感明显,富有立体感,但制造工艺相对复杂;
平面型幅度微小,触感较弱,但工艺简单,寿命长。
柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。
而且外形和面板的布局、色彩、键距可按照整机的要求来设计。
八、单片机系统键盘设计实例
本次设计中,键盘结构采用非编码键盘系统中的独立式按键结构。
用三态缓冲器573扩展I/O口搭接独立式按键接口电路,按键状态由573锁存。
键盘工作方式采用定时扫描方式。
采用定时器T0定时,CPU每隔200ms扫描键盘一次,即通过读取573的输出数据,识别按键的工作状态。
设计中对于重键和连击的处理:
对于重键,采用软件提供保护,当判断为一个以上的键按下,则不处理,返回重新进行监测。
只有监测到一个键按下时,才判断键值,执行相应键处理工作。
九、结语
键盘是单片机系统设计中一种主要的信息输入接口,合理的设计,不仅可以节省系统的设计成本,更可使仪器设备的操作变得更为简单、方便,很大程度上提高系统综合性能。
《单片机》课程学习总结
《单片机》这门课程我已经学了一个学期了,在这一个学期的学习过程中,我一开始不怎么懂得编程,但慢慢的我现在已经不仅会读程序还会写程序了。
真为自己一个学期来努力学到的单片机知识只是而感到高兴。
怎么学单片机?
也常看到有人说学了好几个月可就是没有什么
进展。
当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。
一个好的学习方法,能让你事半功倍,这里说说我学习单片机的经历和方法。
我觉得学习单片机首先要懂得C语言,因为单片机大多说都是靠
程序来实现的,如果看不懂程序或则不懂的编程是很难学会单片机的。
学习单片机首先要明白一个程序是怎么走的,要完全懂得程序每一个步骤的意思。
其次要懂得每一条指令的意思,不能盲目地去靠背指令,这是记得不牢靠的,最主要的还是靠了解。
学习单片机最主要的对89C51芯片内部结构有全方面的,只要了解了89C51才能知道单片机实现什么样的功能和作用,才能对单片机有更深一步的了解。
通过一个学期《单片机》这门课程的学习,我也从中有了不少心
得和体会想和大家分享一下。
万事开头难、要勇敢迈出第一步。
开始的时候,不要老是给自己
找借口,不要说单片机的程序全是英文,自己看不懂。
遇到困难要一件件攻克,不懂指令就要勤奋看书,不懂程序就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。
然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少。
然后建个程序,加入项目中,再写代码、编译、运行。
必须熟悉这一套工序。
个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。
单片机是注重理论和实践的,光看书不动手,是学不会的。
知识点用到才学,不用的暂时丢一边。
厚厚的一本书,看着人头
都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。
比如你写流水灯,完全就没必要看中断的知识,专心把流水灯学好就是了,这是把整本书化整为零,一小点一小点的啃。
程序不要光看不写,一定要自己写一次。
最开始的时候,什么都
不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果。
看明白了之后,就要自己写一次,你会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。
当你自己能写出来的时候,说明你就真的懂了。
必须学会掌握调试程序的方法。
不少人写程序,把代码写好了,
然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:
为什么我的程序不能正常运行?
然后就等别人来给自己分析。
这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。
这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。
这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。
找到解决问题思路比找到代码更重要。
我们用单片机来控制周边
器件,达到我们想到的目的,这是一个题目,而如何写出一个程序,来控制器件按你想要的结果去运作,这个就是解题的思路。
要写程序,就得先找到解决问题的思路,你学会找出这个解题思路,比你找到代码更为重要。
不少人很喜欢找人家的代码,有的人甚至有了代码就直接复制到自己的程序中,可以说,这不是一种学习的态度,无助于你编程水平的提高。
我几乎不怎么看人家的代码,多数时候是看别人的思路,有方框图最好,没有的话文字说明也可以。
要从代码中看出别人处理问题的思路,是相当困难的,特别是大型的程序,看起来是非常的累人。
所以现在我也明白了,以前读书时说的程序流程图很重要,现在算是知道了。
当你知道一个问题怎么去解决了,那么剩下的只是你安排代码去完成,这就已经不是什么问题了。
开动脑筋,运用多种方法,不断优化自己的程序。
想想用各种不
同方法来实现同一功能。
这是一个练习和提高的过程,一个问题,你解决了,那么你再想想,能不能换种写法,也可以实现同一功能,或者说,你写出来的代码,能不能再精简一点,让程序执行效率更高,这个过程,就是一个进步的过程。
很多知识和经验的获得,并不是直接写在书让你看就可以得到的,需要自己去实践,开动脑筋,经验才能得到积累,编程水平才能有所提高。
看别人的程序,学习人家的思路。
这个在学习初期是很有用,通
过看别人的程序,特别是老师写出的具有一定水平的程序,可以使自己编程水平得到迅速的提高。
同时,也可以结合别人的编程手法,与自己的想法融合在一起,写出更高水平的程序,从中得到进步。
但要注意,切忌将学习变成抄袭,更不是抄袭完了就认为自己学会了,这样做只会使你退步。
尝试编写一下综合应用的程序。
从流水灯学起,到动态扫描,再
到中断,那么,你可以试试写一下时钟这种综合性应用的程序,不要小看时钟,要写好它不是一件容易的事情,它包括了单片机大部分的知识,比如有按键、动态扫描、中断等,如何协调好各功能模块正常工作,才是编程者需要学习的地方,当你单独写一个功能的时候,比如按键读取,你可能感觉很容易,因为你的程序什么也不做,只是读按键。
但把它和其它功能混合在一起,如何在整个程序运行中使每一部分都正常工作,这就不是写一个按键读取这么容易的事情,功能模块之间有可能会互相影响,比如你需要让数码管既能显示,又要去处理按键读取,怎么使这两部分都正常工作,这就是一个协调过程。
当你有了这个处理协调能力,你就算是入门了。
着重于培养解决问题的能力,而不是具体看自己编写了多少程序
或者做过什么。
“学单片机重点在于学习解决问题的思路,而不是局限于具体的芯片类型和语言”这一直是我的座右铭,是我学单片机学习单片机之后感悟出来的。
真正的能力不是你曾经编写过多少个可以实现的程序,而应该是:
“遇到没有解决过的问题,能利用自己已学的知识,迅速找到解决问题的方法。
”这个才是能力。
面对一个新程序时,多自己开动脑筋,不要急于找别人的程序。
有不少人面对一个新程序时,第一步想到的就是网上找别人写过的程序,然后抄一段,自己再写几句,凑在一起就完成任务,这虽然可能是省时间,但绝对不利你的学习。
当你接到一个程序时,应该先自己构思一下整个程序的架构,想想如何来完成。
有可能的话,画一个流程图,简单的可以画在脑子里,对程序中用到的数据、变量有一个初步的安排,然后自己动手去写,遇到实在没办法解决的地方,再去请教老师或同学,或看别人是怎么处理的,这样首先起码你自己动过脑想过,自己有自己的思路。
如果你一开始就看别人的程序,你的思维就会受限在别人的思维里,自己想再创新就更难了,这样你自己永远也没办法提高,因为你是走在别人的影子里。
学会提问题。
一般来说,学习过程中,你遇上的问题,多数人也
有遇上的,所以如果有什么不懂,你可以去问老师。
我觉得学习单片机最主要的要多提问,对于一个自己不是太懂的程序,自己一定要多提问几遍,这样不但有利于加深自己的印象还能从中学到不少别人的方法。
经过一个学期我对《单片机》这门课程的学习,不仅让我懂得了
很多程序的编写,还让我学到了很多对自己有用的学习方法。
总结这个学期来的我自己的学习情况,我觉得自己对编程进步了不少,懂得运用正确的学习方法学习单片机程序,不再去死记硬背指令了。
所以我觉得学习要不断总结学习方法,才能让自己学习不断进步。
交通信号灯设计报告
实验目的:
P1口的使用方法,延时程序的编写
实验要求:
在一个十字路口分为东西南北走向,信号等按以下的状态顺序工作:
初始状态0,东西、南北红灯全亮。
延时一定时间;
状态1,南北绿灯亮通车,东西红灯,延时一定时间;
状态2,南北绿灯闪烁几次转黄灯,东西仍然红灯,延时一定
时间;
状态3,南北红灯,东西绿灯通车,延时一定时间;
状态4,南北仍然红灯,东西绿灯闪烁几次转黄灯,延时一定
循环至状态1,继续
实验电路和流程框架图:
硬件电路
交通灯实训设备用最小系统板和信号灯组合而成。
2、软件编程
若各路口灯亮灭的时间间隔为2s钟,灯光闪烁时间间隔为0.5s。
用软件延时的方法,晶振频率12MHz时,一个机器周期为1us。
编写交通信号灯程序:
编写主程序,由R7做主程序的计数器,确定调用延
时时间为0.5s,从而获得交通灯的亮灭时间。
程序如下:
ORG0000H
LJMPMAIN
ORG0003H
LJMPINTRU0
ORG0030HMAIN:
SETBEA
SETBET0
CLRIT0
单片机按键的解决解决方案
1、单片机上的按键控制一般采用两种控制方法:
中断和查询。
中断必须借助中断引脚,而查询按键可用任何IO端口。
按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式;
还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。
2、中断形式
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n,每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器.
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组
第0组:
所有4bit用于指定响应优先级;
第1组:
最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;
第2组:
最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;
第3组:
最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;
第4组:
所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;
如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
每一个中断源都必须定义2个优先级。
有几点需要注意的是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
GPIO外部中断:
STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间智能使用一个,如:
PA0,PB0,PC0,PD0,PE0,PF0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能使用了,在此情况下我们使用类似于PB1,PC2这种末端序号不同的外部中断源,每一组使用一个中断标志EXTIx.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。
EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。
对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。
编写IO口外部中断步骤及其注意事项:
设置中断优先级组;
开启时钟;
设置中断线并对中断进
行初始化配置;
设置中断管理器NVIC各参数。
外部中断服务函数完成中断操作需要最终达到的目标。
3、矩阵形式
键盘矩阵原理:
a*b矩阵键盘由a条行线和b条列线组成,行线接端口P3P3.0、P3.1、P3.2……p3.;
列线接p.a,p3.……P3..按键位于每条行线和列线的交叉点上。
按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。
当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;
当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。
第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码合并得到按键的位置码,即是Y3Y2Y1Y0X3X2X1X0。
也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平.比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y3Y2Y1Y0x3X2X1X0为11101110即是0xEE.
全部按键码为:
矩阵键盘在单片机上的简单应用-----显示数码管:
0~F
#include
#defineucharunsignedchar
#defineuintunsignedint
Sbitbuzzer=P1_;
Ucharcode_dis[]=//0~9,A~F
{
0xC0,0XF9,0XA4,0xB0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0z88,0x83,
0xC6,0xA1,0x86,0x8E
};
Ucharcode_tab[]=//矩阵键盘按键位置码
0x77,0xb7,0xd7,0xe7,
0x7b,0xbb,0xdb,0xeb,
0x7d,0xbd,0xdd,0xed,
0x7e,0xbe,0xde,0xee
voiddelay
//延时函数
uchari;
while
for;
}
ucharscan//矩阵键盘扫描函数,得到按键号,采用线反转法
uchara,b,c,i;
P3=0XF0;
//P3口输出11110000
a=P3;
//读取列码
delay;
//防抖延时10ms
P3=0X0F;
//P3口输出00001111
b=P3;
//读取行码
c=a+b;
//得到位置码
for
ifreturni;
//查表得到按键序号并返回
return-1;
//无按键,则返回-1
Voidbeep//蜂鸣器发出声音,模拟按键声音
Uchari;
For
Buzzer=~buzzer;
Delay;
Buzzer=0;
Voidmain
ucharkey;
buzzer=0;
//关闭蜂鸣器
{key=scan;
//得到按键号
if//有按键则显示,并且蜂鸣器发出声音
{P0=dis[key];
beep;
扫描法:
由于按键没有接地,4行列正好占用8个I/O如果4行我们送P3.0到P3.3送入0111然后去读取列的值,如果P3.0的按键按下那么P3.4---P3.7的值等于0111,假如是第2个键按下的话那么读回来的值是1011,如果第3个键按下去读回来的值是1101,如果第4个键按下去读回来的值是1110,如果没有键按下去读回来就是1111。
所以我们就根据读回来的值来判断按下去的是那个键。
当然这是对P3.0这一行,因为矩阵键盘是扫描的,所以下次把P3.0给1P3.1给0对第2行,陆续的第行第4行,0111101111011110而每次都去从新扫描一遍列值列有4个值,以确定是那个键按下。
无论何时任何一个时间有一个按键被按下就跳出循环。
当然不可能有2个键刚好一起按下你的手没有这么好的力度,就算有2个键一起按键,程序也有先后检测的顺序,只能检测一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 按键 总结