本帖最后由 1五湖四海1 于 2011-7-8 20:51 編輯
經(jīng)過這幾天制作單片機紅外線遙控解碼的學(xué)習(xí)研究中,,遇到了許多不解的問題,雖然有了難題但是我不愿意請教我的老師,,因為不經(jīng)思考隨便跑去問別人問題會失去自己獨立學(xué)習(xí)和解決實際問題的好機會,。為了學(xué)習(xí)單片機技術(shù),滿足自己DIY的愿望我努力,,認真的分析沒一條語句,,最終在今天晚上我的DIY單片機紅外遙控解碼器調(diào)試初步成功了,手里拿著遙控器隨便按了一個鍵子,,便會在單片機接收器數(shù)碼管上顯示該鍵子了數(shù)據(jù)編碼,。甭提心里有多高興了,我興奮了一個晚上,。
這回DIY我心愛的數(shù)字存儲示波器為我立下汗馬功勞,,幫我捕捉了遙控器發(fā)射的數(shù)據(jù)編碼,讓我可以借助儀器解出每一個按鍵數(shù)據(jù)編碼,。示波器在調(diào)試單片機紅外接收器延時程序時,,也起到重大作用。這次成功還少不了跟隨我5年的臺式電腦和USB編寫器,。
圖片 002.jpg (63.47 KB, 下載次數(shù): 101)
下載附件
2011-7-8 10:07 上傳
實驗電路板
PIC110615101455.jpg (245.42 KB, 下載次數(shù): 96)
下載附件
2011-7-8 10:02 上傳
汗馬功勞的示波器
#include<reg51.h> //成功時間2011.07.08 // 函數(shù)原型
void SystemInit(void);
void Delay_840us(void);
void Delay_2400us(void);
void LedDisp();
unsigned char GetCode(void);//獲得碼 // 位變量
sbit IRIN = P3^2;
// 變量
unsigned char KeyValue; //機器碼
unsigned char MaValue; //鍵值碼,;
unsigned char disbuf[4]; //數(shù)碼管顯示緩沖
unsigned char code table[16] =
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
* 延時9ms
*/
void Delay_9000us(void)
{
TH1=(65536-27300)/256;
TL1=(65536-27300)%256;
TR1 = 1;
while(!TF1);
TF1 = 0;
TR1 = 0;
} /**
* 延時4.5ms
*/
void Delay_4500us(void)
{
TH1=(65536-13800)/256;
TL1=(65536-13800)%256;
TR1 = 1;
while(!TF1);
TF1 = 0;
TR1 = 0;
} //延時0.84ms
void Delay_840us(void)
{
TH1=(65536-2520)/256;
TL1=(65536-2520)%256;
TR1 = 1;
while(!TF1);
TF1 = 0;
TR1 = 0;
} /**
* 系統(tǒng)初始化
*/
void SystemInit(void)
{
IRIN = 1;
IT0 = 1; //INT0負跳變觸發(fā)
TMOD = 0x10; //定時器1工作在方式1
EA = 1;
EX0 = 1;
} /**
* 讀碼
*/
unsigned char GetCode()
{
unsigned char n; static temp = 0; for( n = 0; n < 8; n++ )
{
while(!IRIN); // 等待高電平,開始解碼 Delay_840us(); // 延時0.84ms if(IRIN) // 若仍然為高電平,,則為1,,否則為0
{
temp = (0x80|(temp>>1)); // 1
while(IRIN); //等待跳變成低電平
}
else {
temp=(0x00|(temp>>1)); // 0
}
} return temp;
} /**
* 數(shù)碼管顯示
*/
void LedDisp()
{
/* unsigned char i;
for(i=0;i<4;i++)
{
P1=0xff;
P1=table[disbuf];
P2=0xdf;
delay(4);
P2>>=1;
}*/
P1=table[disbuf[1]];
P2=table[disbuf[0]];
} void main(void)
{
SystemInit(); while(1)
{
//以下是查表顯示
disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);
disbuf[1]=KeyValue&0x0f;
// disbuf[2]=(((MaValue&0xf0)>>4)&0x0f);
// disbuf[3]=MaValue&0x0f;
LedDisp();
}
}
void interr_ir(void) interrupt 0
{
/**
* 用戶碼和機器碼
*/
unsigned char addrl,addrh,num1,num2;
EA = 0; //先關(guān)閉外部中斷0
Delay_9000us(); // 檢測9ms開始碼 if (!IRIN) { // 檢測是否為干擾信號
EA = 1; // 重新開啟外部中斷0
return ; // 退出解碼
}
while(!IRIN); // 等待跳為高電平 Delay_4500us(); // 檢測4.5ms結(jié)果碼 if (IRIN) { // 檢測是否為干擾信號
EA = 1; // 重新開啟外部中斷0
return ; // 退出解碼
} // 讀碼
addrl=GetCode(); // 用戶編碼高位
addrh=GetCode(); // 用戶編碼低位
num1=GetCode(); // 機器碼
num2=GetCode(); // 機器碼反碼 //校驗是否為錯碼
if(num1!=~num2)
{
KeyValue=14;
EA=1;
return;
} KeyValue=num2;
MaValue=addrh; EA=1;
}
|