项目中要用到红外遥控,要先学习遥控器的编码,然后在发出去,也就是万能遥控器的功能,想着很麻烦,就在淘宝上买了个万能遥控器,想回来改装,买回来了,发现一改装,咋看咋不专业,客户肯定不满意,跟拼凑别人的产品似的,算了,还是自己整吧,嘿嘿,不说废话了,还是看我咋做的红外遥控学习机的吧
1 、功能:利用单键学习型遥控器可以学习任何遥控器的某种按键功能,编码保存在 24C 02 中,保证掉电之后,编码不丢失
2 、使用方法:按下学习键,学习灯亮,用遥控器对准红外遥控接收头,学习完成之后,学习灯熄灭,状态等亮,说明可以发射了,按发射键,就可以发射学习到的编码
3 、系统硬件设计
使用 89C 52 单片机 12M 晶振
sbit studylamp=P2^7; // 学习指示灯
sbit lamp=P2^6; // 状态指示灯
sbit studykey=P3^2; // 学习键 (外部中断)
sbit remotein=P1^1; // 信号输入
sbit remoteout=P1^0; // 信号输出
sbit txkey=P0^0; // 发射键
4 、软件设计
( 1 )初始化
studylamp=1; // 学习灯不亮
lamp=1; // 发射灯不亮
remoteout=0; // 关遥控输出
remotein=1; // 输入位
IE=0x00;// 关闭中断
IP=0x01;// 设定优先级 外部中断优先级高
TMOD=0x22; // 定时器控制寄存器设置串口工作方式 模式 2 自动装入计数器
TH0=0xf3; // 设定定时器 1 初值 40KHZ 初值
TL0=0xf3;
PCON=0x00;// 设定串口 波特率不加倍
IT0=1;// 外部中断 脉冲触发 边沿触发
EX0=1;// 允许外部中断 0
EA=1; // 打开总中断
( 2 )学习功能
学习功能的程序可以完成遥控编码的起始位识别、遥控码的宽度计数功能、结束位的识别功能,遥控码的帧间歇位宽度在 10MS 以上,起始位码宽度在 100us----20ms 之间,编码位在 100us-------5ms 之间
确定起始位:高电平宽度超过 5.355ms ,接着是低电平码,就是起始位
读遥控编码:对高电平或者低电平进行脉宽计数,点评掉变的时候计数计数,将计数值保存,确定结束位:在高电平计数,如果超过 5.355ms ,则判断为结束帧位,写入 0x00 作为结束标志
( 3 )编码发射
遥控码发送处理程序利用计数器计数中断功能,实现 40KHz 载波的发送,利用接收的电平时间,控制载波的发送时间
( 4 )向 24c 02 中写数据
void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
参数:要写入的数据、要写入的地址、要写入的数据的个数
( 4 )读 24c 02 中写数据
void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
参数:读出来的数据要存放的地址、要读的地址、要读的数据的个数
( 5 )延时程序
用于键盘的消抖操作
5 、主程序
// 主函数
void main()
{
clearmen();// 初始化
while(1)
{
key_tx(); // 发射按键扫描
}
}
学习按键是外部中断 0 发射编码的时候用的是定时 0 中断
/----------------------------------------------------------------------------------------
作者:宇帆 cfanlwn