熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2019-3-5 17:15
正文摘要:仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載) 單片機(jī)源程序: #include<reg52.h> //52系列單片機(jī)頭文件 #define uchar unsigned char / ... |
不好意思,上面的仿真截圖弄錯(cuò)啦,把別的問題的截圖混到本題啦,本題的仿真截圖是下面的圖:![]() 所幸附件里的程序和proteus設(shè)計(jì)是正確的。讀者可放心參考。 |
你的程序我?guī)湍惴抡鏅z查了一下,發(fā)現(xiàn)K1,K2,K4的模塊編得很好,沒有問題,點(diǎn)擊K1能依次點(diǎn)亮LED,點(diǎn)擊K2依次熄滅LED,點(diǎn)擊K4能整體點(diǎn)亮熄滅LED,只有K3模塊有點(diǎn)小問題,點(diǎn)擊K3,LED能依次點(diǎn)亮,但全部點(diǎn)亮LED后就死在這個(gè)全亮狀態(tài)。 主要問題是你用了while(1){...}while(k3==0);這是個(gè)死循環(huán),雖然K3釋放能跳出while(k==0),但while(1)跳不出,所以死在這,將\\while(1)注釋掉就可解決死循環(huán)的問題,但是還存在LED全亮后沒辦法通過K2依次熄滅的問題,原因是點(diǎn)擊k3后,LED依次點(diǎn)亮,這時(shí)雖然LED全亮,但這時(shí)flag值為0,所以無法通過k2減值flag來依次熄滅LED,所以要對(duì)flag=9賦值,就能通過k2依次息滅LED。 下面是修改后的程序: #include<reg52.h> //52系列單片機(jī)頭文件 #define uchar unsigned char //宏定義 #define uint unsigned int sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; sbit led9=P0^7; sbit key1=P3^1; sbit key2=P3^2; sbit key3=P3^3; sbit key4=P3^4; uchar flag; /*************************延時(shí)函數(shù)*****************************/ void delay1ms(uint y){uint j;while(y--)for(j=0;j<120;j++);} /*************************子函數(shù)******************************/ void keyscan() {if(key1==0)//確認(rèn)按鍵是否被按下 {delay1ms(5);//延時(shí)消抖動(dòng) if(key1==0)//消抖后在判斷按鍵是否按下 {if(flag<10)flag++; switch(flag) {case 1:led1=0;break; case 2:led2=0;break; case 3:led3=0;break; case 4:led4=0;break; case 5:led5=0;break; case 6:led6=0;break; case 7:led7=0;break; case 8:led8=0;break; case 9:led9=0;break; }while(!key1); //等待按鍵釋放 } } if(key2==0)//確認(rèn)按鍵是否被按下 {delay1ms(5);//延時(shí)消抖動(dòng) if(key2==0)//消抖后在判斷按鍵是否按下 {if(flag>0)flag--; switch(flag){case 0:led1=1;break; case 1:led2=1;break; case 2:led3=1;break; case 3:led4=1;break; case 4:led5=1;break; case 5:led6=1;break; case 6:led7=1;break; case 7:led8=1;break; case 8:led9=1;break; }while(!key2);//等待按鍵釋放 } } if(key4==0){delay1ms(5); if(key4==0){P2=~P2; P0=~P0; while(key4==0); } } if(key3==0){delay1ms(5); if(key3==0) {//while(1) {led1=0;delay1ms(500); led2=0;delay1ms(500); led3=0;delay1ms(500); led4=0;delay1ms(500); led5=0;delay1ms(500); led6=0;delay1ms(500); led7=0;delay1ms(500); led8=0;delay1ms(500); led9=0;delay1ms(500); flag=9; }while(key3==0); } } } /*************************主函數(shù)******************************/ void main() {while(1){keyscan();} } 下面是proteus仿真時(shí)的情形: ![]() 附件有程序的proteus設(shè)計(jì)文件。 ![]() |
參與人數(shù) 1 | 黑幣 +80 | 收起 理由 |
---|---|---|
![]() | + 80 |
給你寫好了
|
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
本帖最后由 菜鳥來了 于 2019-3-5 19:06 編輯 flag要復(fù)位,如果從1開始算,加燈的時(shí)候大于9了要等于1, 減燈的時(shí)候小于1了要等于9。 你上下兩個(gè)switch的flag起始位都不一致。 |
參與人數(shù) 1 | 黑幣 +50 | 收起 理由 |
---|---|---|
![]() | + 50 | 回帖助人的獎(jiǎng)勵(lì)! |
Powered by 單片機(jī)教程網(wǎng)