《NEC協(xié)議的紅外遙控器驅(qū)動程序.doc》由會員分享,可在線閱讀,更多相關(guān)《NEC協(xié)議的紅外遙控器驅(qū)動程序.doc(4頁珍藏版)》請在裝配圖網(wǎng)上搜索。
.
是不是覺得紅外遙控+51單片機是絕妙組合?但是在編程時才發(fā)現(xiàn)超級糾結(jié)?其實也沒那么糾結(jié),自己摸索摸索,總能找出辦法來的。
本程序占用了51單片機的定時器0以及中斷1兩個資源,為的是使單片機能接收到每一個紅外脈沖信號,一個都不能少。如果舍不得用這兩個資源,還有另一種查詢的辦法,就是不一定每個信號都能收到,可自己琢磨一下。
需要全套NEC協(xié)議紅外遙控器資料的,到網(wǎng)上找,到處都有,而且很全。
另外,對著資料寫程序如果實在寫不出,可以找個示波器,把波形錄下來好好研究研究。畢竟有些時候資料會過時,只要里面有一點東西變化了,程序就完全不一樣了。這種彎路,盡量少走。
本程序只是頭文件,具體到應(yīng)用上還要各位自己動腦筋了,希望對大家有所幫助。共同學(xué)習(xí),共同進(jìn)步!
/******************************************************************
INF_NEC.h
用于NEC協(xié)議的遙控器,主控器為51單片機。用戶碼8位,分布于2-17個脈沖;
按鍵碼8位,分布于18-33個脈沖。皆為前8原碼,后8反碼。
注意:本驅(qū)動占用51單片機的外部中斷1以及定時器0兩個資源,編程時注意
不要再亂動這兩個資源。
*******************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
uchar nec_flag=0;//nec_flag:遙控碼的標(biāo)志位。0:無信號;1、2:信號采集;3、可用信號
uchar nec_num=0;//nec_num:紅外碼的序號
uint nec_time=0;//nec_time:定時器的計時次數(shù)nec_time*250us
uchar nec_cod[2]={0,1};//遙控器的編號,編號0為原碼,編號1為反碼
uchar nec_dat[2]={0,1};//遙控器的數(shù)據(jù),數(shù)據(jù)0為原碼,數(shù)據(jù)1為反碼
#ifndef __INF_NEC__
#define __INF_NEC__
extern void nec_init();
extern void nec_act();
#endif
void nec_init() //外中斷1及定時器0的初始化函數(shù)
{
TMOD=(TMOD&0xf0)|0x02; //定時器0模式2,8位自動重裝
TH0=0x19;
TL0=0x19; //11.0592MHz晶振,計數(shù)230次,大概時間250us
ET0=1;TR0=0; //定時器0使能,先關(guān)著
IT1=1;EX1=1; //外部中斷1使能,用來接收紅外信號
EA=1; //開總中斷
}
void nec_act()//按鍵功能程序
{
if((nec_dat[0]==~nec_dat[1])&&(nec_flag==3))
{
switch(nec_dat[0])
{
case 69: break;
case 70: break;
case 71: break;
case 68:break;
case 64:break;
case 67:break;
case 7:break;
case 21:break;
case 9:break;
case 22:break;
case 25:break;
case 13:break;
case 12:break;
case 24:break;
case 94:break;
case 8:break;
case 28:break;
case 90:break;
case 66:break;
case 82:break;
case 74:break;
}
}
}
void timer0(void) interrupt 1
{
nec_time++;
if(nec_time>1000)//長時間無紅外遙控信號時關(guān)定時器
{
nec_time=0;nec_num=0;nec_flag=0;TR0=0;
}
}
void exint1(void) interrupt 2
{
uint intime=0;//intime:為了不打擾計時器工作,所以用intime把nec_time提出來
intime=nec_time;nec_time=0;//nec_time置0,準(zhǔn)備計數(shù)
if(nec_num==0)TR0=1;//開定時器,開始計數(shù)
if(nec_num==1){if((intime>50)&&(intime<60))nec_flag=1;}
if(nec_num==2){if((intime>2)&&(intime<11))nec_flag=2;}
if(nec_flag==2)
{
if((nec_num>=2)&&(nec_num<=9))
{
if((intime>2)&&(intime<6))nec_cod[0]=nec_cod[0]&~(0x01<<(nec_num-2));
else if((intime>7)&&(intime<11))nec_cod[0]=nec_cod[0]|(0x01<<(nec_num-2));
}
if((nec_num>=10)&&(nec_num<=17))
{
if((intime>2)&&(intime<6))nec_cod[1]=nec_cod[1]&~(0x01<<(nec_num-10));
else if((intime>7)&&(intime<11))nec_cod[1]=nec_cod[1]|(0x01<<(nec_num-10));
}
if((nec_num>=18)&&(nec_num<=25))
{
if((intime>2)&&(intime<6))nec_dat[0]=nec_dat[0]&~(0x01<<(nec_num-18));
else if((intime>7)&&(intime<11))nec_dat[0]=nec_dat[0]|(0x01<<(nec_num-18));
}
if((nec_num>=26)&&(nec_num<=33))
{
if((intime>2)&&(intime<6))nec_dat[1]=nec_dat[1]&~(0x01<<(nec_num-26));
else if((intime>7)&&(intime<11))nec_dat[1]=nec_dat[1]|(0x01<<(nec_num-26));
}
}
nec_num++;if(nec_num>35){nec_num=35;nec_flag=3;}
}
4
可編輯修改
鏈接地址:http://ioszen.com/p-1102478.html