⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianma.txt

📁 利用此程序可以实现关于红外线的编码与解码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                 }
                 break;
         case 20:sbuf2=sbuf1>>4;                   //把高半字节右移到的半字节
                 sbuf2=~sbuf2;                     //将低半字节取反
                 if((sbuf2&0x0f)!=(sbuf1&0x0f))    //判断接收是否正确
                    {                              //接受错误
                        state1=0;                  // 将接收状态标志置为零,重新接收
                        buf1=RECEIVE;              //初始化接收的地址
                        *buf1=NACK;                //把NACK信号存入发送缓冲里
                        buf1_flag=1;               //置标志位为1,使主程序能对接收错误进行处理
                        REN=0;                     //禁止接收
                    }
                 else
                    {
                    sbuf1&=0x0f;                   //仅保留低半字节,去掉高半字节
                    rsbuf1|=sbuf1;                 //高低半字节合并
                    *buf1++=rsbuf1;                //将接收的数据保存至接收缓冲里,并且数据指针加一
                    buf1_length++;                 //接收数据长度加一
                    state1=10;                     //将state1置为10,准备接收下个字节的高半字节
                    }
                 break;

         }
         }



     }
  else{

       TI=0;                                       //清除发送中断标志
       if(buf2_length)                             //判断发送长度是否为零
               {                                   //发送长度不为零
               if(state2==0)                       //判断是否发送高半字节
                   {                               //发送高半字节
                       sbuf2=*buf2;                //将要发送的字节送到sbuf2
                       rsbuf2=~sbuf2;              //取反,使高半字节变为反码
                       sbuf2>>=4;                  //将高半字节右移到低半字节
                       rsbuf2&=0xf0;               //保留高半字节,去掉低半字节
                       sbuf2&=0x0f;                //保留低半字节,去掉高半字节
                       rsbuf2|=sbuf2;              //合并高低半字节
                       SBUF=rsbuf2;                //发送出去
                       state2=10;                  //将state2置为10准备发送下半字节
                    }
                else
                    {                              //发送低半字节
                       sbuf2=*buf2;                //将要发送的字节送到sbuf2
                       buf2++;                     //指针加一
                       buf2_length--;              //发送数据长度减一
                       rsbuf2=~sbuf2;              //取反,使低半字节变为反码
                       rsbuf2<<=4;                 //将低半字节反码左移到高半字节
                       rsbuf2&=0xf0;               //保留高半字节,去掉低半字节
                       sbuf2&=0x0f;                //保留低半字节,去掉高半字节
                       rsbuf2|=sbuf2;              //合并高低半字节
                       SBUF=rsbuf2;                //发送出
                       state2=0;
                     }
                }
         else
                {                                  //如果发送数据长度为零则发送数据帧尾
                    if(buf2_flag){                 //判断是否发过数据帧尾
                    SBUF=TAIL;                     //将数据帧尾发送出去
                    while(TI==0);
                    TI=0;
                    buf2_flag=0;                   //置发送标志为零,表示发送完毕
                    }
                }
  }
  EA=1;                                             //开放中断
}









HT6221标准红外C语言解码程序

//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//★HT6221标准红外C语言解码程序                                                    ★
//★CPU  AT89S51    晶振12MHz      接口 P.7                                     ★
//★ht6221 资料:                                                                               ★
//★日期2006-06-14                                                                     
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#include<reg51.h>

#define UINT8 unsigned char
#define UINT16  unsigned int
#define UINT32 unsigned long

UINT8 IRCommandData;
UINT8 da[4]={0,0,0,0};

UINT8 table[18]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa7,0x26,0xa1,0xb1,0x34,0xab};

sbit IR=P3^7;

//============主程序====================================================
void delay(UINT16 cnt)
{
while(--cnt);
}

void d870us(void)
{
delay(108);//12M
}

void d1000us(void)
{
delay(125);//12M
}

void d4740us(void)
{
delay(593);//12M
}
//----------------------------------------------------

//-----------------------------------------------
//  ht6221解码程序
//-----------------------------------------------
UINT8 IRDecode(void)
{
     UINT8 i,m,n;

     for(i=0;i<10;i++)
     {
          d870us();
          if(IR) goto exit;
     }
     
     while(!IR);
     d4740us();

     //开始解码
     for(m=0;m<4;m++){
        for(n=0;n<8;n++){
            while(!IR);
          
            d870us();
            if(IR)
            {
                d1000us();
                da[m]=da[m]>>1;
                da[m]=da[m]|0x80;
            }
            else
            {
                da[m]=da[m]>>1;
                da[m]=da[m]|0;
            }
                //while(IR);
                //while(!IR);
        }
    }
    if((da[0]==0x0)&&(da[1]==0xFF))
    {            
        if(da[2]==(~da[3]))
           return da[2];
       }
exit:
    return 0; 
}

void SendData(UINT8 c)
{
    P0=c;
}

void main(void)
{
    P2=0xFD;//选通一位数码管
    P0=0xff;
    
    while(1)
    {
        if(!IR)
        {
            IRCommandData=IRDecode();
            switch(IRCommandData)
              { 
                   case 0x10:SendData(table[1]);break;
                case 0x03:SendData(table[2]);break;
                case 0x01:SendData(table[3]);break;
                case 0x06:SendData(table[4]);break;
                case 0x09:SendData(table[5]);break;
                case 0x1d:SendData(table[6]);break;
                case 0x1f:SendData(table[7]);break;
                case 0x0d:SendData(table[8]);break;
                case 0x19:SendData(table[9]);break;              
               default:break;
              }
         }
    }
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -