载波 对 载波时,输出为 低电平;
/**********************************************************************
* 函数: U8 Conversion_Num(u8 data)
* 功能: // 数据调整,调整发射(由 低到 高 位)
* 输入: 有
* 输出: 有
***********************************************************************/
u8 Conversion_Num(u8 data)
{
u8 data_1 = 0;
u8 data_2 = 0;
for (u8 i = 0; i < 8; i++)
{
data_1 = data;
data_1 &= 0x01; // 取 最末位;
data_2 += data_1;
if(i == 7)
{
return data_2;
}
data = data >> 1; // 向右移1位,与运算,取最末位;
data_2 = data_2 << 1; // 向左移1位,末尾补0,加运算,数据连起
}
return data_2;
}
/**********************************************************************
* 函数: Xor(u8 x_data, u8 y_xor)
* 功能: 数据 异或 取反码
* 输入: 有
* 输出: 有
***********************************************************************/
u8 Xor(u8 x_data, u8 y_xor)
{
u8 a;
u8 b;
u8 c;
a = x_data;
b = y_xor;
c = a ^ b;
return c;
}
/**********************************************************************
* 函数: Send_Date(u8 x_address, y_code)
* 功能: 数据调整;(发送数据)
* 输入: 有
* 输出: 有
将 4 组数据组成 32位 码,4段(8位字节)由 低 到 高 发射出去
***********************************************************************/
u32 Send_Date(u8 x_address, u8 y_code)
{
u32 data = 0;
u8 num_1;
u8 num_2;
u8 num_3;
u8 num_4;
num_1 = Conversion_Num(x_address);
num_2 = Conversion_Num(Xor(x_address, 0xFF));
num_3 = Conversion_Num(y_code);
num_4 = Conversion_Num(Xor(y_code, 0xFF));
data |= num_1;
data = data << 8;
data |= num_2;
data = data << 8;
data |= num_3;
data = data << 8;
data |= num_4;
return data;
}
/**********************************************************************
* 函数: 红外发送驱动 数据
* 功能:
* 输入: 无;
* 输出: 无
引导码:9ms 载波 + 4.5ms 空闲
比特值 0:560us 载波 + 560us 空闲 ( 1拍 载波 + 1拍 空闲 )
比特值 1:560us 载波 + 1.68ms 空闲 ( 1拍 载波 + 3 拍 空闲 )
1. 使用定时器 产生一个 13us 的定时中断(当13us翻转一次 IO,产生的就是38K的频率)
2. 发送红外键值时,按 NEC时序 依次发送:( 引导码、用户码、用户反码、键码反码,停止位 (1拍 载波) )
***********************************************************************/
void Ir_Send(u32 data)
{
u8 i = 0;
ir_flag = 0; // 初始化红外,默认为 关
// 9ms 起始信号,低电平, 683*13us = 8.879 ms ( 后面的 *3/4 为实际的校准3值 )
// ir_count = 683 *3/4;
ir_count = 645;
ir_flag = 1; // 红外 发射 打开
while(ir_count); // 在此期间,输出 38KHz 方波 脉冲;
// 4.5ms 起始信号,高电平, 341*13us = 4.433 ms ( 后面的 *3/4 为实际的校准3值 )
// ir_count = 341 *3/4;
ir_count = 320;
ir_flag = 0;
while(ir_count); // 在此期间,停止 输出 38KHz 方波 脉冲;
// 循环发送 32bit 的数据 4 * 8 = 32 位 数据 (用户码、用户反码、键值码,键值反码)
for(i = 0; i < 32; i++)
{
//通用 0.56ms 低电平, 42 * 13us = 0.546 ms ( 后面的 *3/4 为实际的校准3值 )
// ir_count = 42 * 3 / 4;
ir_count = 42;
ir_flag = 1; // 红外 发射 打开
while(ir_count); // 在此期间,输出 38KHz 方波 脉冲;
// 数值 0
if((data & 0x80000000) == 0)
{
// 0.56ms 高电平, 43 * 13us = 0.559 ms ( 后面的 *3/4 为实际的校准3值 )
// 比特值 0:560us 载波 + 560us 空闲
// ir_count = 43 * 3/4; // 控制 打开的 时间长短 与 定时器 同行程
ir_count = 43;
}
else
{
// 1.69ms 高电平, 128 * 13us = 1.664 ms ( 后面的 *3/4 为实际的校准3值 )
// 比特值 1:560us 载波 + 1.68ms 空闲
// ir_count = 128 * 3/4; // 控制 关闭的 时间长短 与 定时器 同行程
ir_count = 116; // 1.68 ms
}
// 执行 高 电平
ir_flag = 0;
while(ir_count);
data <<= 1; // 数据向 左移 1 位,补0
}
// 停止位 1拍 发射信号 时长控制
ir_count = 43;
ir_flag = 1;
while(ir_count);
// 关闭红外
ir_flag = 0;
}
/**********************************************************************
* 函数: Init_TIM4(void)
* 功能: 定时器 4 初始化
* 输入: 无;
* 输出: 无
向上 自动计数 每 13us 中断一次;让 端口 翻转;
//f = 38KHz -> T(周期) = 26.32 所以 单个翻转在 13us;(方波)
***********************************************************************/
void Init_TIM4(void)
{
TIM4_CR1 = 0x00; // 关闭计数器
TIM4_PSCR_PSC = 4; // 主时钟 16MHz, TIM 采用 2……4 = 16 分频 = 1MHZ(1us); 每次计数 为 1us;
// TIM4_PSCR = 4; //分频值
// TIM4_IER=0x00;
TIM4_IER = 0x01; //更新中断使能
TIM4_EGR = 0x01;
// TIM4_CNTR = 255; //计数器值
TIM4_ARR = 13; // 自动重装的值 每 13us 定时中断一次
// TIM4_CR1 = 0x01;//使能计数器
TIM4_CR1_CEN = 1; // 使能计数器
}
/**********************************************************************
* 函数: TIM4 中断
* 功能:
* 输入: 无;
* 输出: 无
在 批定 时间内 发送 38K Hz 载波
***********************************************************************/
#pragma vector = 25 // TIM2 更新/上溢
__interrupt void Inter_TIM4(void)
{
// TIM4_SR = ( ~0x01 ); //清除更新中断标志
TIM4_SR = 0x00;
// TIM4_SR_UIF = 0; // 清除更新中断标志
// 输出一个反转信号;
if( ir_count > 0)
{
ir_count --;
}
// 计数值 计算
if(ir_flag == 1) // 有 输出 发射
{
if(ir_count > 0)
{
IR_T = !IR_T; // 输出 方波
}
}
}
联系人:客服在线
手机:全工:13903011251
电话:李R:13530006400
邮箱:729986191@qq.com
地址: GUANGDONG PROVINCE