2019-04-21 22:13:00 Hongwei_1990 阅读数 1043
  • 按键-第1季第9部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第9个课程,综合解决了独立按键和矩阵式按键的处理方法,涉及到:IO的输入输出、按键抖动和消抖、中断的引入和相关概念、矩阵式键盘的原理和编程等。目的是对单片机常见输入设备按键进行全方位学习。

    2185 人正在学习 去看看 朱有鹏

BS83B××C系列单片机是一款具有8位高性能精简指令集且完全集成触控按键功能的 Flash 单片机。单片机具有内部触控按键功能可多次编程的 Flash 存储器特性,为各种触控按键的应用提供了一种简单而又有效的实现方法。内部看门狗定时器低电压复位等内部保护特性,外加优秀的抗干扰ESD保护性能,确保单片机在恶劣的电磁干扰环境下可靠地运行。

序号 选项 描述
1 工作电压 3.3V
1 待机电流 1 Key(单键唤醒): < 4uA
13 Key(所有按键唤醒): < 10uA
2 唤醒方式 所有按键 / 单键 / 接近感应
2 IIC 数据传输速率 最大 100K bps(SCL切换时间大于10us

1、起始条件停止条件

在这里插入图片描述
在这里插入图片描述​​​​​​

2、从机地址

​​在这里插入图片描述

3、读/写控制位

在这里插入图片描述

4、应答位

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、主机读数据

在这里插入图片描述
在这里插入图片描述

6、主机写数据

在这里插入图片描述
在这里插入图片描述

7、读按键值输出寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2011-01-20 19:19:00 duqi_2009 阅读数 987
  • 按键-第1季第9部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第9个课程,综合解决了独立按键和矩阵式按键的处理方法,涉及到:IO的输入输出、按键抖动和消抖、中断的引入和相关概念、矩阵式键盘的原理和编程等。目的是对单片机常见输入设备按键进行全方位学习。

    2185 人正在学习 去看看 朱有鹏

      在STC89C52RC中,键盘接口分为独立式按键和矩阵式键盘。如果项目中需要的交互较少,使用独立式键盘即可;如果输入参数较多,比方说打印机什么的,功能复杂的系统,则需要采用矩阵式键盘进行输入控制。

     键盘的可靠输入要考虑两个方面的问题:

  1.      去抖动:目前的单片机键盘按键均为机械式触点,由于触点的机械弹性效应,在按键闭合和断开的时候,接触点的电压并不是立即变化,而是会出现抖动。根据按键的不同机械特性,抖动的时间长短不等,大致在5ms~20ms。
  2.      一次按键处理:当键盘按下之后,相应的按键编码以高电平的方式输入到单片机的I/O接口。按键闭合是有一定时间的。一般来说的,大致是0.1us~0.5us。因为单片机的执行速度很快,如果处理不当,就有可能一次按键操作被执行多次。

     一般来说,硬件解决以上两个问题比较复杂,成本也高,而软件处理择简单实用。软件处理的方法是:当程序检测到有键按下时,执行一个10ms的延时程序,然后再监测一次,看是否该键仍然闭合。如果仍然闭合择可以确认确实有键按下,从而可以消除抖动的影响。

        单片机对键盘的输入检测可以有查询和中断两种方式。查询适合用于一般用途的程序;中断适合一些较为复杂的单片机系统。

      在程序中,对键盘的处理包括以下几个方面:

  •       检测按键是否按下;
  •       如果检测到按键被按下,可以执行软件去抖动,消除抖动的影响;
  •       准确判断是哪个按键被按下;
  •       转向相应的程序处理子程序

1、独立式按键实验

 

2018-09-01 05:15:38 xianfajushi 阅读数 1742
  • 按键-第1季第9部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第9个课程,综合解决了独立按键和矩阵式按键的处理方法,涉及到:IO的输入输出、按键抖动和消抖、中断的引入和相关概念、矩阵式键盘的原理和编程等。目的是对单片机常见输入设备按键进行全方位学习。

    2185 人正在学习 去看看 朱有鹏

完整的单击、双击、长按代码。

工作原理:当有按钮第一次按下时,设置第一个标志An,当按钮第一次释放后,进入中断消抖延时计数,假如在计数范围内第二次按钮按下,设置第二标志Aa,这样就把单击和双击区分开,而且是可靠的逻辑标志,长按为大于1秒的判断.

中断消抖及按钮单击、双击、长按处理,双击在仿真中稳稳地检测到执行。

之前发布的矩阵按键也一样可以采用中断延时,不过时间应该更短,如50-100毫秒。

本代码的巧妙之处在于:

1.只有按钮按下才执行消抖延时,否则不执行延时

2.巧妙利用消抖延时,同时检查按键双击判断

3.判断设计精巧,代码短小精悍

4.消抖延时时间极易调整

5.多极判断可扩展性良好

6.构思巧妙,易于理解其原理

中断是一个知识点也是需要谨慎处理的点,处理不好的话,运行起来会看到怪现象,简单的话当然不会看到什么影响,不过即使是简单的数码管显示还是按键消抖,我也觉得有必要研究如何是最优的在一个中断源中处理.

 

2017-02-26 11:03:22 maoji0806 阅读数 3372
  • 按键-第1季第9部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第9个课程,综合解决了独立按键和矩阵式按键的处理方法,涉及到:IO的输入输出、按键抖动和消抖、中断的引入和相关概念、矩阵式键盘的原理和编程等。目的是对单片机常见输入设备按键进行全方位学习。

    2185 人正在学习 去看看 朱有鹏


    开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(2段拨动开关,自锁开关等)等直接接通和切断电源,不说机械部件的可靠性,至少自动关机(一般在长时间不操作、电池电量低时需要自动关机)功能就比较难实现。所以电池供电系统一般采用按钮开关,用一个按钮配合软件实现按一次开机、再按一次关机的功能及自动关机的功能。

 

    这部分内容就讲述如何在STM8S上实现一键式的开关机功能。开关机功能要使用单片机的一个引脚(PD4)作为输入端,连接到按钮,接收按纽按下产生的电信号,然后再使用另一个引脚(PD3)作为输出端去驱动由三极管8550构成的一个电子开关实现对系统电源的控制。而STM8S单片机本身就直接接在电池上,利用单片机的停机模式,将单片机本身的电流降低到μA级,对电池的消耗就可以忽略不计了。

  

1、电路设计

    电路图如下,C1是STM8S单片机VCAP电容,保持内部1.8V电压的稳定,是STM8S单片机唯一必须接要的外部元件,选用容量为1μF的瓷片电容,而且从电路可靠性讲,这个电容越靠近单片机IC越好。

     K1是按钮,一端接到单片机的PD4引脚上,另一端接地,这样按钮被按下就会产生一个低电平的脉冲。

     Q1是三极管,通过发光二极管D1和限流电阻R1接到单片机的PD3上。这样当PD3输出低电平时,Q1导通,VCC上有电压,可以对系统供电,反之PD3输出高电平时,Q1截止VCC没有电压。

     发光二极管D1还兼作电源指示灯的作用, Q1导通时发光反之不发光。

     剩余的C2~C5都是电源退藕电容,用于消除电源上的干扰信号。P1、P2两个接线端分别接3.6V锂电池的正负极。 

2、软件设计

    软件要实现的功能是,在PD4引脚上监控按钮按下产生的低电压脉冲信号,并根据这个信号来设置PD3引脚的输出电平去控制Q1的导通和截止,以及设置单片机自身的工作状态,以此实现对电源供电的控制。

   1)引脚工作模式设置

     首先要做的,就是设置单片机引脚的工作模式,把PD4设置为输入模式,D3设置为输出模式。

     在STM8S_StdPeriph_Lib库中,可以使用这个函数进行设置:

     void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode)

     GPIOx是端口编号,取值有GPIOA、GPIOB、GPIOC、GPIOD,分别对应单片机的PAx、PBx、PCx、PDx端口,GPIO_Pin是引脚编号,取值有GPIO_PIN_1~GPIO_PIN_7,函数通过GPIOx和GPIO_Pin两个参数指定一个唯一的引脚。

     GPIO_Mode是工作模式了。表示输入模式的取值有四种,分别是要不要上拉,要不要中断的四种组合:
           GPIO_MODE_IN_FL_NO_IT     Input floating, no external interrupt
           GPIO_MODE_IN_PU_NO_IT    Input pull-up, no external interrupt
           GPIO_MODE_IN_FL_IT            Input floating, external interrupt
           GPIO_MODE_IN_PU_IT           Input pull-up, external interrupt

      要上拉的话,单片机内部会自动为引脚提供一个上拉电流,在没有外部输入的情况下,引脚就是高电平了。

 

      表示输出模式的取值有8种,分别是是否开漏输出、输出高低电平、是否高速输出的组合:
           GPIO_MODE_OUT_OD_LOW_FAST       Output open-drain, low level, 10MHz
           GPIO_MODE_OUT_PP_LOW_FAST        Output push-pull, low level, 10MHz
           GPIO_MODE_OUT_OD_LOW_SLOW     Output open-drain, low level, 2MHz
           GPIO_MODE_OUT_PP_LOW_SLOW      Output push-pull, low level, 2MHz
           GPIO_MODE_OUT_OD_HIZ_FAST         Output open-drain, high-impedance level,10MHz
           GPIO_MODE_OUT_PP_HIGH_FAST       Output push-pull, high level, 10MHz
           GPIO_MODE_OUT_OD_HIZ_SLOW       Output open-drain, high-impedance level, 2MHz
           GPIO_MODE_OUT_PP_HIGH_SLOW     Output push-pull, high level, 2MHz


     在这个应用中,需要把PD4设置为带上拉(因为按钮未按下时要呈高电平)、有中断的输入模式。开机时,PD3要设置为低电平的输出模式(低电平才能让Q1导通)。关机时PD3要设置为不带上拉的输入模式,所以这部分代码要这样写:

        GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //PD4设置为带上拉、有中断的输入模式

 

       GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST); //开机时把PD3设置低电平的输入模

       GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//关机时把PD3设置低电平的输入模式

      额外提一下,除了GPIO_Init函数可以设置引脚是输出高电平还是低电平,还可以用下面四个函数继续引脚的高低电平:

        void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal)         //输出PortVal指定的电平

        void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //输出高电平

        void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins)  //输出低电平

        void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //高低电平翻转一次

 

  2)停机模式设置

      STM8S单片机有停机模式,在停机模式下,单片机功耗降到最低,所有时钟停止工作,但可以保留RAM和寄存器的值,停机模式只能可以通过下面几种方式退出:

             -外部中断(GPIO)
             -CAN接收中断
             -SPI传输结束
             -I2C中断(从地址匹配)
             -复位

      通过执行HALT指令,也就是执行库函数的halt()函数进入停机模式。

 

   3)设置外部中断

      外部中断通过SetExtIntSensitivity函数设置:

       void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue)

      其中Port是要设置外部中断的端口,取值有GPIOA、GPIOB、GPIOC、GPIOD,分别对应单片机的PAx、PBx、PCx、PDx端口;

      SensitivityValue是外部中断类型,有以下几种取值,分别表示下降沿和低电平触发中断、上升沿触发中断、下降沿触发中断、上升沿和下降沿触发中断:

         EXTI_SENSITIVITY_FALL_LOW    Interrupt on Falling edge and Low level
         EXTI_SENSITIVITY_RISE_ONLY    Interrupt on Rising edge only
         EXTI_SENSITIVITY_FALL_ONLY   Interrupt on Falling edge only
         EXTI_SENSITIVITY_RISE_FALL     Interrupt on Rising and Falling edges
     在这个应用中,按钮按下是产生下降沿,要选取EXTI_SENSITIVITY_FALL_ONLY模式。

 

     设置中断模式后,还需要启用中断,使用enableInterrupts()函数启用。

 

    4)外部中断处理程序

    在ST官方提供的STM8S_StdPeriph_Lib库自带的模板中,中断处理程序都在stm8s_it.c中实现。stm8s_it.c中已经根据中断向量设置好了每种中断处理程序的入口函数。只需在相应函数中填入内容即可。

    这个应用中是要编写GPIOD端口的外部中断处理函数,所以要在这个中断处理函数中增加开关机的内容:


INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{
 
}

    5)整体程序设计和源代码

    单片机程序流程图如下,包含主程序main()的流程和stm8s_it.c的外部中断处理程序流程:

    具体源代码如下,关键点前面已经介绍,就不再详细说明了:

    A)main.c的源代码:

void Delay(uint16_t nCount)//定义延时函数,FFFF大约是0.2s
{
 
  while (nCount != 0)
  { 
    nCount--;
  }
}

bool fPowerOn_flag =FALSE;//定义开关机标志

 void main(void)
{

   GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);
   EXTI_SetExtIntSensitivity(EXTI_PORT_POWER_KEY,EXTI_SENSITIVITY_FALL_ONLY);  
   enableInterrupts();


  while (1)
  {
    if(fPowerOn_flag == FALSE)
    {

      GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//PD3脚设置为输入模式,Q1截止

      halt();//进入停机模式
    }else

    {

      GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//PD3脚设置为输出模式且为低电平,Q1导通

     ///////

     //插入用户自定义的代码

     //////
    }
  }
}

 

    B)stm8s_it.c的源代码:

void Delay(uint16_t nCount); //Delay函数在main.c中定义

extern bool fPowerOn_flag; //fPowerOn_flag在main.c中定义,所以这里要声明成外部变量
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{

  Delay(6000); //延时消抖

  if(!GPIO_ReadInputPin(GPIOD, GPIO_PIN_3))//判断是不是按钮被按下

  {

    if(fPowerOn_flag)
    {
      fPowerOn_flag=FALSE;
    }else
    {
      fPowerOn_flag=TRUE;
    }

  }

}

 

3、关机后实测结果

    使用STM8S开发板实测关机电流,为40μA左右:

    按18650锂电池的典型容量2500mah计算,关机后可以支持2500mah/0.04ma/24小时/365天=7.1年,已经超过电池的充电循环使用寿命了,基本可以接受,不过应该还没有达到最低值,还可以研究Datasheet,继续优化软件,进一步减低关机电流。

 

4、总结
开关机部分就讲完了,最后总结一下,这部分学习到的知识点包括:

   1、单片机硬件设计,至少需要一个VCAP电容接到VCAP引脚和地之间,选用容量为1μF的瓷片电容,电在路布局上,这个电容越靠近单片机IC越好。

   2、设置各个引脚的输入、输出模式设置方法

   3、进入和退出停机模式的方法

   4、设置外部中断和中断处理程序



2015-07-24 22:07:28 u011046042 阅读数 5271
  • 按键-第1季第9部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第9个课程,综合解决了独立按键和矩阵式按键的处理方法,涉及到:IO的输入输出、按键抖动和消抖、中断的引入和相关概念、矩阵式键盘的原理和编程等。目的是对单片机常见输入设备按键进行全方位学习。

    2185 人正在学习 去看看 朱有鹏

系统总体设计方案

智能家居系统的是一个实时查询家庭的温湿度、照明控制、自动控制的设定,集家庭娱乐、智能安防为一体,大量数据快处理、可靠的系统,因此在硬件和软件上都有很大的要求,因此在这里进行了多方面的考虑有以下两个实现方案:

方案一:利用STM32单片机作为手持终端的控制器,使用按键和12864液晶屏作为人机交互的接口。利用51单片机作为房子内部的电灯、空调、门禁等家电的控制器,利用串口实现STM32单片机和51单片机作为数据传输的通道。这个可以实现,但是,机械按键和12864在智能家居中与实际的场景有些不符合。

方案二:利用ARM架构的S3C6410作为手持终端的主控芯片,以Linux系统作为平台,QT设计友好的人机交互界面,结合多个传感器进行采集,使用TI的CC2530作为网络传感器和房子内部电器的控制器,并且利用串口通信实现数据的交互,利用RFID的门禁钥匙。通过PC机上的客户端软件实现远程的智能家居系统监控[6]

比较以上两种方案,第二种方案更为合理,Linux系统有很多的优势:免费开源、内核可裁剪、网络功能强大且稳定、可靠安全等都方面的优势[7]。Qt设计支持多国语言、优良的跨平台特性、面向对象、丰富的API(包括图形设计器,Makefile制作工具、字体国际化工具、Qt的C++类库)、模块化、可以任意裁剪、大量的开发文档、XML支持等多方面的优势[8]。所以选择方案二。

本设计的整体系统框图如图1-1所示:


1-1 整体系统框图

硬件部分的结构框图如图1-2所示:

1-2  硬件结构框图

   这里的主控芯片是用于数据的处理和系统的控制,TFT液晶屏用于人机交互,协调器和主控芯片用串口通信实现家庭网络的数据交互,温湿度传感器采集室内的温湿度,光照度传感器采集光照度,通过终端节点将数据收集打包,发送到协调器,协调器通过串口将数据发送到主控制芯片,主控器进行数据处理在界面TFT屏上给出相应的信息,并且发出相应的指令控制空调和电机。门禁模块实现控制舵机的转动从而控制门的开关。


拨盘开关输入方法

阅读数 1987

没有更多推荐了,返回首页