51单片机:定时器与中断系统的运用

#include "regx52.h"


void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}

 void Timer0Init(void)        //1毫秒@11.0592MHz
{

    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0x66;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;
    EA  = 1;
    PT0 = 0;
}

 
int i,count,LEDMode;
 
// 中断后需要执行的内容
void Timer0_motion() interrupt 1
{  
    TL0 = 0x66;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    
       count++;
   if(count == 500)
   {    
           if(LEDMode == 0) //LED灯左移
        {
            if(i>=8)i=0;        
            P2=~(0x01<<i);
            i++;
        }

        if(LEDMode == 1) //LED灯右移
        {
            if(i<0)i=7;
            P2=~(0x01<<i);
            i--;
        }
           
          count=0;
   }

}


//独立按键的信号处理
int Key(void)    
{

    int KeyNumber = 0;
    if(P3_1==0){Delay(1000);while(P3_1==0);Delay(1000);KeyNumber = 1;}
    if(P3_0==0){Delay(2000);while(P3_0==0);Delay(2000);KeyNumber = 2;}
    if(P3_2==0){Delay(2000);while(P3_2==0);Delay(2000);KeyNumber = 3;}
    if(P3_3==0){Delay(2000);while(P3_3==0);Delay(2000);KeyNumber = 4;}

    return KeyNumber;
}

int main()
{
    int KeyNum;
    
    //计时器初始化
    Timer0Init();
     while(1)
     {
         KeyNum=Key(); //接收返回独立按键的状态
          if(KeyNum)
       {
               if(KeyNum == 1)
            {
              LEDMode++;
              if(LEDMode>=2)LEDMode=0;    
            }        
       }
     }
    
    return 0;

实验现象

猜你喜欢

转载自blog.csdn.net/weixin_52300845/article/details/124842892