📄 红外发射程序.txt
字号:
ray_IO_off; //产生低电平
//13.125us的时间
while (ray_Flag<=40); //50
T1I_off;
ray_Flag=0;
ray_Sign=0;
DataTemp=DataTemp>>1;
}
}
ray_Flag=0;
ray_IO_off; //为低电平
i=0;
T1I_off;
Delay_Ms(6); //两个字节的数据之间间隔
}
char KeyDeal(char TempData)
/********************************************************************
* 函数说明:数据格式转换(4位数据加上自己的反码作交验) *
* 输入:需要转换和发送的信息 *
* 输出:转换好的数据,并自动发送数据 *
********************************************************************/
{
char TempReturn=0;
char i=0;
TempReturn =~ TempData & 0x0f;
TempReturn <<= 4;
TempReturn |= 0x0f & TempData;
for(i=0;i<10;i++)
{
RaySend(TempReturn);
Delay_Ms(6);
}
return TempReturn;
}
/*------------------------------------------------------------------*
* 红外接受程序 *
*------------------------------------------------------------------*/
/*---------------------*/
/* 红外接收全局变量 */
/*---------------------*/
char ray_singal_num = 0; //接受信号
char ray_data_in = 0; //ray_data_in为接收的数据
char ray_symbol = 0;
char ray_count_array[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位数组
char ray_ordar = 0; //最终得到的命令(鸡肋)
/*---------------------*/
/* 函数声明区 */
/*---------------------*/
void ray_judger(void);
void int0_init(void);
void Timer1_init(void);
/*******红外线接收**********
void ray_receive_init(void)
{
int0_init();
Timer1_init();
}
***************************/
/*-------------------------------------------------------------------
* 发射程序需要定时器1和外中断0的支持,请粘贴以下代码到主程序 *
--------------------------------------------------------------------/
/********************************************************************
* 函数说明:定时器1初始化程序 *
*********************************************************************
void Timer1_init(void)
{
TCNT1 =0;
TCCR1B =0x03;
}
/********************************************************************
* 函数说明:外中断0初始化程序 *
*********************************************************************
void int0_init(void)
{
MCUCR=0x02;//开中断0、下降沿触发脉冲
GIFR=0Xff;
}
#pragma interrupt_handler ext_int0:2 //M8参考外中断向量
/********************************************************************
* 函数说明:外中断0中断处理程序 *
*********************************************************************
void ext_int0(void)
{
char temp =0;
temp = TIMSK;
TIMSK = 0;
if(ray_symbol == 0)
{
if(TCNT1 >= 0x00ff) //大于4MS则重置指针
{
ray_singal_num = 0;
}
TCNT1 = 0X00; //0.5ms记数值为31
MCUCR = 0X03; //INT0上升沿触发
ray_symbol = 1;
}
else
{
if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))
{
ray_count_array[ray_singal_num] = TCNT1L;
ray_singal_num ++;
if (ray_singal_num == 8)
{
ray_singal_num = 0;
ray_judger();
}
ray_symbol = 0;
}
else
{
ray_singal_num = 0;
}
MCUCR = 0X02; //INT0下降沿触发
TCNT1 = 0;
}
TIMSK = temp;
}
/*******************************************************************/
/********************************************************************
* 函数说明:红外信号处理程序 *
********************************************************************/
void ray_judger(void)
{
char i=0;
ray_data_in=0;
for(i=0;i<8;i++) //加入适当的冗错处理
{
if(ray_count_array[i] < 0x38) //0.5ms为低电平
{
ray_data_in &= ~(1<<i);
}
if(ray_count_array[i] >=0x38) //1ms为高电平
{
ray_data_in |= (1<<i);
}
}
ray_ordar = ray_data_in;
}
-----此内容被Gorgon Meducer于2005-04-26,13:27:24编辑过
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -