大家好,新手小白。分享先前嘗試用51做的按鍵控制流水燈花樣,有六個按鍵,分別實現單個燈的亮滅、從上往下流動、從下往上流動、全閃、全滅、暫停六種功能。已經成功仿真,有時候不太靈敏需要多按幾下,附源碼源程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真.PNG (51.29 KB, 下載次數: 32)
下載附件
仿真原理圖
2023-4-14 18:12 上傳
單片機源程序如下:
- #include<reg51.h>
- sbit LED1=P2^0;
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit K5=P1^4;
- sbit K6=P1^5;
- unsigned char keyval,num=0;
- int i,j,n;
- void delay_ms(int n)
- {
- for(i=0;i<n;i++)
- for(j=0;j<120;j++);}
-
- void forward() //從上往下流動
- {
- P2=0xfd;
- delay_ms(150);
- P2=0xfb;
- delay_ms(150);
- P2=0xf7;
- delay_ms(150);}
- void backward() //從下往上流動
- {
- P2=0xf7;
- delay_ms(150);
- P2=0xfb;
- delay_ms(150);
- P2=0xfd;
- delay_ms(150);}
- void blink() //全閃
- {
- P2=0xff;
- delay_ms(100);
- P2=0x00;
- delay_ms(100); }
- void key_scan()
- {
- P1=0xff;
- if((P1&0x3f)!=0x3f)
- {
- delay_ms(100);
- if(K1==0)
- {keyval=1;num=(num+1)%2;}
- if(K2==0)
- keyval=2;
- if(K3==0)
- keyval=3;
- if(K4==0)
- keyval=4;
- if(K5==0)
- keyval=5;
- if(K6==0)
- keyval=6;}
- while((P1&0x3f)!=0x3f);}
-
- void main()
- {
- keyval=0;
- while(1)
- {
- key_scan();
- switch(keyval)
- {
- case 1 :LED1=!num;break; //按一下亮按一下滅
- case 2 :forward();break;
- case 3 :backward();break;
- case 4 :blink();break;
- case 5 :P2=0xff;break; //全滅
- case 6 :while(keyval!=6);break;}}} //暫停
復制代碼
Keil代碼與Proteus仿真下載:
按鍵控制流水燈花樣.zip
(70.76 KB, 下載次數: 48)
2023-4-14 18:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|