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