毕业设计论文-智能学习型遥控系统的设计与实现内容摘要:

发码。 要想译码必须先了解其发码规则,经查阅相关资料,了解到此遥控器所发的红外信号是由引导码,8位的客户码,8位的客户码反码,8位的键码,8位的键码反码,再加延时,然后再有第二个引导码,如果按键还按着就循环第二引导码。 经过研究此遥控器各键的发码,发现各键所发的红外信号引导码,客户码,第二引导码都是相同的,不同之处仅只有键码不同,而且键码后8位为前8位的反码,所以我们所关注的只是键码部分的波形。 从资料上了解到此,此波形的逻辑0定义为560ms的高电平加上560 ms的底电平,逻辑1定义为560ms的高电平加上1690ms的底电平。 我们译码就是要译出8位键码的各位是0还是1,从逻辑定义可以发现,它们只是低电平时间不同,因此只要用定时器记住低电平的时间就可以译码了,当然还要断判下是否是NEC编码,这里只需要检测引导码就可以了。 以下程序段是此遥控器的译码检测程序:/ //红外发送程序 include define uchar unsigned char define uint unsigned int define send0 send_pulse_565 ()。 send_space_1685 ()。 define send1 send_pulse_565 ()。 send_space_560 ()。 uchar SYS_DATA=0x49。 //系统码 sbit OUT=P3^7。 void send_bit (uchar one_bit)。 //发送一位字节 void send_data (uchar one_data)。 //发送一个数据 //包括一个起始标志 一个系统码及其反码 一个数据码(one_data)及其反码 char code disp[]={0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0x30,0x25,0xA7,0x26,0xA1,0xB1}。 char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0。 //显示缓冲 void delay(uchar t) { char a。 while(t) for(a=255。 a0。 a)。 } void display(uchar t) { while(t) { P0=disp[i1]。 P2=0x7f。 //对P2口进行赋值 delay(1)。 P2=0xff。 //对P2口进行赋值 P0=disp[i2]。 P2=0xbf。 //对P2口进行赋值 delay(1)。 P2=0xff。 //对P2口进行赋值 P0=disp[i3]。 P2=0xdf。 delay(1)。 P2=0xff。 //对P2口进行赋值 P0=disp[i4]。 P2=0xef。 delay(1)。 //延时一小段时间 P2=0xff。 P0=disp[i5]。 P2=0xf7。 delay(1)。 P2=0xff。 P0=disp[i6]。 P2=0xfb。 //对P2口进行赋值 delay(1)。 //延时一小段时间 P2=0xff。 P0=disp[i7]。 P2=0xfd。 delay(1)。 P2=0xff。 P0=disp[i8]。 P2=0xfe。 delay(1)。 P2=0xff。 } } void send_pulse_9000 (void) //9ms脉宽 { TH0=0xdc。 TL0=0xff。 TR0=1。 TR1=1。 while(TR0)。 TR1=0。 OUT=1。 } //发送引导码中9ms的高电平void send_space_4500 (void) // { OUT=1。 TH0=0xee。 TL0=0x7f。 TR0=1。 while(TR0)。 OUT=1。 } //void send_pulse_565 (void) // { TH0=0xfd。 TL0=0xee。 TR0=1。 TR1=1。 while(TR0)。 TR1=0。 OUT=1。 } //发送客户码565ms的高电平void send_space_1685 (void) // { OUT=1。 TH0=0xf9。 TL0=0x7f。 TR0=1。 while(TR0)。 OUT=1。 } void send_space_560 (void) // { OUT=1。 TH0=0xfd。 TL0=0xea。 TR0=1。 while(TR0)。 OUT=1。 } void send_bit (uchar one_bit) { uchar i。 uchar key_num=0x01。 for(i=0。 i8。 i++) { send_pulse_565 ()。 // if( (one_bitamp。 key_num)==1 ) send_space_1685 ()。 //先发低位 else send_space_560()。 // one_bit=one_bit1。 //one_bit右移一位 } } void send_data (uchar one_data) { uint t=1000。 send_pulse_9000()。 //起始码 9ms的脉宽 考虑到误差 send_space_4500()。 // send_bit (SYS_DATA)。 //发系统码 send_bit (~SYS_DATA)。 //发系统码的反码 send_bit (one_data)。 //发数据码 send_bit (~one_data)。 //发数据码的反码 TR1=1。 while(t)。 TR1=0。 OUT=1。 } void main(void) { uchar c=0x77。 uint t=65535。 TMOD=0x21。 //T0产生精确时间的延时或脉宽 16位 //T1产生38kHz方波 8位自动重装 TH1=0xf3。 TL1=0xf3。 IE=0x8a。 delay(255)。 display(100)。 delay(255)。 display(100)。 while(1) { send_data(c)。 } } void time0 (void) interrupt 1 { TR0=0。 TR1=0。 } void time1 (void) interrupt 3 //T1用来产生38kHz方波 { OUT=~OUT。 } 按键检测程序的实现 本系统的按键检测分两种情况,一种是矩阵按键按下的时候,这时候红外发射头会发送一帧信号,信号里面含有该按键的键码。 另一种是按下学习按键后,系统将等待对方的信号输入,如果有信号输入,将该信号译码并保存至存储器中备用,如果没有信号输入,系统将等待一定得时间,如果超过等待时间还没有信号输入,系统将又回到获取键码的状态。 以下程序段是此系统检要的按键检测程序://判断是哪键接下程序//功能:根据键码中的值按键后需要做出的反应//条件:temp_h,temp_l中要有值//结果:current_n中得到当前按键if(temp_h==0x00amp。 temp_l==0x09)current_n=1。 //判断是不是矩阵键1if(temp_h==0x01amp。 temp_l==0x0d)current_n=2。 //判断是不是矩阵键2if(temp_h==0x01amp。 temp_l==0x0f)current_n=3。 //判断是不是矩阵键3if(temp_h==0x01amp。 temp_l==0x09)current_n=4。 //判断是不是矩阵键4if(temp_h==0x00amp。 temp_l==0x0d) //判断是不是学习按键 {current_n++。 if(current_n==7)current_n=1。 } 对蜂鸣器鸣叫控制程序的实现本系统中的蜂鸣器鸣叫控制程序比较简单,当需要鸣叫的时候,给控制蜂鸣器的脚输出低电平,则蜂鸣器鸣叫,当输出高电平时,蜂鸣器不会鸣叫。 通过调整输出低电平时间的长短可以控制鸣叫的时间长短。 反复通断可以让蜂鸣器连续鸣叫。 以下程序段为对蜂鸣器鸣叫控制程序://蜂鸣器鸣叫程序 Beep=1。 //一开始蜂鸣器是不应该叫的//有按键按下时,译码,蜂鸣器鸣叫 beep=0。 //输出低电平让蜂鸣器鸣叫 delay05s()。 // beep=1。 //输出高电平让蜂鸣器停止鸣叫 写入单片机的部分详细程序请参见附录。 系统的开发环境及测试分析6 系统的开发环境及测试分析。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。