当前位置:文档之家› 单片机中按键“一次”处理的优化方法

单片机中按键“一次”处理的优化方法

单片机中按键“一次”处理的优化方法
单片机中按键“一次”处理的优化方法

单片机中按键“一次”处理的优化方法

以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。

以前的程序如下:

其中p10为P10端口做键盘输入,p10= =0为按下,调用的delay程序为

void delay(unsigned int cnt)

{

unsigned char i;

while(cnt--!=0)

for(i=100;i!=0;i--);

}

键盘扫描子程序如下:

void scankey()

//扫描按键

{

if(p10==0)//p10口按键及处理程序

{

delay(100);//键盘防抖动

if(p10==0)

{

do delay(10);//如果键盘一直按下则一直“延时”等待松开

while(p10==0);

TR0=!TR0;

//松开时相应

}

}

}

所以从以上程序看如果程序一直按下则单片机一直会在延时程序等待,占用了整个单片机

我想通过flag可以很好的解决这个问题

bit flag=0;定义标志

以下是键盘处理程序:

void scankey()

//扫描按键

{

if(p10= =0&&flag= =0)//p10口按键及处理程序,其中flag如果为1就不用再扫描

{

delay(100);

flag=1;

delay(5);

}

if(p10= =1&&flag= =1)//如果p10为1,flag为1

说明已经被按下并抬起

{

TR0=!TR0;

//松开时相应

flag=0;

//标志清零,为下次按键做准备(其实为一次处理) }

}

程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。

改过后长按按键,数码管显示正常。

细细回味非常有意思,和大家分享。

按键实现0~9999计数器 单片机

按键调节数码管显示 功能:通过按键加减数码管所显示的数字 按下k1加1,最大加到9999 按下k2减1,最小减到0 按下k3清零复位 C语言程序 //---------------------------------------------------------------------- //名称:按键调节数码管显示 //---------------------------------------------------------------------- //功能:通过按键加减数码管所显示的数字 // 按下k1加1,最大加到9999 // 按下k2减1,最小减到0 // 按下k3清零复位 //---------------------------------------------------------------------- //姓名:陈润源 //地点:内江职业技术学院 //时间:2019年4月6日21:40:41 //---------------------------------------------------------------------- #include #define uchar unsigned char #define uint unsigned int sbit k1 = P1^0; //加 sbit k2 = P1^1; //减

sbit k3 = P1^2; //复位 void key(void); void display(void); uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //数组 char m=99,n=98; //显示初值,m,n的值决定开机显示数值 //**************************************** //延时程序 //**************************************** void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //*********************************************** //显示程序 //*********************************************** void display(void) { P2=0X08; P0=table[m%10]; //显示个位 delayms(5); P2=0X04; P0=table[m/10]; //显示十位 delayms(5); P2=0X02; P0=table[n%10]; //显示百位 delayms(5); P2=0X01; P0=table[n/10]; //显示千位 delayms(5); } //*************************************************** //按键处理 //*************************************************** void key() { if(k1==0) //检测按键是否被按下 { //延时消抖 delayms(10); if(k1==0) //再次检测是否真正按下按键 { m++; //m自加一 if(m>=100) //如果m加到100则n加一 (限制m的取值范围) 个位、十位最大显示99 {

键盘右边数字键失灵解决方法.doc

键盘右边数字键失灵解决方法 键盘是我们主要的输入设备,一般我们正常使用不会出现什么故障,但是也会偶尔某些键失灵或者其他问题,不知道该如何解决?下面我们就几个案例来介绍一下电脑键盘右边的数字健失灵的解决方法: 案例实操一: 网友问题:我的电脑不能使用键盘右边的小数字键区域了,NumLock 灯是亮的,前几天还好好,我又没有动什么地方。请问问题出在哪里? 最佳答复:如果你使用的是Windows2000/XP的话,可能是由于启动了鼠标键功能,小数字键盘就被用来控制鼠标指针,失去了输入功能。选择控制面板辅助功能选项鼠标,然后将使用鼠标键去掉即可。 案例实操二: 在有些时候,电脑用户发现键盘的小键盘0~9不能用了,点击没有反应,加减 乘除按钮还是可以使用的,遇到这种问题不要着急,那是因为键盘的小键盘数字键被锁定了。

现在我打开数字键,步骤如下 》连续按下SHIFT键5次或者按下SHIFT+CTRL+ALT 》在跳出来的粘滞键选择设置 》将会跳出辅助功能选项,并选中鼠标选项卡。 》把使用鼠标键前面的对号去掉 》点击应用确定即可 这样设置,我们的小键盘上的数字键就可以使用了。 也许有的电脑用户还不知道,小键盘的数字键是可以当鼠标用的,方法正好和上面的操作相反。 如果把小键盘的数字键当鼠标使用,只要在使用鼠标键前面打钩就可以了。 此时8 代表向上移动按钮,2 代表向下移动按钮,5 代表回车按钮等等! 补充:机械键盘保养技巧 使用电脑前或使用一段时间后,最好洗洗手 这个小习惯,可以让你的键盘不会累积污垢,可以长期保持键盘表面的光洁如新

坚持不在使用电脑的时候吃东西 食物碎屑防不胜防,杜绝根源,可以达到保养键盘的目的 保持情绪稳定,不要拍打键盘 在坚固的材料也受不了暴力 所以,玩游戏的时候,请放平心态,淡定一些 玩电脑时不抽烟,不喝水或饮料 杜绝烟灰,杜绝可能键盘进水的任何风险 当然,网吧例外,毕竟不是自己的不心疼 定期清扫键盘和清洗键帽 频率以三个月为宜,再懒也不要超过半年,否则清理起来会更麻烦 相关阅读:鼠标常见故障分析 一、按键不灵活或失灵 在鼠标的按键中,左键使用最频繁,因此也是最容易损坏的按键,笔者就以左键为例谈一下按键失灵的维修办法。有的朋友认为增加按键行程可以解决问题,其实这样做并不好,把失灵的按键开关更换掉才是根本的解决办法。

笔记本键盘失灵的一般解决方法.doc

笔记本键盘失灵的一般解决方法 笔记本键盘失灵这里有2种情况,其中一种是我们比较常见的按字母键会显示成数字的情况发生,其实编辑遇到问最多的就是这种情况,对笔记本电脑比较了解的朋友都知道,笔记本电脑小键盘数字键和字母键是整合在一起的,一般按fn Numlk 键可以智能切换到小数字键盘。部分笔记本品牌可能不一样,具体大家请参考自己笔记本电脑使用说明书,都有详细介绍。 下面我们来介绍下另外一种情况,出现笔记本电脑按键失灵,按下去没任何反应,或者是按键并不是有规律的显示,这种情况多数是笔记本键盘出现问题了,解决办法可以尝试清理下笔记本键盘,对每个键进行检查,看看是不是存在某些按键按下去没弹起来,导致按别的键都没用的情况发生,另外如果真的是笔记本自带键盘损坏,编辑不建议大家更换,笔记本换键盘费用是比较高的,我们可以买一个USB键盘做外接键盘就可以了,如果以上方法都不行,来个死马当活马医。 修改笔记本键盘的驱动:通过我的电脑打开系统属性,选择硬件标签:打开设备管理器,我们发现中文Windows XP操作系统下,默认的键盘驱动是标准101/102键或Microsoft自然PS/2键盘。 1. 右键点击选择更新驱动程序,会出现硬件更新向导:选择从

列表或指定位置安装(高级) ,单击下一步,选择不要搜索。我要自己选择要安装的驱动程序。 单击下一步,进入选择要为此硬件安装的设备驱动程序页去掉复选框显示兼容硬件前的小勾。在标准键盘型号栏中选择Japanese PS/2 Keyboard (106/109 Key) ,单击下一步,弹出更新驱动程序警告,点是。确认设备安装窗口继续点是。 2. 完成硬件更新向导。重新启动计算机。 修改注册表:单击开始菜单,点运行,输入regedit ,打开注册表,进入HKEY_LOCAL_MACHINE\ SYSTEM\ControlSet001\Control\Keyboard Layouts ,里面有很多子项,通过观察我发现,以0804 结尾的都是简体中文输入法。打开E00E0804 ,可以看到右侧子项里有Layout File 子项,双击打开该项,将数值数据中的kbdus.dll 改为kbdjpn.dll ,确定即可。依此类推,可以将所有的以0804 结尾的子项中Layout File 全部改为kbdjpn.dll ,具体就根据自己常用的输入法进行选择了。然后重新启动计算机就好了! 产生笔记本键盘失灵的原因还是比较多的,比较常见的就是最开始为大家介绍的那些,另外某些病毒也会破坏电脑按键,建议大家遇到笔记本电脑键盘按键失灵先对电脑进行杀毒看看,之后再使用以上方法。

单片机按键的解决方法

单片机按键的解决解决方案 1、单片机上的按键控制一般采用两种控制方法:中断和查询。中断必须借助中断引脚,而 查询按键可用任何IO端口。按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。 2、中断形式 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每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这种末端序号不同的外部中断源,每一组使用一个中断标志EXTI x.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。 对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。 编写IO口外部中断步骤及其注意事项:

单片机频率计数器课程设计

课程设计报告 课程名称:单片机课程设计 题目:基于单片机的频率计数器设计 学院:环境与化学工程系:过程装备与测控工程 专业: 班级: 学号: 学生姓名: 起讫日期: 指导教师:

摘要 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。本课程设计主要设计一个简易的频率计,来实现信号在0-9999HZ范围内周期变化的方波频率的测定。 该文主要介绍了基于STC89C52 单片机频率计的设计方案和实现方法,该系统主要由硬件和软件两部分组成,其中重点给出了具体硬件电路图和软件流程图以及具体工作原理。硬件部分通过洞洞板的布线设计帮助,可以确保焊接时尽量少的飞线和出错。软件通过keil μvision编译及调试,其中在P1.7口编入了一个5500HZ的方波,用以仿真调试该频率计的软硬件功能是否能够实现输出频率的功能。另外,本设计多增加了一个按键功能,通过一个按键来控制定时计数器的开始和关闭。该频率计还带有3*3的矩阵键盘,可以作为扩展应用区,通过编程实现。本设计中用的是LED共阴数码管,输出频率时采用的事动态显示的方法。 关键词:频率计;单片机;动态显示

目录 一、频率计数器的设计任务和要求 (1) 1.1 频率计数器的设计任务 (1) 1.2 设计要求及发挥部分 (1) 二、方案的总体设计 (1) 2.1 方案的设计 (1) 2.2 方案的整体框图 (2) 2.3 方案的说明 (2) 三、硬件设计 (2) 3.1 单片机的最小系统 (2) 3.1.1 上电复位电路 (2) 3.1.2 晶振电路 (3) 3.2 LED数码管显示电路 (3) 3.3 整体电路 (4) 四、软件设计 (4) 4.1 程序流程图 (5) 4.2 初始化子函数 (5) 4.3 延时子函数 (5) 4.4 中断子函数 (5) 五、系统的调试和说明 (6) 5.1 C程序的说明 (6) 5.2 C程序编译的结果 (6) 5.3 实物图 (7) 六、设计总结与心得体会 (8) 6.1设计总结 (8) 6.2 设计心得 (9) 七、参考文献 (9) 附录 (10)

键盘失灵的原因及解决方法.doc

键盘失灵的原因及解决方法 由于导致电脑键盘失灵的问题有许多方面,解决处理方法也不尽相同。下面我们将对键盘所出现的各种失灵现象进行全面分析,希望对大家有一定的帮助。 一、键盘间歇性失灵 具体表现为键盘突然之间按键全部没有反应,键盘状态指示灯也同时熄灭。用户情急之下用手拍打、移动键盘,或重启之后,键盘又可以恢复工作。造成该情况的最大原因,可能是键盘连接线由于弯折及老化,内部连接线断裂造成虚接,由于移动后断裂处再次连接,所以可以再次使用。动手能力强的玩家可以尝试更换键盘连接线进行解决。 二、键盘出现串键现象 该键盘失灵现象,表现为用户按下一个按键后,出现按键其它按键的输入反应。比如按下 A 键后,出现 B 字母,这通常是由于键盘主控芯片内部的编码库出现问题所导致的,该键盘失灵问题对于厂商来说,可以通过重新刷写固件来进行修复。但是对于普通用户来说,则无法修复,如果失灵的键盘尚在质保期,可以送到维修点进行维修更换,如果已经过了质保期,那没有办法,只能重新购买新键盘来使用了。

三、背光键盘插入后无法识别 游戏玩家常常会遇到新买的背光游戏键盘,与电脑连接后出现无法识别或是安装失败的键盘失灵现象,但是更换到其它电脑上时,又可以正常使用。对于花大价格购入背光游戏键盘的玩家来说,该现象无异于当头冷水。 造成该键盘失灵的原因,主要是由于背光游戏键盘由于照明和可编程设计等原因,对于USB供电需求,相比一般键盘要更为严格。由于电脑USB接口存在供电不足问题,无法满足背光键盘供电需求所造成的。玩家可尝试使用有源USB HUB进行挽救,另外避免使用前置USB接口。 四、键盘单个按键失灵 薄膜电路断裂是单个/多个按键失灵的原因 该键盘失灵现象相比于上几种情况来说,更加让人闹心。键盘整体使用正常,但是一个或多个按键,出现无法使用或间歇性失灵问题,该问题产生的原因,主要是由于键盘内部的薄膜导电线路出现断裂虚接造成。动手能力极强的玩家,可以使用万用表测量找出断路后,使用导电漆或铅笔进行修复。普通玩家还是直接更换键盘更为省心省事。 五、手机来电话导致键盘失灵

单片机按键控制蜂鸣器发声程序

#include typedef unsigned char uint8; typedef unsigned int uint16; uint8 Count,i; sbit Speak =P1A2; //蜂鸣器器控制脚 sbit keyl =卩3人2;〃按键控制引脚 sbit key2 =P3A3; sbit key3 =P3A4; /* 以下数组是音符编码 */ uint8 code SONG[] ={ 0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,}; void Time0_Init()// 定时器 T0 方式 1 ,定时 10ms { TMOD = 0x01; IE = 0x82; TH0 = 0xDC; TL0 = 0x00; void Time0_Int() interrupt 1 { TH0 = 0xDC; TL0 = 0x00; Count++; } void delay (uint8 k)// 按键防抖延时 { uint8 j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } void Delay_xMs(uint8 x)// 发声延时 { uint8 i,j; for(i=0; i

Count = 0; // 中断计数器清 0 Addr = i *3; while(1) { Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { TR0 = 0; Delay_xMs(100); } else if (Temp1 == 0x00) //歌曲结束符 { return; } else { Temp2 = SONG[Addr++]; TR0 = 1; while(1) { Speak = ~Speak; Delay_xMs(Temp1); if(Temp2 == Count) { Count = 0; break; } } } } }void keyscan (void)// 按键切换声音函数{ if(key1==0) { delay(10); if(key1==0) {

单片机一个按键的多次击键组合判别技巧

《一个按键的多次击键组合判别技巧》大话篇 小匠自从上次在旧社区发表了一篇《<程序编写规范倡议书>大话篇》后,好久没有发表"高"论了.急坏了一帮MM,以为小匠退隐江湖了。 (斑竹在旁问道:“MM”不是“Mie Mie”,而是“Ma Ma”吧?) 论坛内外谣言四起,有人说小匠改行了,不做程序匠,改做泥水匠了;还有人说小匠上阿富汗反恐怖去了;其实非也,只因新板论坛启用后,小匠一直用不惯...... (斑竹在旁笑道:是“用不来”吧?) 今天,小匠再次隆重登坛献演。贴一个小程序段..... (斑竹道:我看是“蹬痰现眼”吧?) (程序匠人贴完帖子,下到后台,一边洗着手上残余的浆糊,一边哼着小曲:“如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠,……”) (一黑客悄悄贴近匠人,将一个废弃的浆糊桶扣到匠人头上......)

(匠人忙问:“斑竹,谁把灯给关了?”) (众人哈哈大笑!......) 一个按键的多次击键组合判别技巧 有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、还有各种组合击键方式。可以用以下程序来做。如果按键闭合时间<500MS,判断为一次短击(0); 如果按键闭合时间>500MS,判断为一次长击(1); 两次击键时间间隔应<700MS,如果按键释放后700MS内无键按下,则结束读键。 读键完毕返回一个键号值KEY_NUM。其意义如下: KEY_NUM 意义 00000000 无键按下过 00000001 无意义 00000010 单次短击 00000011 单次长击 00000100 短击+ 短击 00000101 短击+ 长击 00000110 长击+ 短击 00000111 长击+ 长击

单片机实现触摸按键

感应按键电路分析 感应按键电路分析: 感应按键是刚刚在电磁炉上运用的一种新技术,其主要特点是使电磁炉易清洁,防水性能好。目前在电磁炉上用的感应按键主要有天线感应式及电容式,我们目前用的是利用人体电容的电容式感应按键 感应按键原理如下面的图式; 感应按键电路包括信号产生、信号整形2个单元:首先由信号产生单元产生约几百KHz的高电平占空比约50%的信号;然后信号整形单元对所产生的信号进行整形,整形过程类似于开关电源工作过程;最后将信号送至MCU 的AD口。 当有人体靠近感应按键时,将会形成一个对地的电容在信号整形的高电平期间分流一部分电流,致使整形后的信号下降,并在人体离开前一直维持在下降的电位上;而当人体离开后,整流后的信号又会上升到原来的电位水平。 由于存在电路耦合及寄生电容,所以一般用下降沿和上升沿来识别感应按键的响应动作。

*************************************************************************************************** *************************************************************************************************** *************************************************************************************************** *************************************************************************************************** *************************************************************************************************** *************************************************************************************************** *************************************************************************************************** ************************************************************************************************** 原理图:示意图1,按键AD每个单独检测,不用切换

键盘失灵的三大原因和相应的处理办法

电脑键盘突然失灵了,怎么按都没反应,不少常用电脑的人都会碰到这个问题,这个时候千万别再使劲的按按键,这样只会把键盘弄的更糟,键盘失灵的原因很多的,我们要对症下药的排查和解决问题,下面的是最常见的原因和解决办法 一:数字小键盘失灵 如果是台式电脑小键盘失灵的话,原因可能在于没有开启小键盘注意看Numlock键上的灯亮了没有,没亮的话,按下Numlock键开启了小键盘就可以使用了 如果是笔记本键盘失灵的话,因为笔记本电脑键盘的空间有限,在设计的时候把数字小键盘的功能融合在字母键里了如果笔记本本键盘右边的按键打不出字母都是数字话。这个时候可以按 fn+Numlk 键就可以切换字母/数字输入,有些菜鸟不知道这一点,当打不出字母的时候,还以为是键盘坏了本文摘自:https://www.doczj.com/doc/636754453.html, 二:部分按键失灵 键盘部分按键失灵一般是因为电脑键盘内部线路板有毛病,键盘内部线路板或导电塑胶长期不清洁有灰尘污垢太多,从而使电路无法接通。就会导致部分按键失灵!如果是这个原因的话,我们就要清理键盘,将里面的污垢灰尘,碎渣清理干净。 下面是具体步骤: 1.拧开螺丝打开键盘。打开键盘时注意按钮面(我们用键盘时面向我们的那面)向下,线路板向上,这样按键上的导电塑胶才不会脱落本文摘自: https://www.doczj.com/doc/636754453.html, 2.

2.线路板通常都是薄薄的一层塑料膜,我们用高浓度酒精棉花(医用酒精棉花也可以,浓度越高的越好)轻轻的擦洗,把灰尘污垢都擦掉按键失灵的部分尤其要多擦。 3.对失灵的那部分导电塑胶进行清洗,如果是失灵的那部分导电塑胶损坏了的话,我们可以把不常用按键上的导电塑胶换到已损坏的部分,因为有些键基本上是用不到的,物尽其用延长键盘寿命本文摘自:https://www.doczj.com/doc/636754453.html, 4.导电塑胶和线路板之外的键盘角落部分可用软毛刷刷,将回程刷掉 5.检查有些焊接模块是否断裂脱开,如果会使用电烙铁的话可以将其焊接上 6.待酒精挥发干净后,在再把键盘重装上! 三:键盘驱动导致键盘失灵 如果是键盘驱动不兼容导致键盘失灵的话,我们就只有更新键盘驱动了, 1,找到设备管理器里的键盘驱动更新驱动 1)在桌面上,右键点我的电脑》点属性》选择硬件》打开设备管理器》找到键盘,Windows XP对应的键盘驱动是—标准101/102键或Microsoft自然PS/2键盘本文摘自: https://www.doczj.com/doc/636754453.html, 2). 右键点“标准101/102键或Microsoft自然PS/2键盘”,选更新驱动程序,弹出硬件更新向导,点“下一步”。 3)进入“选择要为此硬件安装的设备驱动程序”办复选框“显示兼容硬件”小勾去掉。在“标准键盘型号”栏中选择“Japanese PS/2 Keyboard (106/109 Key)”,单击“下一步”,4)弹出“更新驱动程序警告”,点“是”。在“确认设备安装”窗口继续点“是”。本文摘自:https://www.doczj.com/doc/636754453.html,

用51单片机中断编写的4x4键盘程序

用51单片机中断编写的4x4键盘程序 应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文《MSP430和 AT89C51单片机4x4键盘C程序》),如果用中断编写,设置中断响应在下降沿时执行中断,则程序编写不用去抖动判断,所以相比较要简单很多!下面用汇编和C语言两种方式编写4X4键盘程序! 一、汇编程序 ORG 0000H LJMP MAIN ORG 0003h Ljmp ZD0

ORG 000Bh LJMP TZD0 ORG 0013h Ljmp ZD1 ORG 001Bh LJMP TZD1 ORG 0040H MAIN: Mov TMOD,#66h MOV TH0,#0ffh MOV TL0,#0ffh MOV TH1,#0ffh MOV TL1,#0ffh SETB EA SETB ET0 SETB TR0 SETB ET1 SETB TR1 SETB IT0 SETB IT1 SETB EX0 SETB EX1 xh: mov P1,#0feh

Lcall Delay mov P1,#0fdh Lcall Delay mov P1,#0fbh Lcall Delay mov P1,#0f7h Lcall Delay SJMP xh ZD0: JNB P1.0,dat1 JNB P1.1,dat2 JNB P1.2,dat3 JNB P1.3,dat4 dat1: mov P2,#06h ;1 sjmp ZD0R dat2: mov P2,#5bh ;2 sjmp ZD0R dat3: mov P2,#4fh ;3 sjmp ZD0R dat4: mov P2,#66h ;4 ZD0R: reti ZD1: JNB P1.0,dat5

单片机按键连接方法

单片机按键连接方法总结(五种按键扩展方案详细介绍) 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。 1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。 这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。 2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。 这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。 3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。 这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。这种方案的程序其实也不难。 4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

51单片机独立按键程序查询法和外部中断两种

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 左右流水灯实验 * 使用的IO : LED使用P2,键盘使用P3.1 * 实验效果: 按下K1键, * 注意: ******************************************************************************* / #include #include #define GPIO_LED P2 sbit K1=P3^1; void Delay10ms( ); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main(void) { unsigned int i,j; j=0xfe; //1111_1110 while(1) { GPIO_LED=j; if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) {

单片机按键识别方法之一

单片机按键识别方法之一 1.实验任务 每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。 2.电路原理图 图4.8.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。 4.程序设计方法 (1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说, 当我们按下一个按键 时,总希望某个命令只 执行一次,而在按键按 下的过程中,不要有干 扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。 因此在按键按下的时候,图4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况 下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及 硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可 以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候, 总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状 态。具体的一个按键从按下到释放的全过程的信号图如上图所示: 从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

基于单片机的光电计数器课程设计

计控学院 College of computer and control engineering Qiqihar university 电气工程课程设计报告题目:基于单片机的光电计数器 系别电气工程系 专业班级电气123班 学生姓名宋恺 学号2012024073 指导教师李艳东 提交日期 2015年6月 24日 成绩

电气工程课程设计报告 摘要 光电计数器是利用光电元件制成的自动计数装置。其工作原理是从光源发出的一束平行光照射在光电元件(如光电管、光敏电阻等)上,每当这束光被遮挡一次时,光电元件的工作状态就改变一次,通过放大器可使计数器记下被遮挡的次数。光电计数器的应用范围非常广泛,常用于记录成品数量,例如绕线机线圈匝数的检测、点钞机纸币张数的检测、复印机纸张数量的检测,或展览会参观者人数。 光电计数器与机械计数器相比,具有可靠性高、体积小、技术频率高、能和计算机链接实现自动控制等优点。本文即介绍基于MCS-51单片机的光电技术器。 关键词:单片机;光电计数器;数码显示;自动报警

齐齐哈尔大学计控学院电气工程系课程设计报告 目录 1 设计目的及意义 (1) 2 设计内容 (1) 2.1 系统整体设计 (1) 2.1.1 实验方案 (1) 2.1.2 光电计数器结构框图 (2) 图1 光电计数器结构框图 (2) 2.2系统硬件设计 (2) 2.2.1稳压直流电源电路 (2) 2.2.2发射接收电路 (3) 2.2.3显示电路 (3) 2.2.4报警电路 (4) 2.2.5硬件系统 (4) 2.3系统软件设计 (6) 3 结论7 4 参考文献 (8)

按键控制单片机PWM输出设计

学号1322010110 天津城建大学 单片机原理及应用A课程 设计说明书 按键控制单片机PWM输出设计起止日期:2016年05月30日至2016年6月10日 学生姓名 班级 成绩 指导教师(签字) 控制与机械工程学院 2016年6月10日

目录 第一章系统方案设计 (1) 1.1 PWM (1) 1.2 STC12C5A60S2简介 (1) 1.3 仿真工具介绍 (2) 1.3.1 Protues简介 (2) 1.3.2 Keil uVision3简介 (4) 第二章硬件电路设计 (5) 2.1 复位电路 (5) 2.2 时钟电路 (5) 2.3 按键中断 (5) 2.4 显示电路 (6) 第三章程序设计流程图 (7) 第四章系统仿真 (8) 4.1 仿真图 (8) 4.2 程序 (8) 4.3 PCB............................................................................................................... 错误!未定义书签。参考资料 .................................................................................................................... 错误!未定义书签。

第一章系统方案设计 1.1 PWM PWM的全称是Pulse Width Modulation(脉冲宽度调制),它是通过改变输出方波的占空比来改变等效的输出电压。 1.2 STC12C5A60S2简介 STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。 1)管脚说明: 1、P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。当P0口 作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 2、P1.0/ADC0/CLKOUT2 标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 3、P1.1/ADC1 4、P1.2/ADC2/ECI/RxD2 标准IO口、ADC输入通道2、PCA计数器的外部脉冲输入脚,第二串口数据接收端 5、P1.3/ADC3/CCP0/TxD2 外部信号捕获,高速脉冲输出及脉宽调制输出、第二串口数据发送端 6、P1.4/ADC4/CCP1/SS非 SPI同步串行接口的从机选择信号 7、P1.5/ADC5/MOSI SPI同步串行接口的主出从入(主器件的输入和从器件的输出) 8、P1.6/ADC7/SCLK SPI同步串行接口的主入从出 9、P2.0~P2.7 10、P2口内部有上拉电阻,既可作为输入输出口(8位准双向口),也可作为高8位地址总线使用。 11、P3.0/RxD 标准IO口、串口1数据接收端 12、P3.1/INT0非 外部中断0,下降沿中断或低电平中断 13、P3.3/INT1 14、P3.4/T0/INT非/CLKOUT0 定时器计数器0外部输入、定时器0下降沿中断、定时计数器0的时钟输出 2)A/D转换器的结构: STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口,有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型IO口,用户可以通过软件设置将8路中的任何一路设置为A/D 转换,不须作为A/D使用的口可继续作为IO口使用。 单片机ADC由多路开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器以及ADC_CONTER

用计数器中断实现100以内的按键计数[1]

3.33 用计数器中断实现100以内的按键计数 一. 单片机系统功能简介: 本例利用计数器中断实现按键计数,这与此前的按键计数程序看起来比较相似,但是用方法完全不同。 本例用T0计数器中断实现按键计数,由于计数寄存器初值为1,因此P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。 二.单片机系统硬件电路设计: 2.1 proteus原理图: 2.2 原件清单:

三.软件设计: 3.1 主程序流程图: 3.2 程序清单: #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 }; uchar Count=100; void main() { P0=0x00; P2=0x00; TMOD=0X06; TH0=TL0=256-1; ET0=1; EX0=1; EA=1; IP=0X02; IT0=1; TR0=1; while (1)

{ P0=DSY_CODE[Count/10]; P2=DSY_CODE[Count%10]; } } void Clear_Counter()interrupt 0 { Count=0; } void Key_Counter() interrupt 1 { Count=(Count-1)%100; } 四.系统调试 4.1 在PROTEUS7.5仿真步骤 1将程序在KEIL中编译,直到达到要求的功能为止; 2在PROTEUS中绘制硬件图(在PROTEUS仿真时可以不添加最小系统电路;实际电路中需要); 3将KEIL C中编译好的HEX文档加载到PROTEUS中; 4按下K1开始计数,按下K2可以清零。

51单片机C语言实验及实践教程_8.按键识别方法之一

51单片机C语言实验及实践教程_8.按键识别方法之一 发布: 2009-4-04 12:57 | 作者: 孙青安 | 查看: 88次 1.实验任务 I/O并行口直接驱动LED显示 每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。 2.电路原理图 图4.8.1 3.系统板上硬件连线

(1.把“单片机系统”区域中的P3.7/RD端 口连接到“独立式键盘”区域中的SP1端口上; (2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到 L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。 4.程序设计方法 (1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而 在按键按下的过程中,不要有干扰进来,因为,在按下的过程中, 一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因 此在按键按下的时候,图4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除 掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际 上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个 办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰 信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着 一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个 按键从按下到释放的全过程的信号图如上图所示: 从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms 以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

相关主题
文本预览
相关文档 最新文档