当前位置:文档之家› 红外发射程序

红外发射程序

/********************************************************************
* 函数库说明:包含了红外通讯常用收发函数和工具 *
* 版本说明:1.0 Bate *
* 作者:xky183 *
* 日期:2003年7月 *
* 修改:GorgonMeducer *
* 日期:2005年4月21日 *
* 平台:RC 8M *
* *
* 说明:红外通讯使用的格式为字节直接发送模式,提供4位自校验的函数 *
* 通讯时记录载波宽度。未使用串口帧格式。软件载波。 *
* *
* 硬件连接说明:PC5发送数据(可以修改宏定义) 外中断0接收数据 *
* *
* 使用说明:添加必要的代码到定时器中断,并且使用头函数中的定时器初 *
* 始化程序。使用程序中的外中断初始化程序,添加必要的部分 *
* 到外中断处理程序中。 *
* 发送 数据的时候,调用函数RaySend(),也可以调用KeyDeal()*
* 来处理并发送4位的控制信号。 *
* 对于接收信号,直接从Ordar或者RayDataIn中读取收到的字节 *
* 请自己清空RayDataIn变量 *
* 接受到的数据保存在变量ray_ordar *
* 开启红外线接收时要开外中断0: GICR=0x40; *
********************************************************************/


/*------------------------------------------------------------------*
* 红外发射程序 *
*------------------------------------------------------------------*/


#define ray_IO_on PORTC |=0B00100000;
#define ray_IO_off PORTC &=0B11011111;
#define T1I_on TIMSK |=0B00000001;
#define T1I_off TIMSK &=0B11111110;
/*---------------------*/
/* 红外发射全局变量 */
/*---------------------*/
char ray_Flag = 0;
char ray_Sign = 0;

/*---------------------*/
/* 函数声明区 */
/*---------------------*/
char KeyDeal(char TempData); //数据编码发送函数
void RaySend(unsigned char DataTemp); //数据红外发送函数
void delay_1ms(void);
void Delay_Ms(unsigned int n);
void Timer0_init(void);
void ray_send_init(void);

/***********红外线发射*****************
void ray_send_init(void) *
{

*
Timer0_init(); *
} *
**************************************/

/********************************************************************
* 函数说明:1 MS延时程序 *
********************************************************************/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(8*143-2);i++)
;
}

/********************************************************************
* 函数说明:MS延时程序 *
* 输入:需要延时的时长 *
********************************************************************/
void Delay_Ms(unsigned int n)
{
unsigned int i=0;
while(i{
delay_1ms();
i++;
}
}
/*-------------------------------------------------------------------
* 发射程序需要定时器0的支持,请粘贴以下代码到主程序 *
--------------------------------------------------------------------/
/********************************************************************
* 函数说明:定时器0中断处理程序,用来产生40MHz的载波 *
*********************************************************************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void) //需要定时器0的中断支持本函数库
{
TCNT0=0xa5;
ray_Flag++;
ray_Sign=1;
}
/********************************************************************
* 函数说明:定时器0初始化程序 *
*********************************************************************
void Timer0_init(void)
{
TCCR0=0x01; // CK
TCNT0=0x9b;

}
-------------------------------------------------------------------*/

/*******************************************************************
* 函数说明:红外发送程序 *
* 输入:要发送的数据 *
*******************************************************************/
void RaySend(unsigned char DataTemp)
{
unsigned char i=0,DataBit=0;

ray_Flag=0;
ray_Sign=0;
T1I_off;


for (i=0;i<8;i++)
{
DataBit=DataTemp & 0x01;
if(DataBit==0)
{
T1I_on;
while (ray_Flag<40)
{
ray_IO_on; //产生高电平
ray_Sign=0;
while( ray_Sign !=1);
ray_IO_off; //产生低电平
ray_Sign=0;

while( ray_Sign !=1);
}
ray_Flag=0;
ray_Sign=0;
ray_IO_off; //产生低电平
//13.125us的时间
while (ray_Flag<=40); //50
T1I_off;
ray_Flag=0;
ray_Sign=0;

DataTemp=DataTemp>>1;
}
else
{
T1I_on;
while (ray_Flag<80)
{ ray_IO_on; //产生高电平
ray_Sign=0;
while( ray_Sign !=1);
ray_IO_off; //产生低电平
ray_Sign=0;

while( ray_Sign !=1)
;
}
ray_Flag=0;
ray_Sign=0;
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<}
if(ray_count_array[i] >=0x38) //1ms为高电平
{
ray_data_in |= (1<}
}
ray_ordar = ray_data_in;
}


-----此内容被Gorgon Meducer于2005-04-26,13:27:24编辑过

相关主题
文本预览
相关文档 最新文档