欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機NEC解碼頭文件irnec.h源程序
[打印本頁]
作者:
859421225
時間:
2022-3-23 16:11
標題:
51單片機NEC解碼頭文件irnec.h源程序
//*********************【 NEC解碼頭文件 】*******************
//
// 簡介:本程序適用于NCE解碼:(9ms+4.5ms)引導碼+32位編碼。
// 兼容STC所有型號(包括 1T 和 12T 系列),可以定義任意I/O作紅外接收腳,
// 自適應解碼主頻:6MHz ~ 40MHz。
//
// 使用條件:占用系統定時器0,開啟定時器0中斷(如使用其它定時器請自改IR_Init();初始化函數)
//
// 使用說明:填相關宏定義:USER_H、USER_L、Check_EN、CPU_Fosc、IR,
// 上電初始化函數IR_Init(),
// 在定時器0中斷中調用IR_NEC()解碼函數,
// 解碼有效時,IR_BT=2即短按,IR_BT=3即長按,由用戶清0,
// 解碼存放:用戶碼高8位NEC[0],用戶碼低8位NEC[1],操作碼NEC[2],操作碼反碼NEC[3]。
//
//【供用戶調用的函數】
// IR_Init(); //接收初始化,開啟定時器0中斷400us
// IR_NEC(); //紅外線解碼(解NEC編碼)
//
//***************************************************************/
#define USER_H 0x01 //用戶碼高8位
#define USER_L 0xFB //用戶碼低8位
#define Check_EN 0 //是否要校驗16位用戶碼:不校驗填0,校驗則填1
#define CPU_Fosc 12000000L //輸入主頻,自適應解碼(單位:Hz,范圍:6MHz ~ 40MHz)
#define CA_S 8 //長按時間設置,單位:108mS(即 108mS整數倍,10倍以上為宜)
sbit IR = P3^2; //紅外線接口(任意引腳)
#define Step 400 //紅外采樣步長:400us
#define TH_H ((65536-Step*(CPU_Fosc/300)/40000)/256) //定時器高8位基準賦值
#define TH_L ((65536-Step*(CPU_Fosc/300)/40000)%256) //定時器低8位基準賦值
unsigned char IR_BT; //解碼效果返回:0無效,1有效,2短按,3長按
unsigned char NEC[4]; //解碼存放:16位用戶碼、操作碼正反碼
unsigned char cntCA; //長按計數
unsigned int cntStep; //步數計
bit IRa,IRb; //接收腳電位狀態保存
bit IRsync; //同步標志
unsigned char BitN; //位碼裝載數
/*┈┈┈┈┈┈┈┈┈┈ 基準 ┈┈┈┈┈┈┈┈┈┈┈*/
#define Boot_Limit ((9000+4500 +1000)/Step) //引導碼周期上限
#define Boot_Lower ((9000+4500 -1000)/Step) //引導碼周期下限
#define Bit1_Limit ((2250 +800)/Step) //“1”周期上限
#define Bit0_Limit ((1125 +400)/Step) //“0”周期上限
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:紅外線NEC周期采樣解碼法(定時中斷,下降沿查詢周期時間)
全局變量:IR_BT = 0無效
1有效,待繼續判斷長、短按(如不需要判斷長、短按,則直接使用)
2短按
3長按
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void IR_NEC()
{
TL0 = TH_L; //重賦值
TH0 = TH_H;
cntStep++; //步數累加
if(IR_BT==1)if(cntStep>300)IR_BT=2; //解碼有效后,如果無長按,120ms(400us×300)后默認短按
IRb = IRa; //保存上次電位狀態
IRa = IR; //保存當前電位狀態
if(IRb && !IRa) //是否下降沿(上次高,當前低)
{
if(cntStep > Boot_Limit) //超過同步時間?
{
if(IR_BT==1)if(++cntCA>CA_S)IR_BT=3; //解碼有效后,繼續按住遙控>CA_S即長按
IRsync=0; //同步位清0
}
else if(cntStep > Boot_Lower){ IRsync=1; BitN=32; } //同步位置1,裝載位碼數32
else if(IRsync) //如果已同步
{
if(cntStep > Bit1_Limit)IRsync=0;
else
{
NEC[3] >>= 1;
if(cntStep > Bit0_Limit)NEC[3] |= 0x80; //“0”與“1”
if(--BitN == 0)
{
IRsync = 0; //同步位清0
#if (Check_EN == 1)
if((NEC[0]==USER_H)&&(NEC[1]==USER_L)&&(NEC[2]==~NEC[3])) //校驗16位用戶碼、操作碼正反碼
{ IR_BT=1; cntCA=0; } //解碼有效,接下來判斷:短按?長按?
#else
if(NEC[2]==~NEC[3]){ IR_BT=1; cntCA=0; } //只校驗操作碼正反碼
#endif
}
else if((BitN & 0x07)== 0) //NEC[3]每裝滿8位,移動保存一次(即 BitN%8 == 0)
{ NEC[0]=NEC[1]; NEC[1]=NEC[2]; NEC[2]=NEC[3]; }
}
}
cntStep = 0; //步數計清0
}
}
復制代碼
頭文件使用方法詳見:
http://m.raoushi.com/bbs/dpj-218217-1.html
作者:
fhl323225577
時間:
2022-3-25 14:02
樓主你這代碼中沒有判斷長按松開。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1