閱讀113 返回首頁    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的用法