《NEC協(xié)議的紅外遙控器驅(qū)動程序.doc》由會員分享,可在線閱讀,更多相關(guān)《NEC協(xié)議的紅外遙控器驅(qū)動程序.doc(4頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
.
是不是覺得紅外遙控+51單片機(jī)是絕妙組合?但是在編程時(shí)才發(fā)現(xiàn)超級糾結(jié)?其實(shí)也沒那么糾結(jié),自己摸索摸索,總能找出辦法來的。
本程序占用了51單片機(jī)的定時(shí)器0以及中斷1兩個(gè)資源,為的是使單片機(jī)能接收到每一個(gè)紅外脈沖信號,一個(gè)都不能少。如果舍不得用這兩個(gè)資源,還有另一種查詢的辦法,就是不一定每個(gè)信號都能收到,可自己琢磨一下。
需要全套NEC協(xié)議紅外遙控器資料的,到網(wǎng)上找,到處都有,而且很全。
另外,對著資料寫程序如果實(shí)在寫不出,可以找個(gè)示波器,把波形錄下來好好研究研究。畢竟有些時(shí)候資料會過時(shí),只要里面有一點(diǎn)東西變化了,程序就完全不一樣了。這種彎路,盡量少走。
本程序只是頭文件,具體到應(yīng)用上還要各位自己動腦筋了,希望對大家有所幫助。共同學(xué)習(xí),共同進(jìn)步!
/******************************************************************
INF_NEC.h
用于NEC協(xié)議的遙控器,主控器為51單片機(jī)。用戶碼8位,分布于2-17個(gè)脈沖;
按鍵碼8位,分布于18-33個(gè)脈沖。皆為前8原碼,后8反碼。
注意:本驅(qū)動占用51單片機(jī)的外部中斷1以及定時(shí)器0兩個(gè)資源,編程時(shí)注意
不要再亂動這兩個(gè)資源。
*******************************************************************/
#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í)器的計(jì)時(shí)次數(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及定時(shí)器0的初始化函數(shù)
{
TMOD=(TMOD&0xf0)|0x02; //定時(shí)器0模式2,8位自動重裝
TH0=0x19;
TL0=0x19; //11.0592MHz晶振,計(jì)數(shù)230次,大概時(shí)間250us
ET0=1;TR0=0; //定時(shí)器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)//長時(shí)間無紅外遙控信號時(shí)關(guān)定時(shí)器
{
nec_time=0;nec_num=0;nec_flag=0;TR0=0;
}
}
void exint1(void) interrupt 2
{
uint intime=0;//intime:為了不打擾計(jì)時(shí)器工作,所以用intime把nec_time提出來
intime=nec_time;nec_time=0;//nec_time置0,準(zhǔn)備計(jì)數(shù)
if(nec_num==0)TR0=1;//開定時(shí)器,開始計(jì)數(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://www.szxfmmzy.com/p-1102478.html