113
技術社區[雲棲]
我這遲來的單片機編程挑戰
看了挑戰後,就想看看自己是否有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)
最後更新:2017-04-02 15:14:48
上一篇:
我國4G標準拓展國際市場取得重要突破
下一篇:
J2EE中自定義標簽以及TagSupport和BodyTagSupport的用法
C# WinForm多線程開發(一) Thread類庫
Object-C中的類-類的聲明
從Noke藍牙掛鎖,看經不住現實考驗的先進技術
maven學習十之myEclipse搭建maven項目總結
三分鍾深入TT貓之故障轉移
??????????????????????????????????????????????????????????????????????????????????????-??????-????????????-?????????
工業4.0中不可缺少的核心技術-PLM
MySQL用戶管理
WCF技術剖析之十二:數據契約(Data Contract)和數據契約序列化器(DataContractSerializer)
每個程序員都應該用MBP