?? gdram-wireless.c
字號:
/* 3.解碼原理
編碼器PT2262發送的編碼信號是由:地址碼、數據碼、同步碼組成的一個完整碼字,最多可以有
12位(A0-A11)三態地址端引腳(懸空、高電平、低電平),任意組合可提供531441個地址碼。
將編碼器PT2262的A8位拉高,D3拉高,D0拉高,D1拉低,其余懸空。截取一段接收信號輸出波形
如圖3所示,PT2262每發射一次,至少發送4組相同編碼字碼。每組字碼間隔(低電平)約14ms。
將其截獲波形每組字碼放大,如圖4所示,一組字碼有12位A/D碼,每個A/D位是由2個脈沖表示:
2個窄脈沖則表示"0";2個寬脈沖表示"1";1個窄脈沖和一個寬脈沖表示"F",即地址碼"懸空";
除此之外,每組字碼之間還有一個同步碼隔開,所以每組字碼共計有25個寬度不同的脈沖。
窄脈沖寬為200us;寬脈沖寬為1200us;兩個窄脈沖之間寬1200us;兩個寬脈沖間寬200us;
寬窄脈沖間寬為200us;在4組字碼中,每組的字碼間隔為4000us。因此,采用單片機軟件解碼時,
只要判斷出起始碼,并且識別起后面的字碼脈沖寬度即可。
4.抗干擾措施
常用抗干擾措施,是在硬件電路中采用電源濾波、電源穩壓、數字地與模擬地隔離。在設計中,
除采用上述方法外,還根據干擾信號與有效信號波形特征異同點,采用軟件識別干擾信號和有效信號,
從而實現"抗干擾"目的。
當遙控器不發射時,由于空氣中各雜波干擾,接收模塊的信號輸出端仍然會有干擾信號,截獲波形如圖5所示。
觀察其特征,低電平最長為3000us,最短數十微秒;高電平最長500us,最短數微秒。與發射時接收到的規則
波形(即非有效信號)相比較,低電平為1400us的信號,是有效信號,而不是干擾信號。并將A0-A3
4個地址焊接到高電平上作為發射編碼信號的幀前碼,可解決誤碼率和干擾問題。
5.軟件解碼
步驟1:單片機循環記錄接收模塊信號電平脈沖的長度,高低電平都記錄。
步驟2:從記錄高低電平組成的波形中,找出連續8個1200?s時長的脈沖信號為特征波形段,即幀前碼。
(A0-A3 4個地址焊接到高電平上作為發射編碼信號的幀前碼)
步驟3:確認幀前碼之間是否存在一個時長為14000us的低電平,如果有(則說明不是干擾碼),
將解碼并儲存結果,然后根據指令碼執行相應控制功能。如沒有,則放棄記錄的數據,重復步驟1,
直到滿足條件為止。 */
#include<STC2052.h>
#include"LCM12864.h"
#include <math.h>
#define NBW 50 //窄脈沖位寬
#define STEP1 20 //寬脈沖位寬
#define WBW 150 //寬脈沖位寬
#define STEP3 40 //寬脈沖位寬
#define SBW 1200 //同步碼低電平寬度
#define STEP2 100 // 同步碼低電平寬度誤差
#define PurseNum 100
#define ValidNum 24
unsigned int k,i=0,j;
unsigned int bite_H[PurseNum]; //存高電平,至少接收2組
unsigned int bite_L[PurseNum]; //存低電平
unsigned char PurseH[PurseNum];
sbit DIN = P3^2; //無線信號接收端
sbit LED = P3^7; //驅動LED
bit DisplayFlag = 0;
void bianma() //記錄高低電平脈寬
{
for(j=0;j<PurseNum;j++) { bite_H[j]=0;bite_L[j]=0; PurseH[j]=0; }
for(j=0;j<PurseNum;j++) //用計數方式記錄脈寬
{
while(DIN){ bite_H[j]++;}
while(!DIN) {bite_L[j]++;}
}
}
void yima()
{
for(j=0;j<PurseNum;j++)
{
if(abs(NBW-bite_H[j])<STEP1)
{
if((abs(SBW-bite_L[j])<STEP2))
{
if((abs(NBW-bite_H[j+1])<STEP1)|(abs(WBW-bite_H[j+1])<STEP3))
{
for(i=0;i<ValidNum;i++)
{
if(bite_H[j+1+i]<NBW){ PurseH[i]= 0; }
else if(bite_H[j+1+i]<WBW){ PurseH[i]= 1; }
}
break; // 跳出for(j=0;j<PurseNum;j++)
}
}
}
}
}
//unsigned char tab_dotH[8]={0x80,0x40,0x20,0x10,0x00,0x00,0x00,0x00};
//unsigned char tab_dotL[8]={0x00,0x00,0x00,0x00,0x08,0x04,0x02,0x01};
bit UpDw=1; // 1:Up; 0:Down
void LedFlash()
{
LED = 0; Delay(50);
LED = 1; Delay(50);
}
void DrawSize()
{
Draw0(8,25,1);
Draw2(8,17,1);
Draw4(8,9,1);
Draw6(8,1,1);
Draw8(0,25,1);
Draw10(0,17,1);
Draw12(0,9,1);
Draw14(0,1,1);
}
//------------------------------------------------------------------------------
main()
{
Clear_Gdram();
Draw_Half_Rectangle();
DrawSize();
i=8; j=30; UpDw=1;
P3M1 = 0x04;
P3M0 = 0x00;
InitLcm();
while(1)
{
bianma();
yima();
WriteCom_Dat(0x80,0);
for(i=0;i<ValidNum;i++) {if(PurseH[i]==1) DisplayFlag = 1;}
// if(DisplayFlag)
{
for(i=0;i<16;i++) {WriteCom_Dat(StringDigit[PurseH[i]],1);}
for(i=16;i<24;i++) {WriteCom_Dat(StringDigit[PurseH[i]],1);}
DisplayFlag = 0;
}
/* if(i==8)
{
Gdram_Write_Word(i,j,0xff,0xff);
UpDw = 1; i=i+1;
}
Gdram_Write_Word(i,j,0x80,0x00);
// for(k=0;k<8;k++) Gdram_Write_Word(i,j,tab_dotH[k],tab_dotL[k]);
if(UpDw){ j=j-1;}else{ j=j+1;}
if((j==0)&&(UpDw))
{
if(i>=8){ Gdram_Write_Word(i,j,0x80,0x00); i=i-8; j=31;}
else { Gdram_Write_Word(i,j,0xff,0xff); UpDw= 0;i=i+1;}
if(i==8)
{
for(k=1;k<32;k++) Gdram_Write_Word(7,k,0x80,0x01);
for(k=0;k<31;k++) Gdram_Write_Word(15,k,0x80,0x01);
i=17;
}
}
if((j==31)&&(!UpDw))
{
if(i<8){ Gdram_Write_Word(i,j,0x80,0x00); i=i+8; j= 0;}
else { j=30;Gdram_Write_Word(i,j,0xff,0xff); UpDw= 1; i=i+1; }
}
if(i>16)
{
Delay(5000);
Clear_Gdram();
Draw_Half_Rectangle();
DrawSize();
i=8; j=30; UpDw=1;
} */
LedFlash();
}
}
//------------------------------------------------------------------------------
/*
//------------------------------------------------------------------------------
main()
{
Clear_Gdram();
Draw_Half_Rectangle();
DrawSize();
i=8; j=30; UpDw=1;
while(1)
{
if(i==8)
{
Gdram_Write_Word(i,j,0xff,0xff);
UpDw = 1; i=i+1;
}
Gdram_Write_Word(i,j,0x80,0x00);
// for(k=0;k<8;k++) Gdram_Write_Word(i,j,tab_dotH[k],tab_dotL[k]);
if(UpDw){ j=j-1;}else{ j=j+1;}
if((j==0)&&(UpDw))
{
if(i>=8){ Gdram_Write_Word(i,j,0x80,0x00); i=i-8; j=31;}
else { Gdram_Write_Word(i,j,0xff,0xff); UpDw= 0;i=i+1;}
if(i==8)
{
for(k=1;k<32;k++) Gdram_Write_Word(7,k,0x80,0x01);
for(k=0;k<31;k++) Gdram_Write_Word(15,k,0x80,0x01);
i=17;
}
}
if((j==31)&&(!UpDw))
{
if(i<8){ Gdram_Write_Word(i,j,0x80,0x00); i=i+8; j= 0;}
else { j=30;Gdram_Write_Word(i,j,0xff,0xff); UpDw= 1; i=i+1; }
}
if(i>16)
{
Delay(5000);
Clear_Gdram();
Draw_Half_Rectangle();
DrawSize();
i=8; j=30; UpDw=1;
}
LedFlash();
}
}
//------------------------------------------------------------------------------
main()
{
Clear_Gdram();
Draw_Half_Rectangle();
DrawSize();
i=0; j=31; UpDw=1;
while(1)
{
if(i==0)
{
Gdram_Write_Word(i,j,0xff,0xff);
i=i+1; UpDw = 1;
}
Gdram_Write_Word(i,j,0x80,0x00);
// for(k=0;k<8;k++) Gdram_Write_Word(i,j,tab_dotH[k],tab_dotL[k]);
if(UpDw){ j=j-1;}else{ j=j+1;}
if(j==0)
{
Gdram_Write_Word(i,j,0xff,0xff);
i=i+1; UpDw = 0;
if(i==8){for(k=1;k<31;k++) Gdram_Write_Word(7,k,0x80,0x01);}
}
if(j==31)
{
Gdram_Write_Word(i,j,0xff,0xff);
i=i+1; UpDw = 1;
}
if(i>8)
{
Delay(5000);
Clear_Gdram();
Draw_Half_Rectangle();
DrawSize();
i=0; j=31; UpDw=1;
}
LedFlash();
}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -