C51编程–用定时器定时检测按键的长按与短按开关LED灯

  • Post author:
  • Post category:其他



题目

:使用汇编或者C语言,编写一个单片机程序。

P2.0控制LED灯(0为亮,1为灭),P3.1为按键KEY(按下为0,不按下为1),实现按键长按0.2s后开灯,长按2s后关灯。时间需要准确,用定时器来实现。单片机晶振为12MHZ。


分析:

使用定时器中断,在主循环中一直检测按键是否按下

程序如下:

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED=P2^0;
sbit KEY=P3^1;
static uint i=0;

void Timer0Init()  //定时器0初始化
{
    TMOD |= 0x01; //模式1
    TMOD &= 0x0F;
    TH0 = (65536-1000)/256;
    TL0 = (65536-1000)%256;  //定时1ms
    EA=1;
    ET0=1;
    TR0=1; //T0中断溢出请求标志位
}

void delay (uint i) //延时函数
{
    while(i--);
}

void main()
{
    while(1) //一直检测按键是否按下  按下则进入中断
    {
        delay(1000);
        if(KEY==0)
        {
            delay(1000); //按键消抖
            if(KEY==0)
                Timer0Init(); //定时器0初始化 申请中断
        }
        else