您当前的位置:五五电子网电子知识单片机-工控设备51单片机Philips 87LPC768红外解码程序 正文
Philips 87LPC768红外解码程序

Philips 87LPC768红外解码程序

点击数:7414 次   录入时间:03-04 11:41:52   整理:http://www.55dianzi.com   51单片机
#include <REG768.H>             /*Philips 87LPC768 寄存器定义头文件*/
#define REDINT 0x06             /*红外线间隔*/

/*存放消息标志的可位寻址字节Message,Message=NULL时无任消息*/
unsigned char bdata Message;

/*在接收过程中置位,检测标置位Get可以有效防止其它进程干扰接收,防止数据丢失*/
sbit RedMsg=Message^0;             /*红外遥控消息*/
sbit RedRead=Message^1;             /*位接收过程标志*/
sbit RedBit =Message^2;             /*接收到的位值*/
sbit RSend =Message^3;             /*红外接收中重新发送标志*/

/*存放遥控的字数据,低4位存放接收到的bit的位移,高12位从低到高存放接收到的bit*/
unsigned char bdata RedDataL,RedDataH;

/*RedDataH字节低6位代表指令,只有一个1,C1~C3是用户码,H表示连续,S1、S2分别表示第
一、二组单发*/
sbit RedData0=RedDataL^4;         /*C1*/
sbit RedData1=RedDataL^5;         /*C2*/
sbit RedData2=RedDataL^6;         /*C3*/
sbit RedData3=RedDataL^7;         /*H*/
sbit RedData11=RedDataH^0;         /*D6*/
sbit RedData10=RedDataH^1;         /*D5*/
sbit RedData9=RedDataH^2;         /*D4*/
sbit RedData8=RedDataH^3;         /*D3*/
sbit RedData7=RedDataH^4;         /*D2*/
sbit RedData6=RedDataH^5;         /*D1*/
sbit RedData5=RedDataH^6;         /*S2*/
sbit RedData4=RedDataH^7;         /*S1*/
unsigned char bdata State;             /*状态字节*/
sbit RedControl=State^6;             /*遥控状态*/

/*定时器T00 的高位定时参数为Timer,定时256*Timer+(80--336)个周期,共139Timer+(43~
182)us<37ms。定时器T01的高位定时节参数为nTimer,定时256*nTimer+(24~280)个周期,
139nTimer+(13~152)us<9.1s。RedCon存放红外接收时的载波计数*/
unsigned char data RedCon,Timer;
unsigned int nTimer;                 /*定时整型参数*/

void main()
{
IEN0=0x14;                     /*只打开INT1中断*/
WDRST=0x1E;                 /*看门狗清0*/
WDRST=0xE1;
WDCON=0x12;                 /*40-90ms看门狗(>最大延时37ms)*/
TCON=0x40;                     /*定时器1开始工作, INT1低电平触发*/
TMOD=0x23;                 /*定时器0扩展成两个8位定时器T00和T01用于同步控制*/
if((WDCON&0x30)!=0x30)         /*看门狗陷阱复位时无需初始化*/
{
Message=0;                     /*无消息*/
State=0;                     /*正常复位无任何状态*/
}
while(1)                     /*消息循环*/
{
WDRST=0x1E;                 /*看门狗清0*/
WDRST=0xE1;
EX1= RedControl;             /*设置遥控中断INT1 */
if(RedMsg)                 /*执行遥控指令*/
{
EX1=0;                     /*在指令没有处理完之前不能重复中断*/
switch(RedDataH)             /*这里加入红外指令的控制过程*/
{
case 0x82:                 /*Channel 1*/
break;
case 0xA0:                 /*Channel 2*/
break;
      }
EX1=1;
RedDataL=0;                 /*复位红外数据*/
RedDataH=0;                 /*复位红外数据*/
RedMsg=0;                 /*复位红外遥控消息*/
}
}
}

void Count0(void) interrupt 1 using 3      /*定时器T00中断,最大定时37ms*/
{
if(Timer!=0)                     /*检测定时器T00的扩展高位*/
{
Timer--;
return;
}
}


/*INT1用于红外解码状态遥控解码数据处理,nTimer=1定时152~291us*/
void Inte1() interrupt 2 using 2
{
for(nTimer=8;nTimer>1;nTimer--);    /*使处理周期达到51机器周期=27.7us使得
RedCon<32*/
if(RedRead)                     /*0信号宽度a=420us,1信号宽度a=1260us,周期4a=1680us*/
RedCon++;
else                        /*开始计数或者重新发送时开始计数*/
{
RedBit=0;                     /*复位接收位*/
RedCon=0;                 /*复位载波计数*/
RedRead=1;                 /*置位位接收标志*/
if(!ET1)                     /*首次接收时没有启动定时器T01接收第一个位*/
{
TF1=0;                     /*复位定时器T01溢出标志*/

[1] [2] [3]  下一页


本文关键字:程序  51单片机单片机-工控设备 - 51单片机