資源簡介
51單片機紅外遙控程序,21按鍵遙控器,按鍵長按短按識別,

代碼片段和文件信息
#include?
#define?uchar?unsigned?char?
#define?uint??unsigned?int
bit?IRpro_okIRok;
uchar?IRcord[4];
uchar?IRdata[33];
sbit?IRIN?=?P3^2;
uchar?IRtime;
bit?flag_mode;
uchar?count_long_time;
/*紅外遙控初始化函數(shù)*/
void?Irin_initial()
{
??EA=1;??????????//全局中斷開
??EX0=1;?????????//外部中斷0開
??IT0=1;?????????//邊沿觸發(fā)
??IRIN=1;????????????????????//I/O口初始化
}
void?int0()?interrupt?0 ?? //定義外部中斷0
{
static?uchar?i; ? // 聲明靜態(tài)變量(在跳出函數(shù)后在回來執(zhí)行的時候不會丟失數(shù)值)i用于把33次高電平的持續(xù)時間存入IRdata
static?bit?startflag; //開始儲存脈寬標志位
if(startflag) ? //開始接收脈寬檢測
{
if(?(IRtime?53)?&&?(IRtime?>=?47)?)?/*判斷是否是引導碼,底電平9000us+高4500us
這個自己可以算我以11.0592來算了NEC協(xié)議的引導碼低8000-10000+高4000-5000?
如果已經(jīng)接收了引導碼那么i不會被置0就會開始依次存入脈寬*/
{
i?=?0;
}
if(IRpro_ok==1)
{
if(?(IRtime?46)?&&?(IRtime?>=?41)?)
{
count_long_time++;
IRpro_ok=0;
}
}
?//如果是引導碼那么執(zhí)行i=0把他存到IRdata的第一個位
IRdata[i]?=?IRtime;?? ?//以T0的溢出次數(shù)來計算脈寬,把這個時間存到數(shù)組里面到后面判斷
IRtime?=?0; ?//計數(shù)清零,下一個下降沿的時候在存入脈寬
i++;? ?//計數(shù)脈寬存入的次數(shù)
if(i?==?33)? ?//如果存入34次?數(shù)組的下標是從0開始i等于33表示執(zhí)行了34次
{
? IRok?=?1; ?//那么表示脈寬檢測完畢
i?=?0;? ?//把脈寬計數(shù)清零準備下次存入
}
????
}
else ??
{
IRtime?=?0;? ?//引導碼開始進入把脈寬計數(shù)清零開始計數(shù)
startflag?=?1; ?//開始處理標志位置1
}
}
void?IRcordpro()??? ?//提取它的33次脈寬進行數(shù)據(jù)解碼
{
uchar?i?j?k?cord?value; /*i用于處理4個字節(jié),j用于處理一個字節(jié)中每一位,k用于33次脈寬中的哪一位
cord用于取出脈寬的時間判斷是否符合1的脈寬時間*/
k?=?1;? //從第一位脈寬開始取,丟棄引導碼脈寬
for(i?=?0;?i?4;?i++)
{
for(j?=?0;?j?8;?j++)
{
cord?=?IRdata[k]; ????//把脈寬存入cord
if(cord?>?5) ? //如果脈寬大于我11.0592的t0溢出率為約278us*5=1390那么判斷為1
value?=?value?|?0x80; /*接收的時候是先接收最低位,
把最低位先放到value的最高位在和0x08按位或一下
這樣不會改變valua的其他位的數(shù)值只會讓他最高位為1*/
if(j?7)
{
value?=?value?>>?1; //value位左移依次接收8位數(shù)據(jù)。
}
k++; //每執(zhí)行一次脈寬位加1
}
IRcord[i]?=?value; ???//每處理完一個字節(jié)把它放入IRcord數(shù)組中。
value?=?0;? ???//清零value方便下次在存入數(shù)據(jù)
}
IRpro_ok?=?1; ???//接收完4個字節(jié)后IRpro?ok置1表示紅外解碼完成
???if?(IRcord[2]!=~IRcord[3])
????{?EX0=1;
??????return;?}
switch(IRcord[2])
{
?case?0x16:?RUN=0;break; ??//數(shù)字0-9
?case?0x0C:?RUN=1;break;
?case?0x18:?RUN=0;break;
?case?0x5E:?RUN=1;break;
?case?0x08:?RUN=0;break;
?case?0x1C:?RUN=1;break;
?case?0x5A:?RUN=0;break;
?case?0x42:?RUN=1;break;
?case?0x52:?RUN=0;break;
?case?0x4A:?RUN=1;break;
// ?case?0x07:??flag_move=1;?break;??//左移
// ?case?0x09:??flag_move=2;?break;?//右移
?case?0x44:??flag_mode=1;break;???//mode?鍵
// // ???case?0x40:??flag_dir=2;break;???//右移
// // ?case?0x43:??flag_play?=?1;break;//play鍵
// ?case??0x46:??flag_test?=1;
// ?case?0x0D:??flag_ok?=?1;break;//EQ
// // ?case?0x00:?flag_move?=?0;flag_test=0;flag_mode=0;flag_ok=0;break;
}
?
?for(i?=?0;?i31;?i++)??//清楚緩沖區(qū)數(shù)據(jù)
?{
IRdata[i]?=?0;??
?}
// ?IRcord[2]=0x00;??????//清楚緩沖區(qū)數(shù)據(jù)
???
}
void?Timer0_Init(void) //278us@22.1184MHz
{
AUXR?|=?0x80; //定時器適庇1T
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-12-02?09:09??紅外遙控\
?????文件???????85137??2017-11-27?08:25??紅外遙控\123456.uvgui.Administrator
?????文件????????4862??2017-11-27?08:25??紅外遙控\123456.uvopt
?????文件???????13898??2017-11-27?08:25??紅外遙控\123456.uvproj
?????目錄???????????0??2017-12-02?09:09??紅外遙控\Listings\
?????文件???????11238??2017-11-27?20:40??紅外遙控\Listings\123456.m51
?????文件???????14543??2017-11-27?20:40??紅外遙控\Listings\STARTUP.lst
?????文件????????7905??2017-11-27?20:40??紅外遙控\Listings\main.lst
?????目錄???????????0??2017-12-02?09:09??紅外遙控\ob
?????文件????????8854??2017-11-27?20:40??紅外遙控\ob
?????文件????????1030??2017-11-27?20:40??紅外遙控\ob
?????文件????????1101??2017-11-27?20:40??紅外遙控\ob
?????文件?????????119??2017-11-27?20:40??紅外遙控\ob
?????文件?????????819??2017-11-27?20:40??紅外遙控\ob
?????文件????????9170??2017-11-27?20:40??紅外遙控\ob
?????文件????????6376??2016-04-01?17:01??紅外遙控\STARTUP.A51
?????文件????????4037??2017-11-27?20:40??紅外遙控\main.c
?????文件?????????322??2017-12-02?09:08??紅外遙控\readme.txt
- 上一篇:sht20驅(qū)動程序51
- 下一篇:AD9859頻率預置 +顯示
評論
共有 條評論