当前位置:文档之家› 一种新的单片机按键处理的思路

一种新的单片机按键处理的思路

一种新的单片机按键处理的思路
一种新的单片机按键处理的思路

一种新的单片机按键处理的思路

关于一种新的按键处理的思路,今天和应广的技术支持通了一个电话,讨论到了按键下理的问题,他和我说了有两种按键处理的方法,一种就是我用的那一种,即每

10ms判断一次按键的情况,然后oldkey,newkey的方法,他还说了另一种更为简单的办法,当然这个也只能用在最简单的情况,他说每30ms判断一次按键的情况,如果按键是按下的情况那么就执行相应的按键处理程序,仔细分析一下他说的很有道理啊!!!

下面分析一下这种情况的可行性,首先无论是按键按下或是释放的时候都有一个抖动的时间,这个时间一般是10ms左右,首先从逻辑上来分析一下这个问题消抖的目

的无非就是将这个不稳定的抖动的状态的多次高低电平的变化,使其只有作用一次低电平(假如这里是低电平有效)的相应的处理,条条大路通罗马,假如一第一个下降沿的时候单片机检测到这个低电平,而后是按键的处理程序,然后是按键处理的失能,想要再次使能按键的作用只有等待按键的再次变为高电平,试想如果这个检测的时间如果太短或太长的话会有什么情况,如果这个时间设置的太短的假如是1ms那么在这个10ms的时间里会他就会检测到

10次,现在以最坏的情况一分析的话,如果按照原来的按键处理程序的话,按照最坏的情况就会有5次按键作用的情况,也就是说有5次高电平和5次低电平都被检测到了,有5次的按键使能故能最多作用5次的样子.假如这个时间足够长的话,比如检测一次要1年的时间,那么这其间的按键作用都会丢失掉,这是非常可怕的啊,其实这个时间在逻辑上只能大于10ms就行了,只要这个时间大于1倍的按键抖时间就能保证在这个抖动时间里按键最多只检测两次,而只有在抖动时间里按键的检测次数超过3次才能导致多次触发的情况发生,因为这个抖动的时间一共是20ms这个情况是在最坏的情况下考虑到的最坏的,最坏的情况下没有按键的多次作用那么在其他情况下也就更不会有按键的多次作用了.

下面直接上源代码:

/************************************************ ************************************************* **

函数功能:扫描按键值,交将扫描到的按键触发信息转换成数字赋给Key_num

函数入口:无

函数出口:无

作者

:任丁

************************************************* ************************************************* */

void KeyScan(void)

{

if(KEY1==0&&KEY2==1&&KEY3==1)

{

key_num=1;

//KEY1键按下,返回1

return;

}

elseif(KEY1==1&&KEY2==0&&KEY3==1)

{

key_num=2;

//KEY2键按下,返回2

return;

}

elseif(KEY1==1&&KEY2==1&&KEY3==0) {

key_num=3;

//KEY3键按下,返回3

return;

}

elseif(KEY1==1&&KEY2==0&&KEY3==0) {

key_num=4;

//KEY2键和KEY3键同时按下,返回4

return;

}

//这里还可以添加更多的按键,和更多的返回值,霸气不?!?!?!

//这里有一个问题啊,就是这里是三个按键的情况,如果为大于三个按键的情况

//而同时要处理多个按键按下的问题用这种if else if else if ...else的形式

//就会有一个严峻的问题,不能很好的区分每一种按键的情况,因为这时会有一个非常复杂的逻辑空间

//区别这每一种按键的

//逻辑条件,如果有更多的按键,那么这种方法肯定是行不通的,但是如果只是最简单

//的情况,也就是只会按下一个键的情况,那样的话问题就会简单很多

//总而言之使用if else if else if else if else

的这种结构的关键就在于每一个if 或 else if 语句

//都必顺是不同的情况,如果不是这样的话就会有重和漏掉的情况的发生

//对于多个按键的情况有一个较为聪明的解决的办法,就是把在在每一个if或else if 语句里把每一个按键的情况

//都写清楚,使每一种分支都和别的分支都没有逻辑上的包含的被包含的情况都,从而用这种方法构建的if else if ...else

//是一个没有包含和被包含情况的逻辑关系非常清晰的空间,也就是实际上这是一个数学上的一个非常简单的问题

//最终的可能的情况有2的按键次数次方的个数,一个关键的问题就是书写条件时先写if 和 else if 里面的语句而后再

//用一个else语句来把剩下的情况全部概括,其实思路就是抓信己知的情况,从而把未知的情况剩出来。编程时这

//些情况直接用一个else语句来概括,这样的话对于这些没有定义的情况统统返回一个0,在KEY_process()里面这些情况

//全部作为是无效按键的情况,这些情况下的按键触

动情况就会直接作为无效按键的情况,KEPY_process()会直接路出

//这些情况从而对于这些情况想当于是没有任何的作用的.只有有作用的按键触发情况才会转而去执行相应的按键处理程序

//特别要注意的一点就是这些有作用的按键触发情况有都是最细小的逻辑体,这样才话能够做到不重不漏,严谨有序

//这一种方法是非常有实践意义和应用价值的

else

{

key_num=0;

//如果所有按键都没有按下就返回0或255,这里返回0

return;

}

}

/************************************************

************************************************* **

函数功能:根据扫描到的不同的按键触发情况,执行相应的按键的处理功能

函数入口:无

函数出口:无

作者

:任丁

************************************************* ************************************************* */

void KeyProcess(void)

{

if(KeyScan_Flag==1)

//按键扫描的时间30ms到了

{

KeyScan_Flag=0;

KeyScan();

if(0

{

if(key_num==1)

{

if(Key1_EnableFlag==0)

{

//此处添加KEY1按键的处理程序

Key1_EnableFlag=1;

return;

}

elseif(key_num==2)

{

if(Key2_EnableFlag==0)

{

//此处添加KEY2按键的处理程序 Key2_EnableFlag=1;

return;

}

}

elseif(key_num==3)

if(Key3_EnableFlag==0)

{

//此处添加KEY3按键的处理程序

Key3_EnableFlag=1;

return;

}

}

else

{

return;//实际上不会走到这一条语句,因为return 回的有效值为1到255

//除此之外没有其他值,而如果为0或者大于255时,是不会进入这个分支的

//直接在第二层的else语句执行相应的程序

}

}

else

//按键无效,即无键按下

{

Key1_EnableFlag=0;

//按键使能标志位置0,使能按键作用

Key2_EnableFlag=0;

//按键使能标志位置0,使能按键作用

Key3_EnableFlag=0;

//按键使能标志位置0,使能按键作用

Key4_EnableFlag=0;

//按键使能标志位置0,使能按键作用

return;

}

}

else

//按键检测使能标志为0,即没有到达按键检测的时间间隔,这里设置为10ms,不进行按键检测

{

return;

}

}

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.doczj.com/doc/dc7917220.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

自己写的按键单片机程序

自己写的按键单片机程序 用4个按键来控制数码管显示的内容#include#define duan P0//段选#define wei P2//位选unsigned char code wei1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code duan1[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ge,shi,bai,a,b;sbit key1=P1;sbit key2=P1 ;sbit key3=P1 ;sbit key4=P1 ;void keys();//按键函数void s(unsigned char xms);//延时函数void DigDisplay(); //动态显示函数void init(); //初始化函数void main(void){init(); while(1){DigDisplay();keys();} }void DigDisplay(){unsigned char i;unsigned int j;bai=a/100;shi=a%100/10;ge=a%10;i=0;wei = wei1[i];//发送位选duan = duan1[bai]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[shi]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[ge]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐}void init() {key1=1;key2=1;key3=1;key4=1;TMOD=0X01;TH0=(65536- 45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void s(unsigned char xms){unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void times() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;b++;if(b==20){b=0;a++;if(a==256){a=0;}}}void keys(){if(key1==0){s(10);if(key1==0){a++;TR0=0;if(a==256)a=0;while(!key1)Dig Display();}}if(key2==0){s(10);if(key2==0){TR0=0;if(a==0)a=256;a--

基于单片机的键盘控制设计

摘要 单片机即单片微型计算机(Single-Chip Microcomputer),是集CPU,RAM,ROM, 定时,计数和多种接口于一体的微控制器,广泛应用于各个领域[1]。 本论文设计的单片机键盘主要由AT89C51单片机控制。该键盘控制系统是由单片机最小系统及LED显示电路组成。使用单片机C语言进行编程,实现可设定本论文主要介绍了键盘设计的软、硬件部分的设计,以及在设计、调试过程中遇到的问题及解决方案。 本设计包括硬件设计和软件设计,其中的硬件设计包括时钟电路,复位电路,4*4矩阵式键盘电路和LED数字显示电路。其中需要选择使用的扫描方式;为防键盘判断失误,导致实现多次按键按键的显示问题,需要去抖动的处理,其显示需要七段数码管显示。 本设计的与众不同之处在于其既能实现常规数字的显示,同时还能实现作为简单的电子琴,不同的键表示不同的音符;还能够实现简单计算功能。 本课题设计的键盘控制系统结构简单,造价成本低,功能齐全,具有很强的实用性。关键词:AT89C51单片机矩阵式键盘按键扫描

Abstract The monolithic integrated circuit namely monolithic microcomputer (Single-Chip Microcomputer), is collection CPU, RAM, ROM, fixed time, counting and many kinds of connections in a body micro controller.Widely applies in each domain. The present paper design monolithic integrated circuit keyboard mainly controls by at89C51 monolithic integrated circuit.This keyboard control system is composed by the monolithic integrated circuit smallest system and the LED display circuit. The use monolithic integrated circuit C language carried on the programming, the realization may establish the present paper mainly to introduce the keyboard designed the software and hardware part design, as well as the question and the solution which in the design, the debugging process met[13]. This design including the hardware design and the software design, hardware design including the clock electric circuit, repositions the electric circuit, the 4*4 matrix form keyboard electric circuit and the LED digita display circuit. Need choice use scanning way; In order to guard against the keyboard judgment fault, causes the realization many times the pressed key demonstration question, needs to vibrate processing, its demonstration needs seven section of nixietube demonstrations. This design out of the ordinary place lies in it already to be able to realize the conventional numeral demonstration, meanwhile can realize takes the electric piano, the different key expresses the different note; Also can realize the simple computation function[14]. This topic design keyboard control system structure is simple, the construction cost cost is low, the function is complete, has the very strong usability. Key words: AT89C51list slice machine Matrix form keyboard Pressed key scanning

51单片机按键控制数码管程序

#define uint unsigned int #define uchar unsigned char uchar c; sbit p10=P1^0; sbit p11=P1^1; sbit p12=P1^2; sbit p13=P1^3; sbit p14=P1^4; sbit p15=P1^5; sbit p16=P1^6; sbit p17=P1^7; void delay(uint z); int b[]={0,1,2,3,4,5,6,7};//设置每一位显示的数字 unsigned char code Tab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳极数码管 int a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void main() { EA=1; EX0=1; IT0=1; P1=0xff; while(1) { for(c=0;c<8;c++)//数码管扫描显示

P2=a[c]; P0=Tab[b[c]]; delay (1); } } } void delay(uint z) { uint a,b; for(a=z;a>0;a--) for(b=110;b>0;b--); } int_0()interrupt 0 { EA=0; if(p10==0) b[0]=(b[0]+1)%10; if(p11==0) b[1]=(b[1]+1)%10; if(p12==0) b[2]=(b[2]+1)%10; if(p13==0) b[3]=(b[3]+1)%10; if(p14==0) b[4]=(b[4]+1)%10; if(p15==0) b[5]=(b[5]+1)%10; if(p16==0) b[6]=(b[6]+1)%10; if(p17==0) b[7]=(b[7]+1)%10;

单片机按键的解决方法

单片机按键的解决解决方案 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口外部中断步骤及其注意事项:

基于单片机的模拟手机键盘

信息工程学院课程设计报告书题目 :基于单片机的模拟手机键盘 专业:电子信息科学与技术 班级:_ 学号: 学生姓名:_ 指导教师: 2013年10月18日

信息工程学院课程设计任务书 学号学生姓名专业(班级)电子信息 设计题目基于单片机的模拟手机键盘 单片机晶振频率:12MHz; 电源电压: +5v 设 计 技 术 参 数 编程控制单片机端口实现按键输出0~9 十个数字并在液晶上显示出来。 设 计 要 求 两天 工 作 量 注:可填写课程设计报告的字数要求或要完成的图纸数量。 工 作 计 划 [1]康华光,陈大钦 . 电子技术基础—模拟部分(第五版)[M]. 北京:高等教育出版社, 2005 参 考[2] 郭天祥 .51 单片机 C 语言教程[ M]. 北京:电子工业出版, 2012 资 料 指导教师签字教研室主任签字

信息工程学院课程设计成绩评定表 学生姓名:学号:专业(班级):电子信息 课程设计题目:基于单片机的模拟手机键盘 指导教师评语: 成绩: 指导教师: 年月日

摘要 本文是做基于89C52 单片机的手机键盘的设计;利用P0 端 3*4 的键值来模拟手机键盘 中的数字,将采用编程的方法来实现使用12 个键来做到0 到 9 的数字输出和退位清零,并 在液晶屏上显示。手机作为现代移动通信的载体,其技术也得到了很大的发展,手机的键盘布局已经成了各大厂商门竞争的主要方面,本次设计提高了我们对单片机的操作能力,让我们更加认识到单片机的广阔前景,对于我们更加深入学习和了解单片机提供了极大的帮助。 关键词:矩阵键盘,LCD液晶屏, 89C52 单片机。

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

#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) {

用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个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

基于单片机的模拟手机键盘

信息工程学院课程设计报告书题目: 基于单片机的模拟手机键盘 专业:电子信息科学与技术 班级: _ 学号: 学生姓名: _ 指导教师: 2013年 10月 18日

信息工程学院课程设计任务书

信息工程学院课程设计成绩评定表

摘要 本文是做基于89C52单片机的手机键盘的设计;利用P0端3*4的键值来模拟手机键盘中的数字,将采用编程的方法来实现使用12个键来做到0到9的数字输出和退位清零,并在液晶屏上显示。手机作为现代移动通信的载体,其技术也得到了很大的发展,手机的键盘布局已经成了各大厂商门竞争的主要方面,本次设计提高了我们对单片机的操作能力,让我们更加认识到单片机的广阔前景,对于我们更加深入学习和了解单片机提供了极大的帮助。关键词:矩阵键盘,LCD液晶屏,89C52单片机。

目录 1 任务提出与方案论证.............................................................................................................. - 2 - 1.1方案一...................................................................................................................... - 2 - 1.2 方案二.......................................................................................................................... - 2 - 1.3方案对比与选择............................................................................................................ - 2 - 2. 系统硬件电路的设计............................................................................................................. - 4 - 2.1 微处理器的选择........................................................................................................... - 4 - 2.2单片机的基本机构........................................................................................................ - 4 - 2.3键盘接口电路................................................................................................................ - 5 - 2.4消除抖动........................................................................................................................ - 6 - 3 详细设计.................................................................................................................................. - 7 - 3.1程序流程设计............................................................................................................... - 7 - 3.2硬件电路设计............................................................................................................... - 8 - 4 总结 ......................................................................................................................................... - 9 -参考文献.................................................................................................................................... - 10 -附录 ........................................................................................................................................... - 11 -

单片机八个按键控制八个led灯程序

#include #include void delay(void) {unsigned char a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);} unsigned char Key_Scan(); void main(void) { unsigned char ledValue, keyNum; ledValue = 0x01; while (1) { keyNum = Key_Scan(); switch (keyNum) { case(0xFE) : ledValue = 0x01; break; case(0xFD) : //返回按键K2的数据 ledValue = 0x02; break; case(0xFB) : //返回按键K3的数据 ledValue = 0x04; break; case(0xF7) : //返回按键K4的数据 ledValue = 0x08; break; case(0xEF) : //返回按键K5的数据 ledValue = 0x10; break; case(0xDF) : //返回按键K6的数据 ledValue = 0x20; break; case(0xBF) : //返回按键K7的数据 ledValue = 0x40; break; case(0x7F) : //返回按键K8的数据 ledValue = 0x80; break; default:

break; } P0 = ledValue;//点亮LED灯 } } /****************************************************************************** * * 函数名: Key_Scan() * 函数功能: 扫描键盘 * 输入: 无 * 输出: 读取到的键值 ******************************************************************************* / unsigned char Key_Scan() { unsigned char keyValue = 0 , i; //保存键值 //--检测按键1--// if (P1 != 0xFF) //检测按键K1是否按下 { void delay(void) {unsigned char a,b; for(a=0;a<200;a++) for(b=0;b<200;b++);} if (P1 != 0xFF) //再次检测按键是否按下 { keyValue = P1; i = 0; while ((i<50) && (P1 != 0xFF)) //检测按键是否松开 { Delay10ms(1); i++; } } } return keyValue; //将读取到键值的值返回 }

单片机按键识别方法之一

单片机按键识别方法之一 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 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

基于单片机按键报警器制作

郑州科技学院 《单片机》课程设计 题目基于按键控制的声光报警器学生姓名王阳 专业班级电动五班 学号xxx 院(系)电气工程学院 指导教师叶冬 完成时间 2015年 11 月 6 日

目录 1 课程设计的目的 (1) 2课程设计的任务与要求 (2) 3设计方案与论证 (3) 3.1方案选择与论证 (3) 3. 2 声光报警器的流程图 (4) 4设计原理及功能说明 (5) 4.1 元器件选用原理 (5) 4.2 总体电路图 (5) 5单元电路的设计(计算与说明) (5) 5.1 声光报警电路设计 (6) 5.2 单片机最小系统设计 (7) 6硬件的制作与调试 (5) 6.1 制作工具的操作 (8) 6.2 声光报警器的调试 (9) 7总结 (10) 参考文献 (15) 附录1:总体电路原理图 (18) 附录2:实物图 (19)

附录3:元器件清单 (20) 附录4:程序 (19)

1课程设计的目的 声光报警器在实际的生活中可以见到许多,运用于生活的许多方面,既有硬件实现的,也有硬件和软件同时控制执行。本课题基于微机原理与接口技术的学习,运用汇编语言实现一个声光报警器的功能。报警和发光同步进行。因此用它进行报警探测监控,具有良好的隐蔽性,白天和黑夜都可以使用,而且其抗干扰能力强。报警系统利用单片机控制技术,自动探测发生在布防区内的侵入行为,产生报警信号,一旦发生突发事件,就会向人们发出报警提示,从而让人即使采取应对措施。 同时,通过课程任务设计,可以很好的对课本知识运用于实践,同时也可以激发学习于专业相关的一些知识,从而扩大自己知识面的广度。其次,通过课题任务设计,在让我们思考使用学习工具的同时也学会去发现问题解决问题这一过程。 2.课程设计的任务与要求 (1)设计一种基于按键控制的声光报警器。 (2)基于单片机最小系统上按照电路设计焊接好各元器件,运用汇编语言实现一个声光报警器的功能。 (3)当报警按钮按下时扬声器报警,在报警期间报警指示灯亮,当报警解除按钮按下则解除报警。 (4) 在设计电路的过程中熟练地掌握各个元器件的用途。 (5)了解电路板的制作流程。 (6)掌握电路板的焊接方法与技巧。 3.设计方案与论证 3.1 方案选择与论证

51单片机按键控制花样灯

51单片机按键控制花样灯 时间:2012-09-10 13:50:11 来源:51hei 作者: /**************************************************** * 本程序实现用按键控制花样灯。 * * 当K1按下时,灯从0xfe向左跑一遍; * * 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置;* * 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。* * 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。* * 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。* ******************************************************/ ************************************************* 连接方法:P0接独立按键JP5;P2接LED灯接口JP1 * ***********************************************************/ #include //头文件,函数声明 #include //定义按键所在位 sbit K1=P0^0; sbit K2=P0^1; sbit K3=P0^2; 页脚内容1

sbit K4=P0^3; sbit K5=P0^4; unsigned char led; unsigned char j; void delayms(unsigned char ms) // 1ms标准延时 { while(ms--) { for(j=0;j<110;j++); //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确} } void main() { //P2=led; unsigned int i; while(1) { /********************************************* 页脚内容2

按键控制单片机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

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