|
本次是流水燈最后一個(gè)實(shí)驗(yàn),主要目的是為了讓大家初步認(rèn)識(shí)和掌握中斷的運(yùn)用,當(dāng)進(jìn)行中斷時(shí),我們就可以不用管是否放手,程序會(huì)立即響應(yīng)而不是像之前一樣要將程序進(jìn)行完才進(jìn)入下一階段。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include "reg52.h"
- #define u8 unsigned char
- u8 code tab[15]={1,2,4,8,16,32,64,128,64,32,16,8,4,2,1};
- u8 m=0,fang=0,n;
- void delay(long k){while(k--);}
- void loop1(u8 a,u8 b)// //流水燈的起始位置
- {
- u8 i,j;
- j=fang;
- n=m;
- for(i=a;i<b;i++)
- {
- if(j==fang && n==m)
- {P1=~tab[i];
- delay(3000);}
- else break;
- }//建議添加判斷方向是否改變的代碼,實(shí)現(xiàn)按下立即break循環(huán)
- }
- void loop2(u8 a,u8 b)// //流水燈的起始位置
- {
- u8 i,j;
- j=fang;
- n=m;
- for(i=a;i<b;i++)
- {
- if(j==fang && n==m)
- {P1=~tab[i];
- delay(60000);}
- else break;
- }//建議添加判斷方向是否改變的代碼,實(shí)現(xiàn)按下立即break循環(huán)
- }
- void loop3(u8 a,u8 b)// //流水燈的起始位置
- {
- u8 i,j;
- j=fang;
- n=m;
- for(i=a;i<b;i++)
- {
- if(j==fang && n==m)
- {P1=~tab[i];
- delay(2000);}
- else break;
- }//建議添加判斷方向是否改變的代碼,實(shí)現(xiàn)按下立即break循環(huán)
- }
- void main()
- {
- EA=1;IT0=1;EX0=1;//總中斷允許=1,下降沿觸發(fā)=1,P32允許啟動(dòng)=1
- IT1=1;EX1=1;
- while(1)
- {
- if(m==0)
- {
- switch(fang)
- {case 0: loop1(0,15);break;
- case 1: loop1(7,15);break;
- case 2: loop1(0,8);break;
- default: P1=0xff;break; }
- }
- if(m==1)
- {
- switch(fang)
- {case 0: loop2(0,15);break;
- case 1: loop2(7,15);break;
- case 2: loop2(0,8);break;
- default: P1=0xff;break; }
- }
- if(m==2)
- {
- switch(fang)
- {case 0: loop3(0,15);break;
- case 1: loop3(7,15);break;
- case 2: loop3(0,8);break;
- default: P1=0xff;break; }
- }
- }
- }
- void bao() interrupt 0
- {
- if(fang>=3) fang=0;
- else fang++;
- }//出現(xiàn)中斷,例如按下按鍵了,就改變方向
- void bbo() interrupt 2
- {
- if(m>=2) m=0;
- else m++;
- }
復(fù)制代碼
所有資料51hei提供下載:
摁鍵控制流水燈方向速度 不用等待放手立即響應(yīng).rar
(72.52 KB, 下載次數(shù): 15)
2021-7-17 16:46 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|