单片机51 去抖按键程序
单片机按键消抖处理方法

单片机按键消抖处理方法(非软件延时)
以STC89C51单片机为例,STC89C51的P1.0、P1.1、P1.2分别接了3个按键。
下面代码为按键扫描处理部分函数,此部分代码通俗易懂,方便移植。
简单解释一下代码的含义:
定义一个含有3个元素的整形数组(静态变量),分别储存3个按键连续16次的状态。
Main函数不断的循环执行本函数刷新KeyDelay数组的状态,以KeyDelay[0]对应的P1.0为例,当按键没有按下的时候,KeyDelay[0]为0,即KeyDelay[0]变量的所有位均为0,
当该按键按下的时候,连续16次扫描便会使KeyDelay[0]变为0xffff(所有位都是1),
而当按下或者释放产生抖动时,那么连续16次扫描后不可能所有位都为0或都为1。
所以便可以用这种方法来进行软件消抖。
文档由胡保进编写。
51单片机智能窗帘软件设计框架及思路

本系统在光线下通过光照检测采集的光照强度值,把采集的数据通过AD模数转换成数字信号,以51单片机为主控芯片,根据实时光照强度实现窗帘打开和关闭。
整个系统在各个模块的分工合作下完成,实现自动控制、手动控制、定时控制、红外控制等功能内在联系。
主程序的任务是系统初始化,开关中断,对按键进行扫描,判断是否有按键按下,经过分析及处理后,执行相应的手动控制、定时控制、自动控制和红外控制等的指令,这四个模式可以自动互相切换。
显示模块是将各个模块信息显示在LCD1602屏幕上。
主程序还操控步进电机工作和显示步进电机的工作。
系统流程图如下图4-1所示。
图4-1 系统总流程图(一)显示模块程序设计执行该子程序时,首先对LCD1602显示屏初始化,对所有显示内容进行清零,接着对时钟进行初始化、对定时器初始化,根据程序中设定的时间显示时间。
当LCD1602的寄存器RS工作状态为高电平时,选择指令寄存器;读写选择RW,执行写操作;使能端EN从高电平到低电平过程中下降沿信号,将显示数据送到P2口,LCD执行数据指令,判断是否执行完毕。
若执行完成,数据显示,子程序退出。
若没有,返回到选择指令寄存器继续重复执行以前的步骤。
流程图如下图4-2所示。
图4-2 显示模块流程图(二)按键模块程序设计在本系统中,根据任务需求,设计了五个按键,分别是阈值+1、阈值-1、主功能键、手动开窗和手动关窗。
五个按键相互独立存在,互不干扰,与单片机串联。
但是这里我们需要先解决一个问题,就是对按键进行消抖。
任一按键无论是按下还是松开都会发生抖动,有时按了多次反应表现延迟或者按得快没有反应,这都是按键抖动的表现,所以这时就需要对按键进行消抖,按键消抖如果处理不好,可能还会给单片机发送错误指令,导致单片机运行工作错误。
为了解决这个问题,我采用了利用软件延迟的方法来解决按键抖动的问题。
思路:当扫描到某个按键按下时,编写程序时判别按键电路能否闭合是先通过2毫秒的延时,确定按下按键后再延时10毫秒,再次扫描按键时,如果此时按键还是按下状态,说明上面的方案是可行的。
单片机按键电容消抖电路

单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
基于51单片机按键长按短按效果源程序

基于51单片机按键长按短按效果源程序[复制链接]* 实验名称:多位数按键加减** 晶振:12MHZ* 内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描** 并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DEC=P3^2; //S18#define DataPort P1 //定义数据端口程序中遇到DataPort 则用P1 替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsigned char code HEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0123456789unsigned char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayUs2x(unsigned char t);//函数声明void DelayMs(unsigned char t);void Init_Timer0(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num=0,key_press_num;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DEC=1;Init_Timer0();while (1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下DelayMs(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_ADD){key_press_num++;DelayMs(10); //10x200=2000ms=2sif(key_press_num==200) //大约2s{key_press_num=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_press_num=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DEC)key_press_num++;DelayMs(10);if(key_press_num==200) //大约2s{key_press_num=0;while(!KEY_DEC){if(num>0) //减操作num--;//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作的速度}}}key_press_num=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];// Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
C51中对按键的处理方法

2007 年 11 月 第 4 期吉林师范大学学报 (自然科学版)Journal of J ilin Normal University ( Nat ural Science Edition)№. 4 Nov. 2007C51 中对按键的处理方法王春武1 ,李 岩2 ,孟祥英3 ,尹冬梅4(1. 吉林师范大学 信息技术学院 ,吉林 四平 136000 ;2. 山东临邑第一中学 ,山东 临邑 251500 ; 3. 四平德科电子有限公司 ,吉林 四平 136000 ;4. 东北师范大学 物理学院 ,吉林 长春 130024 ;)摘 要 :单片机控制系统中大多使用按键来实现控制功能 . 非编码键盘中如何消除按键瞬间的抖动和响应按键操作是设计者必须要考虑的问题 . 本文通过软件消除了按键抖动 ,并讨论如何实现响应一次键操作 . 文中还提供C51 单片机的按键识别的实用例程 .关键词 :单片机 ;按键 ;响应 ;抖动中图分类号 : TP368 文献标识码 :A 文章编号 :1000 - 1840 - (2007) 04 - 0086 - 02 在单片机控制系统中 ,通过按键实现控制功能是 M Hz ,编程软件为 Keil uVision2 [ 5 ] . 很常用的. 对按键处理[1 ]的重要环节是去抖动[2 ] ,即除 按下和抬起瞬间的抖动. 而消除抖动后面临的更大问 题就是解决按键的响应问题 ,包括按键的一次响应 ,一 键多功能等. 下面从两个方面来进行相应的讨论.1 按键去抖问题1. 1 原理阐述常用的按键由于机械触点的弹性作用 ,一个按 键开关在闭合时或断开时不会马上稳定下来 ,因而 在闭合和断开的瞬间都伴随着一连串的抖动 ,如图 1. 抖动时间的长短由按键的机械特性来决定 ,一般 为 5~10 ms. 这种抖动对人来说是感觉不到的 , 但图 1 按键抖动void delay (unsigned char i) {unsigned char j ;while ( - - i) {j = 180 ; while ( - - j) ;}}图 2 触发器去除抖动对单片机来说 ,则是完全可以感知的 ,因为单片机的 1. 2 举例说明 处理速度在微秒量级. 如果不对按键消除抖动则会 假设有电路图如图 3 所示 ,要完成如下要求的 引起程序处理的误操作. 去抖动的方法有很多种 ,如 电路控制 :当按键按下时 L ED 亮灭状态取反. 使用 R - S 触发器等的硬件方法[ 3 ] , 运用不同算法的各种 软 件[ 4 ] 方 法 等. 硬 件 方 法 会 增 加 成 本 和 体 积 ,如图 2 ;软件方法用的比较普遍 , 现 在 常 应 用 加 固定软件延时来去抖动. 具体方法就是在有按键按 下时 ,利用软件延时 10ms 或稍长的时间 ( 根据具体 键的机械特性来确定) 后再次检测按键是否按下 ,实 际上是避开了按键按下时的抖动时间. 实践证明 ,不 对按键释放的抖动进行处理 ,也能满足设计的要求.在程序中 添 加 此 函 数 则 可 以 实 现 延 时 , 参 数 i 表示 延 时 i 个 毫 秒. 应 用 中 可 以 这 样 调 用 : delay 图 3 按键触发 L ED 电路图(10) ,表示延时 10 ms. 本例中单片机的晶振采用 12收稿日期 :2007 - 09 - 24第一作者简介 :王春武 (1978 - ) ,男 ,吉林省松原市人 ,现为吉林师范大学信息技术学院助教 ,硕士. 研究方向 :计算机软件与应用.— 86 —main ( ){for ( ; ;){L ED = 1 ;/ /初始状态L ED灯灭if ( ! P10){delay (10) ;/ /延时10ms去抖按键仍然是按下的则执行while语句,系统会一直查询按键状态,只有按键抬起才可以退出循环结构,从而可以一次响应.方法二:加入按键标志( ! P10) / /确认去抖后按键是否真的按下P30 = ! P30 ;/ /触发L ED灯亮}}} bit k eymai n ( )mark = 0 ;/ /一次按键响应封锁标志2按键响应问题{for ( ; ;){if ( ! K & & ! key mark )2. 1问题阐述如图3所示,主要讨论如何在单片机设计中实现对按键的一次响应问题,即每次按下键时,系统只响应一次按键处理.从程序设计的表面上看,执行L ED = ! {delay (1) ;延时10ms去抖if ( ! K ){key mark = 1 ;/ /封锁按键,直到按键抬起L ED = ! L ED ;/ / L ED状态去反}}else if ( K )L ED语句即可,但实际应用中却出现L ED一直处于闪key mark = 0 ;/ /标志清零,为下次按键做好准备}}烁的情况,经分析发现:当程序中确定按键已被按下分析:其中key mark是位变量,只有当按键按时,会将L ED的状态取反,可当主程序不断的扫描按键下且keymark = 0时,程序才会继续确认是否真的时,按键一直处于按下的状态,系统会频繁的调用此语有键按下.经过延时去抖,程序中将key mark的值句,从而导致了,显然程序无法实现预期的要求. 置 1 ,然后执行其它语句,设想按键没有抬起,则因为现在介绍一下本文所用的方法. key mark的值已经变为 1 ,if ( ! K & & ! key mark 2. 2举例说明)将不会再次成立,直到当前的按键抬起,即else if下面是实现按键一次响应问题的常用两种方法. ( K)成立时key mark的值才重新为0.这样处理可方法一:查询方式main ( ){for ( ; ;){if ( ! k ){delay (1) ;延时10ms去抖if ( ! k ){L ED = ! L ED ;/ / L ED状态去反While ( ! k) ;/ /查询按键状态,只有按键抬起则退出循环}}}} 以实现每一次按键,系统只会调用一次键处理.3结论虽然以上的两种方法在实践中都有所应用,但是两种方法在效率上却大不相同.方法一,通过查询方式来判断按键系统就一直进行while死循环,从效率上看,CPU的执行效率变低.方法二,当第一次检测到按键真的按下处理完相应的程序后,CPU无分析:当有键按下时,经过延时去抖后,如果按需浪费时间等待按键抬起操作,从而可以用大部分键真的按下,则执行L ED状态取反语句,然后如果时间进行其它的处理,提高CPU的执行效率.参考文献[ 1 ]张素芬.键处理程序的设计方法[J ] .电子仪器仪表用户,1997 , (3) :12~15.[ 2 ]肖广安.一种软件去除键抖动的方法[J ] .单片机与嵌入式系统应用,2001 , (7) :63~65.[ 3 ]马家辰,孙玉德,张颖. MCS - 51单片机原理及接口技术[ M ] .哈尔滨:哈尔滨工业大学出版社,2004.[ 4 ]曾旖,奚大顺,李向阳.按键开关的抖动与消除方法[J ] .电子世界,2005 (9) :55~56.[ 5 ]孙鉴. KELL u ision2环境下仿真单片机程序[J ] .计算机辅助工程,2006 , (2) :74~77.The Handles Method on Button in C51W A N G Chun - w u 1 , L I Yan 2 , M EN G Xiang - ying3 , Y IN Dong - mei 4(1. College of In formation and Technology ,Jilin Normal Universit y ,Siping 136000 ,China ;2.№1 Middle School of Linyi ,Linyi 251500 ,China3. Siping Decaux Ltd. ,Siping 136000 ,China ;4. College of Physics ,Nort heast Normal Universit y ,Changchun 130024 ,China)Abstract :MCS - 51 system is mostly controlled with keys. It must be considered for designers which are eliminating the dithering of keys and operating respond of keys in non - coding keyboard. In this thesis ,the dithering problem of keys was solved by software and discussed how to come true once key operation of respond. In addition ,some applied procedures were provided with C51 language in the paper.Key words :MCU ;key ;respond ;dit hering感谢您试用AnyBizSoft PDF to Word。
51单片机实验指导书

.51系列单片机原理与应用实验华南师范大学物理与工程工程学院微机教研室20010年9月目录实验须知 (2)实验一数字量输入输出实验 (4)实验二交通灯控制实验 (6)实验三定时与中断实验 (8)实验四串行通信实验 (11)实验五串行A/D转换实验 (13)实验六现实人体视觉暂留特性测试实验 (14)实验七实时时钟制作实验 (17)实验八简易电子琴制作实验 (18)实验九 EEPROM应用—数字密码锁 (20)实验十综合实验:教学板自检程序设计 (25)实验十一数据采集—火灾报警装置的软硬件设计 (26)附录一实验教学板 (27)附录二实验用软件使用说明 (28)实验须知一、预习要求1.实验前认真阅读实验指导书的相关内容,明确实验目的和实验任务。
2.实验前应做好预习报告,在报告中,要求画出所设计的实验电路原理图、程序流程图,编写好程序,并对程序加以注释,还要拟订好实验步骤。
二、实验要求1.按实验中心安排的时间到指定实验室上实验课,不要迟到、缺席。
有特殊原因不能在原安排时间来实验时,须提前一天通知实验中心负责教师。
2.认真完成每次实验的各项任务,实验结果要请指导教师检查。
教师对实验内容提问,并对完成者进行记录。
3.爱护设备,保持清洁,不得在实验室内大声喧哗,不要将食物带入实验室,不擅自更换设备。
4.在实验箱(板)通电状态下,不要用手随意触摸电路板上除按键和开关以外的芯片等其它元器件。
,严禁带电操作,即所有接线、改线和拆线操作均应在不带电的状态下进行。
5.实验中若发生异常情况应立即切断电源,并向指导教师报告,检查原因,避免再次发生类似情况。
6.实验完毕,请整理好实验设备后再离开实验室。
三、实验报告要求实验报告必须使用实验报告专用纸,书写要工整、清楚,并在下一次实验时交给指导教师。
实验报告应包括以下内容:1.实验名称、实验人姓名、学号、班级、同组人姓名。
2.实验目的、任务(内容)。
3.各任务程序流程图、自编程序清单,对程序须给出适量注释(例如:变量和某些寄存器的作用,关键程序段的功能等)。
按键消抖与时间按键

TH0=(66636-1000)/256;//对应12M晶振是1ms
TL0=(66636-1000)%256;
T++;
}
至于定时器初始化和主函数就不需要我一一说明了吧,初学单片机一般都会先学到中断里面就有定时器中断
前面是用的定时器作为时间,书上用的空语句作为延时时间,其实我们写的其他和扫描不相关的语句还是可以作为延时;这就是我的第二种方法:
{
Unsigned char key;//定义按键的键值变量
if(P2!=0xff)
{
delay(10);//延时10ms
key=P2;
while(P2!=0xff)
delay(10);//延时10ms
switch(key)
{//返回键值
case 0xfe:return 1;break;
case 0xfd:return 2;break;
2.如何消抖
3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖
4.消抖的时间是不是必须10ms
5.按键消抖的方式是不是一定像书上的那样,如何消抖更节省CPU,且更简单
按键如果不消除抖动,那么单片机检测到的低电平的次数就不止一次,那我们按键一次,单片机会检测到多次,比如我们把按某个按键设置按一次成某个变量加1,结果按一次就加了很多次,这样我们就不能精确的通过按键来调整我们想要的参数,所以我们消除抖动的目的就是要实现按一次按键让单片机读出一次按键操作
从上面这两个例子我们可以看出:按键只要设置的一些单一的功能就算出现抖动也不会影响我们设置的功能;假如我们设置的按键一次实现数码管显示的数字加1,那没有加消抖的话单片机会读到好几次按键,那我们按一次出现的结果就是加3或者加4或者某个未知数X了哦,又假如,我们的按键功能是按一次实现led灯打开,再按一次实现led灯关闭,这个是一个按键2个功能了,假设现在状态是led开启的,我们想关闭它,没有消抖的话,单片机读出来的按键次数是个未知数X,X是3,5,7之类的奇数还好能关闭,如果X是偶数的话,那我们不管按多少次那个led灯是不是都开启的呀,由上面两个例子可以看出:按键设置的如果是重复操作或者一个按键有2个以上的功能就必须消抖了
51单片机按键消抖程序原理

51单片机按键消抖程序原理一、引言按键消抖是嵌入式系统编程中常见的问题之一,尤其是在使用51单片机时。
51单片机是一款常用的微控制器,广泛应用于各种嵌入式系统中。
按键作为常见的输入设备,在51单片机应用中经常被使用。
由于按键的机械特性,当按键按下或释放时,会产生机械抖动,给系统带来误操作。
因此,了解并编写按键消抖程序对于保证系统的正常运行至关重要。
二、消抖原理按键消抖,简单来说,就是通过一定的算法,消除按键产生的机械抖动,从而准确识别按键的状态。
其原理主要基于以下两点:1.机械抖动的特点:按键的机械抖动主要表现为按键触点之间的快速开关,产生一系列微小的电信号。
这些信号通常包含真实的按键输入信号和噪声信号。
2.消抖算法:通过分析这些信号,识别出真实的按键输入信号,并忽略噪声信号,从而达到消除机械抖动的目的。
常用的消抖算法有阈值比较法、防抖延时法、防抖滤波法等。
三、消抖程序实现下面以51单片机为例,介绍一种简单的阈值比较法消抖程序实现:```cvoidkey_debounce(intkey_pin){//定义按键引脚intdebounce_time=50;//消抖时间,单位毫秒intthreshold=5;//阈值,可以根据实际情况调整intkey_state=0;//按键状态,初始化为0(未按下)intlast_key_state=0;//上一次的按键状态while(1){//读取按键状态key_state=digitalRead(key_pin);last_key_state=key_state;//判断按键是否按下if(key_state==LOW){//按键按下,开始消抖if(millis()-last_key_state>=debounce_time){//经过一定时间,确定按键状态if(key_state==digitalRead(key_pin)){//检测到真实的按键输入信号//这里可以进行相应的操作,例如点亮LED灯等}else{//检测到噪声信号或其他干扰,忽略}}else{//消抖时间不足,忽略当前状态}}else{//按键释放,忽略当前状态}}}```上述程序中,通过设置一个阈值和消抖时间,来判断按键状态是否发生变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define START_TIMER1 TR1=1
#define STOP_TIMER10 TR1=0
#define KD_VAL 15
sbit Ktemph=P1^0;
sbit Ktempl=P1^1;
sbit Ktime=P1^2;
sbit Kset=P1^3;
unsigned char Irbufnum;
unsigned char Irbuf[6];
unsigned char Recposi;
unsigned int idata Irbuffer[50];
unsigned char Kscanbuf[8];
unsigned char Kscan[8];
unsigned char Kcount[8];
RCAP2L = 0XB8 ;
TR2=1;
EX0=1;/*ÔÊÐíÍⲿ0ÖжÏ*/
EA = 1;/*¿ªÈ«¾ÖÖжÏ*/
TR0=0;
TMOD|=1<<4;/*¼ÆÊ±Æ÷1×÷Ϊ16λ*/
ET1=1;
TH1=0xf8;
TL1=0xcc;
TR1=1;
PX0=1;/*ÍⲿÖжÏ0ÓÅÏÈ*/
IT0=1;/*ϽµÑØ´¥·¢ÖжÏ*/
/*ET0=1;*/
/*ES = 1;*//*ÔÊÐí´®ÐпÚÖжÏ*/
TCLK = 1 ; /*¶¨Ê±Æ÷2ÓÃ×÷²¨ÌØÂÊ·¢ÉúÆ÷*/
RCLK = 1 ;
/*¾§Õñ 22.1184 £¬ 6T £¬²¨ÌØÂÊ9600*/
RCAP2H = 0xff ;
if(!Ktime) Kscanbuf[2]=1;else Kscanbuf[2]=0;
if(!Kset) Kscanbuf[3]=1;else Kscanbuf[3]=0;
if(!Konoff) Kscanbuf[4]=1;else Kscanbuf[4]=0;
if(!Kmode) Kscanbuf[5]=1;else Kscanbuf[5]=0;
}
else if(timer>2000&&timer<5000&&Startflag)
{
Irbuffer[Recposi++]=0;//for test 0
Irbufnum++;
Irbufposi=Irbufnum/8;
Irbuf[Irbufposi] = (Irbuf[Irbufposi] << 1)&0xfe ;
/************************************************
test time
***********************************************/
if(Firstint)
{
TH0=0;
TL0=0;
START_TIMER0;
Recposi=0;
Send(0x04);//onoffprocess
}
if(Kready[5])
{
Kready[5]=0;
Send(0x05);//modeprocess
}
if(Kready[6])
{
Kready[6]=0;
Send(0x06);//fanprocess
}
if(Kready[7])
{
Kready[7]=0;
#include <REG52.h>
#define TIME_0_80_MS 0xfa3d
#define TIME_1_20_MS 0xf75c
#define TIME_1_80_MS 0xf30a
#define TIME_2_20_MS 0xf028
#define TIME_3_80_MS 0xe4a3
unsigned char Kready[8];
bit Dokeyscan;
void Send(unsigned char);
void Key_Scan()
{
unsigned char i;
if(!Ktemph) Kscanbuf[0]=1;else Kscanbuf[0]=0;
if(!Ktempl) Kscanbuf[1]=1;else Kscanbuf[1]=0;
Send(0x07);//swingprocess
}
}
void MCU_Init(void)
{
TMOD=0X01;
SCON=0X50;/*ģʽ3£¨¼ÆÊýÆ÷1ÓÃÓÚ²úÉú²¨ÌØÂÊÐźţ©£¬ÔÊÐí½ÓÊÜ£¬*/
PCON=0x00;/*·ÇË«²¨ÌØÂÊ*/
TCON=0X00;
{
Kscan[i]=Kscanbuf[i];
Kcount[i]=0;
}
else //°´ÏÂÇÒÉÏ´ÎÒ²°´Ï£»
{
if(Kcount[i]==KD_VAL)return;
Kcount[i]++;
if(Kcount[i]==KD_VAL)Kready[i]=1;//KD_VAL´ÎɨÃèºóÈ·ÈÏÓÐЧ£¬
{
unsigned char i;
MCU_Init();
/*for(i=0;i<60;i++)
Irbuffer[i]=0;*/
/*for(i=0;i<6;i++)
SendInt(Irbuf[i]);*/
while(1)
{
//if(Recposi>49)
//Recposi=0;
if(Irok)
{
for(i=0;i<6;i++)
sbit Konoff=P1^4;
sbit Kmode=P1^5;
sbit Kfan=P1^6;
sbit Kswing=P1^7;
bit Startflag;
bit Firstint=1;
bit Irok;
bit Intflag;
bit Sendok;
unsigned char Irrecivenum;
Startflag=1;
}
else if(timer>13000&&timer<16000&&Startflag)
{
Irbuffer[Recposi++]=3;//for test stop
Startflag=0;
Irok=1;
Firstint=1;
Recposi=0;
Irbufnum=0;
STOP_TIMER0;
}
void Send(unsigned char c)
{
SBUF = c;
while(TI == 0);
TI =0;
}
void SendInt(unsigned int i)
{
unsigned char a=i>>8&0xff;
Send(a);
a=i&0xff;
Send(a);
}
void main()
#define TIME_4_20_MS 0xe1c2
#define TIME_4_50_MS 0xdf99
#define TIME_5_20_MS 0xda8f
#define START_TIME_L TIME_3_80_MS
#define START_TIME_H TIME_4_20_MS
#define BIT_1_L TIME_1_80_MS
Send(Irbuf[i]);
Irok=0;
}
if(Dokeyscan)
{
Dokeyscan=0;
Key_Scan();
Key_Process();
}
}
}
void Exint0_Isr(void)interrupt 0
{
unsigned int timer;
unsigned char Irbufposi;
}
}
}
}
void Key_Process()//¸öÈ˹۵㣺ûÓÐÅжÏÊÇ·ñ¼üÊÍ·Å£¬Ò»´Î³¤°´¼ü¿ÉÄܶà´Î²É¼¯£»
{
if(Kready[0])
{
Kready[0]=0;
Send(0x00);//temp++process
}
if(Kready[1])
{
Kready[1]=0;
}
else
{
Irbuffer[Recposi++]=8;
Startflag=0;
Irok=0;
Firstint=1;
Recposi=0;
Irbufnum=0;
STOP_TIMER0;
}
}
}
void Time1_Isr(void) interrupt 3
{
TH1=0xf8;
TL1=0xcc;
Dokeyscan=1;
Firstint=0;
Irok=0;
}
else
{
STOP_TIMER0;
timer=TH0;
timer=((timer << 8) | TL0);
TH0=0;
TL0=0;
START_TIMER0;
//for(i=0;i<60;i++)
if(timer>22000&&timer<25000)