51單片機彩燈控制系統
有4種閃爍方式
能自動手動切換
淘氣彩燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (24.54 KB, 下載次數: 50)
下載附件
2018-4-13 01:59 上傳
0.jpg (44.99 KB, 下載次數: 58)
下載附件
2018-4-13 02:00 上傳
單片機淘氣彩燈源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- sbit Key1=P3^2; //切換狀態按鈕(外部中斷0)
- sbit Key2=P3^3;
- sbit Key3=P3^4;//暫停按鈕(外部中斷1)
- sbit p1=P1^5;///蜂鳴器控制端口
- unsigned char state=1; //狀態標志
- unsigned int aut=1; //改變手動自動模式
- char F; //定義F為外部變量
- unsigned char NUM1[4]={0x7e,0xbd,0xdb,0xe7}; //第3種亮燈方式(向內)
- unsigned char NUM2[4]={0xe7,0xdb,0xbd,0x7e}; //第3種亮燈方式(向外)
- unsigned char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第4種亮燈方式
- void Delay(unsigned int t) //延時函數
- {
- unsigned int i,j;
- for(i=0;i<t;i++) //用for循環嵌套來實現延時
- for(j=0;j<200;j++);
- }
- void Int_Init() //外部中斷初始化
- {
- IT0=1; //外部中斷0,邊沿觸發
- EX0=1; //允許中斷
- IT1=1; //外部中斷1,邊沿觸發
- EX1=1; //允許中斷
- TMOD=0x06;
- TH0=0xff;
- TL0=0xff;
- ET0=1;
- TR0=1;
- EA=1; //開總中斷
- }
- void first()
- {
- unsigned char n;
- for(n=0;n<35;n++)
- {
- P0=0x6d;
- P2=0x6d;
- Delay(30);
- if(F== 1) break; //如果按下外部中斷按鈕,立即跳出效果,執行中斷的內容
- }
- F = 0; //把外部變量清0
- }
- void second()
- {
- unsigned char m,n;
- for(m=0;m<4;m++)
- {
- P0=0xf0;
- P2=0x0f;
- Delay(100);
- P0=0xff;
- P2=0xff;
- Delay(100);
- if(F == 1 ) break; //如果按下外部中斷按鈕,立即跳出效果,執行中斷的內容
- }
- for(n=0;n<4;n++)
- {
- P0=0x0f;
- P2=0xf0;
- Delay(100);
- P0=0xff;
- P2=0xff;
- Delay(100);
- if(F == 1 ) break; //如果按下外部中斷按鈕,立即跳出效果,執行中斷的內容
- }
-
- F = 0; //把外部變量清0
- }
- void third()
- {
- unsigned char n;
- for(n=0;n<4;n++)
- {
- P0=NUM1[n];
- P2=NUM2[n];
- Delay(100);
- if(F == 1 ) break; //如果按下外部中斷按鈕,立即跳出效果,執行中
-
- }
- F = 0; //把外部變量清0
- }
- void four()
- {
- unsigned char n;
- for(n=0;n<8;n++)
- {
- P0=a[n];
- P2=a[n];
- Delay(100);
- if(F == 1 ) break; //如果按下外部中斷按鈕,立即跳出效果,執行中斷的內容
-
- }
-
- F = 0; //把外部變量清0
- }
- void five()
- {
-
- while(aut==0)
- {
- first();
- if(aut==1)break;
- second();
- if(aut==1)break;
- third();
- if(aut==1)break;
- four();
- if(aut==1)break;
- Delay(10);
- if(F==1) break;
- }
-
- F = 0; //把外部變量清0
- }
- /**************主函數*******************/
- void main()
- {
- Int_Init(); //外部中斷初始化
- while(1)
- { if(!(aut && state)){
- five();
- }
- else{
- if(state==1) first(); //掃描狀態標志,為1時,第一種效果
- else if(state==2) second(); //掃描狀態標志,為2時,第二種效果
- else if(state==3) third(); //掃描狀態標志,為3時,第三種效果
- else if(state==4) four(); //掃描狀態標志,為4時,第四種效果
- else
- {P0=0x00; P2=0x00;} //其他狀態,八盞燈全亮,即暫停
- }
- }
- //蜂鳴器程序
- while(1){
- p1=0;
- Delay(200);
- p1=1;
- Delay(500);
- }
- }
- /************外部中斷0********************/
- void INT_0() interrupt 0
- {
- Delay(100);//消抖
- if(Key1 == 0)
- {
- F = 1;
- state++; //外部變量置1,即立即跳出效果 //按一次按鈕,狀態標志加1
- if(state>4) state=1;
- while(Key1 == 0); //松手檢測
- }
- }
- /************外部中斷1********************/
- void INT_1() interrupt 2
- {
- Delay(100);//消抖
- if(Key2 == 0)
- {
- F=1; //外部變量置1,即立即跳出效果
- state=~state; //取反狀態標志,按一次可暫停,使八盞燈全亮,再按一次,繼續執行之前的操作
- while(Key2 == 0); //松手檢測
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
淘氣的彩燈.rar
(56.93 KB, 下載次數: 33)
2018-4-12 22:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|