工作原理:单片机控制DC9V电机工作,电机通过减速箱后带动一个机械机构转动,挤压洗手液流出,每旋转一圈挤压一次洗手液,限位开关给系统输入一个信号,LED显示挤压洗手液的次数。SW4为电路板安装盒子前盖开关,当前盖闭合时,红灯亮2秒,红外光控间隙工作(比如工作1毫秒,停止499毫秒,一直这样循环工作)。当有东西挡住红外光控时,接收端接收到信号,绿灯亮,电机通电工作,行程开关计数。1、SW1可以用拨码开关,用来切换减速箱输出轴旋转圈数是1圈和2圈,旋转1圈限位开关输入一个信号。
2、SW2用来清零,长按3秒,显示器清零。
3、SW3:暂停工作。
4、SW4:用来检测按装电路板的盒子前盖是否打开,前盖打开触发SW4,停止工作,前盖合上时正常工作。
5、LED段码显示减速箱输出轴旋转的圈数,最多可以显示9999次,另外一个用来显示工作时行程开关的工作次数是1还是2.
6、显示灯一个红 {MOD}一个绿 {MOD}。工作时绿灯亮,电池没电的时候红灯闪烁(电压小于6V),红外光控一直工作时绿灯闪烁。
7、电位器用来调整红外感应距离。
分配给我的是长按3秒按钮SW2实现单片机情侣功能,该怎么实现,谢谢大家帮忙
此帖出自
小平头技术问答
个人想法是,按键SW2接INT0(下降沿触法),按下SW2,计数初值(设定3s)复位,开启T0,3s后检测下P3.2是否为低电平,如果为高电平则关T0,如果为低电平,则显示器清零。
[ 本帖最后由 孤獨の快樂 于 2011-10-24 12:09 编辑 ]这个是我的支持消抖和长按键给你参考:
/********************************************************key.h***********************************/
extern uint8 Press_Key_ID; //按键值
extern int8 Press_Key_Time;//持续按键时间
#define KEY_PORTX P3 //按键io口
//键盘扫描码,此数值等于此按键按抬起时port口上的数值(抬起高电平,按下拉低)
#define KEY_1 C_Bit7
#define KEY_2 C_Bit6
#define KEY_3 C_Bit5
#define KEY_4 C_Bit4
#define KEY_5 C_Bit3
#define KEY_6 C_Bit2
#define KEY_CODE (KEY_1+KEY_2+KEY_3+KEY_4+KEY_5+KEY_6)
//说明:以下定义的所指时间均以Key_Scan调用的时间间隔为单位
//按键去抖时间和长按键计时单位 此数值不能大于128
#define KEY_DEJITTER_TIME 100
//长按连发时间功能使用
#define PRESS_KEY_LONGTIME_MESSAGE //如果不用注释掉本行即可
//长按键时,按下按键每超过一次(下值*按建消抖时间)时就返回一个带长按标记的Key_ID值
//长按键计时以消抖以后开始计算
#define PRESS_KEY_LONGTIME_VALUE 16 //必须为2的n次整数
#define PRESS_KEY_LONGTIME_FLAG ~KEY_CODE //所有其它未使用的按键位均为标记
extern void Key_Scan(void);
extern uint8 Key_Get(void);
/***********************************************key.c********************************/
#include "51.h"
#include "key.h"
#ifdef PRESS_KEY_LONGTIME_MESSAGE
uint8 KeyTimeBase;
#endif
//unsigned char code Key_Table[6]={'U','D','-','+','S','T'};
uint8 Press_Key_ID=0; //按键扫描码
int8 Press_Key_Time=-KEY_DEJITTER_TIME;
//键盘扫描
void Key_Scan(void)
{
uint8 tmp=0;
#ifdef PRESS_KEY_LONGTIME_MESSAGE
KeyTimeBase++;
#endif
//非消抖时间键盘扫描,置建值
if (Press_Key_Time==-KEY_DEJITTER_TIME || Press_Key_Time>=0)
{
tmp = ~KEY_PORTX & KEY_CODE;
if (tmp==0)
{//无键按下
Press_Key_ID=0;
Press_Key_Time=-KEY_DEJITTER_TIME;
}
else
//有键按下
if (Press_Key_ID != tmp) //按键状态有改变
{
Press_Key_ID = tmp;
Press_Key_Time=-KEY_DEJITTER_TIME+1; //进入消抖期
}
//常有状态保持不变Press_Key_Time=0待取
}
// 消抖期键码不变 keytime++
else
Press_Key_Time++;
}
//获取键值,如果有返回键码或长按返回-1
uint8 Key_Get(void)
{
uint8 ret=0;
if (Press_Key_ID && Press_Key_Time>=0)
if (Press_Key_Time==0) //有待取按键
{
ret=Press_Key_ID;
Press_Key_Time++;
#ifdef PRESS_KEY_LONGTIME_MESSAGE
KeyTimeBase=0;
}
else //>0 有长按键
{
//每个消抖时间Press_Key_Time+1
if (KeyTimeBase >= KEY_DEJITTER_TIME)
{
KeyTimeBase=0;
Press_Key_Time++;
//长按
if ((Press_Key_Time & (PRESS_KEY_LONGTIME_VALUE-1)) ==0)
ret=Press_Key_ID|PRESS_KEY_LONGTIME_FLAG;
}
#endif
}
return ret;
}
一周热门 更多>