5.1 主程序流程图设计
主程序在完成上电初始化后进行端口按键查询,当确认有按键按下时将编码发出去。主程序流程图如图5-1所示。
图5-1 主程序流程图
功能程序:
main()
{
clearmen();//初始化程序
while(1)
{
keywork();//按键扫描
}
}
初始化程序clearmen():主要任务是清除存放脉宽数据单元,关闭学习指示灯及发射指示灯,关闭遥控输出口,将定时器T1设为8位自动重装模式,设置中断等。
按键扫描keywork():电路上电后,程序运行到主程序后开始不停的循环执行按键扫描,待有按键按下时跳入中断函数并开始执行相应软件;若按下了学习按键,那么单片机开始接收从红外接收器解码电路产生的二进制代码信息,并存储到数据存取单元中;若按下的是发射键,单片机将会通过红外线发射二极管发射已学习到单片机内的遥控码,在发射遥控码之前需要将遥控码基带信号加载到40kHz的载波上,才能够将已学习的遥控信号发射出去。
5.2 遥控码读入处理程序流程图设计
遥控码的学习处理程序主要是将遥控器发出的脉冲码宽一次存入内存单元,存放规则为偶数地址单元存放高电平脉宽数据,奇数地址存放低电平脉宽数据。定义文件中划了206个单元用于存放脉宽数据,符合常用遥控器的最大码长要求。遥控码读入处理程序流程图如图5-2所示。
图5-2 遥控码读入处理程序流程图
本程序在编程设计中非常重要,通过大量、不同种类的遥控码波形实验测试分析,遥控码的帧间歇位宽度均为10ms以上,起始位码宽度在100us~20ms之间,编码位在100us~3.5ms之间。为确保所有遥控器学习的成功,可采用以下程序实现方法。
读起始位方法:由于起始位的码宽范围较大,因此计数单元采用单独的2字节,计数周期约为15us,这样按65535*15us算,最大可存起始位脉宽为983ms。当输入为高电平时,停止起始位计数,进入高电平计数。
读遥控编码方法:采用1字节计数单元对码进行宽度计数,电平跳变时结束计数,并将数据存入规定的地址。在高电平计数时,当大于255时,则判定为结束帧间隔位,在相应存储单元写入数据0X00作为结束标志。
功能程序:
void intt0(void)interrupt 0
{
ET1 = 0;TR1 = 0;EX0 = 0;EA = 0;
head = 0;studylamp = 1;lamp = 0;
while(studykey == 0);//等待键释放
while(remotein == 1);//等待遥控码输入
head=0;//读入起始位
while(remotein == 0)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();head++;
}
n=0;remdata = 0x0000;
while(1)
{
while(remdata == 1)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;
}
if(remdata > m)//高电平大于5ms退出
{
remotedata[n] = 0x00;EX0 = 1;EA = 1;goto end;
}
remotedata[n]=remdata;n++;//存高电平脉宽数据 AT89S52单片机的自学习红外遥控器设计+源代码+电路图(12):http://www.youerw.com/zidonghua/lunwen_1471.html