📄 红外发射程序.txt
字号:
/********************************************************************
* 函数库说明:包含了红外通讯常用收发函数和工具 *
* 版本说明: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<n)
{
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -