?? rem.c
字號:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <mylib.h>
sbit prem=P3^3; //定義遙控接收腳
uchar remkey; //設(shè)置四個遙控數(shù)據(jù)區(qū)域,前兩個為用戶自定義代碼,后兩個為實際接受的數(shù)據(jù)
bit relable; //其中前兩個字節(jié)實測相等,后兩個字節(jié)正好相反,以此作為遙控數(shù)據(jù)正確性效驗。
void rem()interrupt 2
{uchar ram[4]={0,0,0,0};
uchar i; //干擾脈沖檢測記數(shù)
uchar count; //移位控制記數(shù)
uchar ramc;
if(relable)
return; //遙控接收數(shù)據(jù)數(shù)組下標(biāo)
for(i=0;i<30;i++);
{
delay(1);
if(prem) //剛開始的引導(dǎo)碼為4.5MS的低電平,如果在此期間出現(xiàn)高電平則視為干擾脈沖,退出中斷
return;
}
while(prem!=1); //引導(dǎo)碼4.5MS低電平之后應(yīng)為4.5MS的引導(dǎo)高電平,此處為等待高電平的到來。
delay(46); //延時大概4.6MS正好跨過4.5MS的引導(dǎo)高電平而進入32位數(shù)據(jù)的第一位。
for(ramc=0;ramc<4;ramc++)//從此處開始進入32位4個字節(jié)的遙控數(shù)據(jù)接收,此處的外循環(huán)為字節(jié)切換
for(count=0;count<8;count++)//以下將接收到的數(shù)據(jù)移位到數(shù)組的每一個單元
{
while(prem!=1); //實際上邏輯1和邏輯0都是以0.56MS的低電平開始,所不同的是高電平的延長時間,高電平延長時間為1.6MS的是1,高電平為0.56MS的是0。第21行的延時語句已經(jīng)進入邏輯0和邏輯1的公共特性區(qū)(0.56MS的低電平區(qū))此處的語句將等待高電平的到來,以便以高電平的長短來區(qū)分1和0。
delay(8); //延時0.8MS后判斷遙控接收腳的電平以此判斷0或1,此處的延時應(yīng)高于0.56MS而小于1.12MS
if(prem==1)
{
ram[ramc]=(ram[ramc]<<1)+1;//如果是遙控接收腳是高電平,將1移入當(dāng)前單元。
delay(10); //延時1MS跨入下一個遙控發(fā)射碼邏輯1,或0的低電平
}
else
ram[ramc]=(ram[ramc])<<1; //如果是遙控接收腳是低電平,將0移入當(dāng)前單元。
} //因為是接收到邏輯0,所以26行的延遲已經(jīng)足夠進入下一個遙控發(fā)射碼邏輯1,或0的低電平。
if(ram[3]!=(~ram[2]))//32位數(shù)據(jù)接收完后進行后兩個字節(jié)的效驗,發(fā)生錯誤將4個字節(jié)清零,
{ram[0]=0;
ram[1]=0;
ram[2]=0;
ram[3]=0; //很有必要進行校驗,因為由于遙控器和接收頭的空間位置的變化經(jīng)常造成接收數(shù)據(jù)的錯誤。
return;
}
remkey=ram[3];
} //接收成功后數(shù)據(jù)存放在數(shù)組ram(只用后兩個單元的任何一個就行了
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -