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

📄 inf2.c

📁 红外线接收端子程序。基于stc5410ad单片机设计
💻 C
📖 第 1 页 / 共 2 页
字号:

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 函数体(Function body)
// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
//红外线接收子函数
void inf_gonggong(void)         //红外线接收公共程序
{
    TR1   = 0;                  //定时器1停止计数,晶振是24M
    inf_zanshi =  TH1*256;      //读入定时器的值
    inf_zanshi += TL1;
    inf_zanshi -= 0x1FFF;
    inf_zanshi = inf_zanshi/128;    //处理计数值,做128分频

    TH1   = 0x1F;               //定时器高位
    TL1   = 0xFF;               //定时器低位
    TR1   = 1;                  //定时器1开始计数,由于晶振是24M
    inf_shunxu++;
}

void inf_gongcuowu(void)
{
    inf_mode_cuowu = 1;         //红外线接收出现错误
    inf_shunxu = 0;
}

void inf_wancheng(void)
{
    char jiaoyanzhi = 0xFF;

    TR1 = 0;
    inf_shunxu=0;

    if(inf_dizhi_buf == inf_dizhichou_buf)  //校验数据,先地址再数据
    {
        inf_zanshi1 =  inf_shuju_buf;
        inf_zanshi1 |= inf_shujuf_buf;
        if(jiaoyanzhi == inf_zanshi1)       //如果为真则说明接收数据是正确的
        {
            TEST=!TEST;
            inf_dizhi = inf_dizhi_buf;
            inf_dizhichou = inf_dizhichou_buf;
            inf_shuju = inf_shuju_buf;
            inf_shujuf = inf_shujuf_buf;
            if(inf_shuju == inf_code_0)     //这个码是清除设定码
                     inf_array[1] = 0xFF;

            if(inf_array[1] == jiaoyanzhi)  //如果等于FFH说明现在机器人的动作是空闲
            {
                switch(inf_shuju)
                {
                case inf_code_0:
                                  break;
                case inf_code_1:  inf_array[1]=1;
                                  break;
                case inf_code_2:  inf_array[1]=2;
                                  break;
                case inf_code_3:  inf_array[1]=3;
                                  break;
                case inf_code_4:  inf_array[1]=4;
                                  break;
                case inf_code_5:  inf_array[1]=5;
                                  break;
                case inf_code_6:  inf_array[1]=6;
                                  break;
                case inf_code_7:  inf_array[1]=7;
                                  break;
                case inf_code_8:  inf_array[1]=8;
                                  break;
                case inf_code_9:  inf_array[1]=9;
                                  break;
                case inf_code_10: inf_array[1]=10;
                                  break;
                case inf_code_11: inf_array[1]=11;
                                  break;
                case inf_code_12: inf_array[1]=12;
                                  break;
                case inf_code_13: inf_array[1]=13;
                                  break;
                case inf_code_14: inf_array[1]=14;
                                  break;
                case inf_code_15: inf_array[1]=15;
                                  break;
                case inf_code_16: inf_array[1]=16;
                                  break;
                case inf_code_17: inf_array[1]=17;
                                  break;
                case inf_code_18: inf_array[1]=18;
                                  break;                
		case inf_code_19: inf_array[1]=19;
                                  break;
                case inf_code_20: inf_array[1]=20;
                                  break;
                case inf_code_21: inf_array[1]=21;
                                  break;
                case inf_code_22: inf_array[1]=22;
                                  break;
                case inf_code_23: inf_array[1]=23;
                                  break;
                case inf_code_24: inf_array[1]=24;
                                  break;
                case inf_code_25: inf_array[1]=25;
                                  break;
                case inf_code_26: inf_array[1]=26;
                                  break;
                case inf_code_27: inf_array[1]=27;
                                  break;
                default:          inf_array[1]=0xFF;
                                  break;
                }
            }
        }
    }
    //目前失败未作处理
}
//此完成函数应该进行特别处理。由于接收到的红外线按键的编码是特定码。所以需要做特别的译码,得到我们的目标码
// ─────────────────────────────────────────
// 函数原型:void INT_1(void) interrupt 2
// 函数名称:外部1断服务程序(external 1 interrupt service program)
// 功    能:
// 参    数:无
// 返 回 值:无
// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
void INT_1(void) interrupt 2
{
    if(inf_mode_en == 1)       //如果红外线接收总控制开,那么才可以判断下面的所有
    {
       if(inf_shunxu == 0)
       {
            TH1   = 0x1F;     //定时器高位
            TL1   = 0xFF;     //定时器低位
            TR1   = 1;        //定时器1开始计数,由于晶振是24M
            inf_shunxu++;     //顺序加一
            ET1   = 1;        //开定时器1的溢出中断使能
       }
       else if(inf_shunxu == 1)
       {    inf_gonggong();   //红外线接收公共程序

            if(inf_zanshi>kaishizhi_l)
            {
               inf_dizhi_buf=0;
               inf_dizhichou_buf=0;
               inf_shuju_buf=0;
               inf_shujuf_buf=0;
            }
            else     inf_gongcuowu();                    //公共错误处理
       }
       else
       {
            switch(inf_shunxu)
            {
       case 2:  inf_gonggong();			         //红外线接收公共程序
                     if(inf_zanshi<inf_lingzhi_h)        //如小于0码最大值则说明是0
                     {inf_dizhi_buf&=0xFE;}              //清除最低位
                     else if(inf_zanshi<inf_yizhi_h)
                     {inf_dizhi_buf|=0x01;}              //置最低位
                     else{inf_gongcuowu();}              //公共错误处理
                break;
       case 3:  inf_gonggong();
                     if(inf_zanshi<inf_lingzhi_h)        //如小于0码最大值则说明是0
                     {inf_dizhi_buf&=0xFD;}
                     else if(inf_zanshi<inf_yizhi_h)
                     {inf_dizhi_buf|=0x02;}
                     else{inf_gongcuowu();}              //公共错误处理
                break;
       case 4:  inf_gonggong();
                     if(inf_zanshi<inf_lingzhi_h)        //如小于0码最大值则说明是0
                     {inf_dizhi_buf&=0xFB;}
                     else if(inf_zanshi<inf_yizhi_h)
                     {inf_dizhi_buf|=0x04;}
                     else{inf_gongcuowu();}              //公共错误处理
                break;
       case 5:  inf_gonggong();
                     if(inf_zanshi<inf_lingzhi_h)        //如小于0码最大值则说明是0
                     {inf_dizhi_buf&=0xF7;}
                     else if(inf_zanshi<inf_yizhi_h)
                     {inf_dizhi_buf|=0x08;}
                     else{inf_gongcuowu();}              //公共错误处理
                break;
       case 6:  inf_gonggong();
                     if(inf_zanshi<inf_lingzhi_h)        //如小于0码最大值则说明是0
                     {inf_dizhi_buf&=0xEF;}
                     else if(inf_zanshi<inf_yizhi_h)
                     {inf_dizhi_buf|=0x10;}
                     else{inf_gongcuowu();}              //公共错误处理
                break;
       case 7:  inf_gonggong();
                     if(inf_zanshi<inf_lingzhi_h)        //如小于0码最大值则说明是0
                     {inf_dizhi_buf&=0xDF;}
                     else if(inf_zanshi<inf_yizhi_h)
                     {inf_dizhi_buf|=0x20;}
                     else{inf_gongcuowu();}              //公共错误处理
                break;
       case 8:	inf_gonggong();

⌨️ 快捷键说明

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