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

📄 ir.c

📁 在NEC78K0513上做的一个232红外互相转换的程序,可以帮助了解NEC芯片的设置和使用
💻 C
字号:



#pragma interrupt   INTP5    MD_INTP5
#pragma interrupt   INTTM50  MD_INTTM50



#define IR_GLOBALS



#include "includes.h"



#define Ir_Rx P1.6



static INT8U Ir_BitCnt;
static INT8U Ir_SendByte;
static INT8U Ir_RcvByte;
static INT8U Ir_GetTrue;



static void Ir_Send (void);
static void Ir_Rcv  (void);



IR_EXT void IrInit (void)
{
/*****38K红外载波******/
    PM1  &= 0xdf;                                                               /*P1.5设置为输出*/
    P1	 &= 0xdf;

    TMHMD0 &= 0x7f;

    TMHMD0 |= (0x03<<4);

    TMHMD0 &= 0xf0; 															/*间隔定时模式,输出低电平,禁止输出*/

    CMP00 = 0x01;


/******外部中断5*******/
    PM1 |= 0x40;                                                                /*P1.6为输入脚*/
    PU1 |= 0x40;                                                                /*外部中断5上拉电阻*/

    PMK5 = 0;
    PPR5 = 0;                                                                   /*外部中断5允许,高优先级*/
    PIF5 = 0;

    EGP  |= 0x00;
    EGN  |= 0x20;                                                               /*下降沿中断*/

/******833us定时*********/
    TMC50 &= 0x7f;

    TCL50  = 0x05;                                                              /*833us定时*/
    CR50   = 127; 

    TMMK50 = 0;
    TMPR50 = 0;
    TMIF50 = 0;

/**************************/

    Ir_BitCnt   = 0;
    Ir_SendByte = 0;
    Ir_RcvByte  = 0;
    Ir_TxOrRx   = 0;
    Ir_GetTrue  = 0;
}



static void Ir_Send (void)
{
    if (1 == Ir_BitCnt){
        Ir_SendByte = Buffer[Ir_SendCnt++];
    }

    if (0 == Ir_BitCnt){                                                        /*起始位*/
        Ir_38KOpenOut();
        Ir_BitCnt ++;
    }else if ((0 < Ir_BitCnt) && (Ir_BitCnt < 9)){
        if ((Ir_SendByte >> (Ir_BitCnt-1)) & 0x01){
            Ir_38KCloseOut();
        }else{
            Ir_38KOpenOut();
        }
        Ir_BitCnt ++;
    }else if (9 == Ir_BitCnt){
        Ir_38KCloseOut();
        Ir_BitCnt ++;
    }else if (10 == Ir_BitCnt){
        Ir_38KCloseOut();
        Ir_BitCnt = 0;

        if (Ir_SendCnt == Uart0_RcvCnt){                                        /*如果发送完毕*/
            Ir_SendCnt   = 0;
            Uart0_RcvCnt = 0;
            Ir_38KClose();                                                      /*关38K载波*/
            Ir_Close_TM50();                                                    /*关833us定时*/
            Ir_Open_INTP5();                                                    /*开外部中断5*/
            Ir_TxOrRx    = 0;
        }
    }
}



static void Ir_Rcv (void)
{	
    Ir_BitCnt ++;
    if (Ir_BitCnt < 9){
        Ir_RcvByte >>= 1;
        if (Ir_Rx){
            Ir_RcvByte |= 0x80;
        }
    }else if (Ir_BitCnt == 9){
        NOP();
    }else if (Ir_BitCnt == 10){                                                 /*如果检测到停止位*/
        Ir_BitCnt  = 0;
        Ir_GetTrue = 1;                                                         /*接收一字节成功*/
			
        Ir_Close_TM50();                                                        /*收完一字节,关833us定时*/
    }

    if (1 == Ir_GetTrue){
        Ir_GetTrue = 0;
        Buffer[Ir_RcvCnt ++] = Ir_RcvByte;
        Ir_RcvByte = 0;
        Ir_RcvFlag = 1;
        Ir_Open_INTP5();                                                        /*开外部中断*/
    } 
}



IR_EXT void Delay (INT8U delaytime)
{
    INT8U i;

    for (i=0; i<delaytime; i++){
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
    }
}



__interrupt void MD_INTP5 (void)
{
    Delay(10);
    if (1 == Ir_Rx){
        return;
    }
    Delay(10);
    if (1 == Ir_Rx){
        return;
    }else{                                                                      /*如果检测到起始位*/
        Ir_Close_INTP5();                                                       /*关外部中断5*/
        Ir_Open_TM50();                                                         /*开833us定时*/

        Tm51Open();                                                             /*开超时*/
        TimeOut = 2;

        Ir_TxOrRx = 0;
    }
}



__interrupt void MD_INTTM50 (void)
{
    if (0 == Ir_TxOrRx){
        Ir_Rcv();
    }else{
        Ir_Send();
    }
}


⌨️ 快捷键说明

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