微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助 STC11F04E接红外1838的接收程序

求助 STC11F04E接红外1838的接收程序

时间:10-02 整理:3721RD 点击:

我这个程序下进去不行,求指点
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
uint IR_time;
//uchar tab[]={0x9f,0x24,0x0d,0x99,0xff};//数码管编码
uchar TIME[33]={0};//存放33个波形时间
uchar Time_dat[4]={0};//存放4个解码完成的数据
sbit w1=P3^4;
sbit w2=P3^5;
//sbit fmq=P3^7;
bit IR_ok;
bit IR_chuli_ok;//将波型时间转换成逻辑电平的标志位
bit start;  //标志位,开始计时标志位
void EX1_init(void)     
{
IT1 = 1;      //外部中断下降沿触发
EA  = 1;
EX1 = 1;
}
void Time1_init(void)   
{
TMOD |= 0x10;   //定时器工作在方式2(8位自动重装)
TH1 = (65536-276)/256;
TL1 = (65536-276)%256;
ET1 = 1;
TR1 = 1;
}
void IR_chuli(void)         
{         //将时间值转化为逻辑电平(转换成16进制函数)
uchar i,j;
uchar NUM = 1;         //去除引导码,因为引导码存在数组下标为0的位置,即第1位,数据从第2位开始)
uchar HL_time;        //定义一个时间变量,用于单个按键波形处理
uchar byte = 0x00;   //定义一个字节变量,用于存储转换的16进制数
for(i=0;i<4;i++)     //表示4类数据(客户码、客户反码、数据码、数据反码)
{
  for(j=0;j<8;j++)
  {
   HL_time = TIME[NUM];
   if(HL_time > 6)        //((1.125+2.25)/2=1.687ms,277us*6=1.66ms,判断为1,否则为0)
    byte |= 0x80;
   else
    byte = byte;
   if(j < 7)
    byte >>= 1;  //因为最先处理低位数据,所以要用右移方法,将低位移7次,回到本来位置)
   NUM++;
  }
  Time_dat = byte;
  byte = 0x00;
}
if(Time_dat[2] == ~Time_dat[3])  //比较数据码与数据反码是否相等,相等,表示处理成功。
IR_chuli_ok = 1; //处理成功的标志,
}
void play(void)
{
switch(Time_dat[2])
{
   case 0x45:{
             w1=w2=0;
             }break;
   case 0x46:{
             w2=w1=1;
             }break;      
         default:break;
}
/*********************************************************
  遥控器1(小)码值:          遥控器2(大)码值:
  45 46 47      05 04 06 07
  44 40 43      09 08 0a 0b
  07 15 09      0d 0c 0e 0f
  16 19 0d      15 14 16 17
  0c 18 5e      19 18 1a 1b
  08 1c 5a      11 10 12 13
  42 52 4a      01 00 02 03
          1d 1c 1e 1f
***********************************************************/
}
void main()
{
EX1_init();
Time1_init();
while(1)
{
     //P0=0xff;
  if(IR_ok) //  按键的键值时间存储完毕标志
  {
   IR_ok = 0;
   IR_chuli();  //将键值时间转换成16进制处理函数。
  }
   
  if(IR_chuli_ok)     //短按处理
  {
   IR_chuli_ok = 0;
   play();  
  }  
}
}
void EX1_(void) interrupt 2         //外部中断
{
static uchar xx = 0;    // 设置记录波形的变量;计数 0 ~33(记录34个波形的时间)
if(!start)             //第一个下降沿触发  表示解码开始
{
  start = 1;
  IR_time = 0;
}
else if(start)           //第二个下降沿到第33个下降沿            
{
  if((IR_time < 50)&&(IR_time >= 32))   //剔除引导码(引导码为9000US,在8.8MS与13.8MS之间认为是引导码)
   xx = 0;
  TIME[xx] = IR_time;    //存储按键码值时间(引导码存在数组的第一个位置,TIME[]为键值时间存储数组)
  IR_time = 0;
  xx++;
  if(xx == 33)
  {
   xx = 0;
   IR_ok = 1;     //按键键值时间存储完成的标志,等于1表示完成
   start = 0;
  }
}     
}
void Time1(void) interrupt 3    //定时器中断
{
    TH1 = (65536-276)/256;
TL1 = (65536-276)%256;
IR_time++;        //每经过256*(12/11.0592)us触发一次中断(约277US)

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top