📄 ir.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 + -