?? saa3010.c
字號:
/****************************************/
/*杭州電子&計算機工作室 */
/*http://www.hificat.com */
/*SAA3010紅外線遙控解碼實驗 */
/*目標器件:AT89S51 */
/*晶振:11.0592MHZ */
/*編譯環境:Keil 7.50A */
/****************************************/
#define SAA3010_GLOBALS
#include <reg51.h>
#include "SAA3010.h"
#include "main.h"
//===========================================================================================================
// 該函數的作用是每調用一次就在temp1-4組成的32bit長度的最低位上移入
// 一個0或者1,數據由bitdata確定
void SAA3010_cycle_data(unsigned char bitdata)
{
temp4=temp4<<1;
if((temp3&0x80)==1) temp4=temp4|0x01;
else temp4=temp4&0xfe;
temp3=temp3<<1;
if((temp2&0x80)==1) temp3=temp3|0x01;
else temp3=temp3&0xfe;
temp2=temp2<<1;
if((temp1&0x80)==1) temp2=temp2|0x01;
else temp2=temp2&0xfe;
temp1=temp1<<1;
if(bitdata==1) temp1=temp1|0x01;
else temp1=temp1&0xfe;
}
//===========================================================================================================
// 解碼出錯返回1,對則返回0
unsigned char SAA3010_decode(void)
{
//-----------------------------------------------------------------------------------------------------------
unsigned char count=0;
TR1=1; // 啟動計時
while(1)
{
while(ir_receive==0); // 等待電平變高,不需要超時監測
TR1=0; // 高電平(對發射電路而言)測試結束
high_level_time=TH1*256+TL1; // 記錄高電平的數據
//-----------------------------------------------------------------------------------------------------------
TH1=0; TL1=0; TR1=1; // 啟動對低電平的測試
//-----------------------------------------------------------------------------------------------------------
// 處理低電平
if((high_level_time<750)||(high_level_time>1800)) return 1; // 不是合格的電平
if((high_level_time>750)&&(high_level_time<1000)){SAA3010_cycle_data(0);count+=1;} // 移入一個0
if((high_level_time>1500)&&(high_level_time<1800)) {SAA3010_cycle_data(0);SAA3010_cycle_data(0);count+=2;} // 移入兩個0
while(ir_receive==1) // 等待電平變低
{
if(TH1>0x08) break; // 高電平超時,正常情況下是測試結束,異常時則是出錯
}
TR1=0; // 低電平(對發射電路而言)測試結束
if(TH1>0x08) {break;}
low_level_time=TH1*256+TL1; // 保存低電平的數據
TH1=0; TL1=0; TR1=1; // 為增加計時的準確性,數據的處理都是在計時過程里
//-----------------------------------------------------------------------------------------------------------
// 處理高電平
if((low_level_time<750)||(low_level_time>1800)) return 1; // 不是合格的電平
if((low_level_time>750)&&(low_level_time<1000)) {SAA3010_cycle_data(1); count+=1;} // 移入一個0
if((low_level_time>1500)&&(low_level_time<1800)) {SAA3010_cycle_data(1); SAA3010_cycle_data(1);count+=2;} // 移入兩個0
}
if(count==26) {SAA3010_cycle_data(1); count++;}
if(count!=27) return 1;
led=0;
// 提取按健信息
key_code=0;
if((temp1>>1)&0x01) key_code=key_code|0x01;
else key_code=key_code&0xfe;
if((temp1>>3)&0x01) key_code=key_code|0x02;
else key_code=key_code&0xfd;
if((temp1>>5)&0x01) key_code=key_code|0x04;
else key_code=key_code&0xfb;
if((temp1>>7)&0x01) key_code=key_code|0x08;
else key_code=key_code&0xf7;
if((temp2>>1)&0x01) key_code=key_code|0x10;
else key_code=key_code&0xef;
if((temp2>>3)&0x01) key_code=key_code|0x20;
else key_code=key_code&0xdf;
// 提取系統信息
sys_code=0;
if((temp2>>5)&0x01) sys_code=sys_code|0x01;
else sys_code=sys_code&0xfe;
if((temp2>>7)&0x01) sys_code=sys_code|0x02;
else sys_code=sys_code&0xfd;
if((temp3>>1)&0x01) sys_code=sys_code|0x04;
else sys_code=sys_code&0xfb;
if((temp3>>3)&0x01) sys_code=sys_code|0x08;
else sys_code=sys_code&0xf7;
if((temp3>>5)&0x01) sys_code=sys_code|0x10;
else sys_code=sys_code&0xef;
if((temp3>>7)&0x01) sys_code=sys_code|0x20;
else sys_code=sys_code&0xdf;
data_available=1;
return 0;
}
//===========================================================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -