阅读113 返回首页    go 阿里云 go 技术社区[云栖]


我这迟来的单片机编程挑战

看了挑战后,就想看看自己是否有60%了。但想好久都没有写,因c语言很久没用了,也因思路不清就放下了,看了下大虾们推荐的状态机,有了点思路。但最近要找实习单位就一直没写,今天突然想起就试试,调试下行了。哈哈。
       还有我最近一直纠结于是选PLC还是单片机发展。不知道该走那条路呀?选择单片机,下学期就要实习了,已没时间深入了。工作后··········


//----------------------------------------
//第一个按键按下去时候,第一个LED以10Hz频率闪烁,
//再次按下时候,熄灭,再次按下时候,闪烁,依次循环。
//第二个按键按下去等到放开时候,第二个LED以100hz频率闪烁。
//再次按下放开,熄灭,第三次按下放开,闪烁,依次循
//第三个按键按下去时候,第三个Led
//以50Hz频率闪烁,放开时候LED熄灭。
//---------------------------------------- 
#include<reg51.h>
#define uint unsigned  int
#define uchar unsigned  char
uint ky1=0; //按键1状态变量,初态为0
uint ky2=0; //按键2状态变量
uint ky3=0; //按键3状态变量
uint shi_ms=0; //计时变量
sbit led1=P3^0;//led灯
sbit led2=P3^1;
sbit led3=P3^2;
sbit key1=P1^0;//按键
sbit key2=P1^1;
sbit key3=P1^2;
bit ld1=0;//led1闪烁标志,为1时led1闪烁

bit ld2=0;//led2闪烁标志,为1时led2闪烁

bit ld3=0;//led3闪烁标志,为1时led3闪烁


void dingshi0_csh()         //定时器0初始化
{
EA=1;
ET0=1;
TR0=1;
TMOD = 0x01;          //设定时器0功能为计时
TH0=0xfc;                 //1ms中断一次
TL0=0x18;

}
void main()

  dingshi0_csh();//定时器0初始化
while(1)          //下面是按照状态机的思想编写的
{
   switch(ky1)        //按键1的状态处理
   {
    case 0:                //在初态中等待按键按下
     {
          if(0==key1)
          {ky1=1;}         //按键按下转状态1
     } break;
    case 1:                  //在状态1中消抖
     {
           //延时未写
           if(0==key1)        //消抖后按键是按下
           {                        
            ky1=2;                //状态转移
                ld1=~ld1;  //闪烁处理,原是熄灭,闪烁;原闪烁则熄灭
            led1=1;           //让灯熄灭,保证按下按键后灯是熄灭的
           }
           else                 //消抖后按键没有按下
           ky1=0;         //返回初状态
     }  break;
    case 2:                 //在状态2中等待按键释放
     {
           if(1==key1)
           {
           ky1=3;
           }
     }  break;
    case 3:                //判断按键是否释放
     {
            //延时
           if(1==key1) //按键释放,跳状态0等待下一次按键
           {
           ky1=0;
           }
           else                   //按键没释放,跳状态2等待按键释放
           ky1=2;
     } break;
   }
   switch(ky2)
   {
    case 0:
     {
          if(0==key2)
          {
           ky2=1;
          }
     } break;
    case 1:
     {
           if(0==key2)
          {
           ky2=2;
          }
          else
           ky2=0;
     }        break;
    case 2:
     {
          if(1==key2)
          {
           ky2=3;
          }
     }
    case 3:
     {
          if(1==key2)
          {
           ky2=0;
           ld2=~ld2;
           led2=1;
          }
          else
           ky2=2;
     } break;
   }
   switch(ky3)
   {
    case 0:
     {
          if(0==key3)
          {
           ky3=1;
          }
     } break;
    case 1:
     {
           if(0==key3)
          {
           ky3=2;
           ld3=1;
          }
          else
           ky3=0;
     }
    case 2:
     {
          if(1==key3)
          {
           ky3=3;
          }
     } break;
    case 3:
     {
        if(1==key3)
          {
           ky3=0;
           ld3=0;
           led3=1;
          }
          else
           ky3=2;
     } break;
   }


}

void Timer0Interrupt() interrupt 1
{
    TH0 = 0x0FC;
    TL0 = 0x18;
        shi_ms++;
        if(0==(shi_ms%100)&&ld1==1)//0.1s并来了led1标志位ld1为1
        {                                                   //led1以10HZ频率闪烁
           led1=~led1;
        }
    if(0==(shi_ms%10)&&ld2==1)//0.01s并来了led1标志位ld1为1
        {                                                   //led1以100HZ频率闪烁
           led2=~led2;
        }
         if(0==(shi_ms%20)&&ld3==1)//0.02s并来了led1标志位ld1为1
        {                                                   //led1以50HZ频率闪烁

           led3=~led3;
        }
        if(200==shi_ms)
        {
         shi_ms=0;
        }
}


搜狗截图_2012-05-18_21-55-24.png (27.44 KB, 下载次数: 4)

搜狗截图_2012-05-18_21-55-24.png

最后更新:2017-04-02 15:14:48

  上一篇:go 我国4G标准拓展国际市场取得重要突破
  下一篇:go J2EE中自定义标签以及TagSupport和BodyTagSupport的用法