遙控紅外引導碼
高低脈沖時間us
我用的數碼管電路圖
單片機源程序如下:
- #include<reg52.h>
- sfr T2MOD=0XC9; //定義定時器2
- #define u8 unsigned char
- #define u16 unsigned int
- sbit ir=P3^2;sbit LSA=P2^2; sbit LSB=P2^3;sbit LSC=P2^4;//數碼管用的138
- bit di=0,gao=0,c=0;
- u8 js=0,us=0; //js是計算低脈沖個數
- u16 idata IR[75];//所有高低脈沖都裝在里面
- //紅外一組為68個高低脈沖,設75個,隨便改脈沖個數
- u8 code tab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0};
- u8 dw[5];//數碼管顯示0--9,最后那個0是關顯示
- void Delay(u16 n){while(--n);}//12M公式n=(延時-6)*0.12493899(us)
- void disp()
- { P0=tab[dw[i]];
- Delay(70); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- void T0init(void) //定時器0模式2初始化,完成一次中斷為256us,10次就乘10次
- {TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;TR0=1;}
- void E0init(void)//外P3^2中斷0 初始化
- {IT0=1;EX0=1;}
- void main(void)
- { T2MOD=0;T2CON=0; //定時器2初始化,向上計數,16位自動重裝模式
- TL2=0x00;TH2=0x00; //設置定時初值,完成一次中斷為65536us=65ms
- RCAP2L=0x00;RCAP2H=0x00; //設置定時重載值
- IE=0xa0; //EA=1,ET2=1;
- E0init();
- T0init();
- while(1)
- {static u8 a=0;
- while(!ir){ //低脈沖時計算高脈沖時間
- if(gao){IR[a]=TH2*256+TL2+8;
- a++;gao=0;TH2=0;TL2=0;}}
- if(di){TR0=0;TR2=1;IR[a]=us*256+TL0-4;//1個us為256,減4補誤差
- a++;di=0;TL0=0;us=0;}//高脈沖時計算低脈沖時間
- if(TH2>78){TR2=0;TH2=0;TL2=0;a=0;c=1;}//TH2>78高脈沖超20ms結束
- if(c)disp();//結束后顯示高低脈沖時間us
- } }
- void t0() interrupt 1
- {us++;di=1;}
- void E0() interrupt 0
- {TR0=1;if(TR2)gao=1;TR2=0;js++;}
- void t2() interrupt 5
- {TF2=0;} //要寫TF2=0
復制代碼
顯示部分不同程序就不同,顯示程序自己寫就行了,只要是顯示IR[]數組。
如果數碼管電路和我的一樣,就下載下面直接運行,w=100,我測試快用的,改為w=500慢顯示。
代碼:
捕捉紅外高低脈沖時間.rar
(1.37 KB, 下載次數: 7)
2021-4-12 14:38 上傳
點擊文件名下載附件
|