您好,欢迎访问三七文档
遥控电子密码锁整体设计思想:P0.0~P0.7D0~D78051液晶1602RSP3.5ENP3.4RWP3.6红外INT0/P3.2SDASCLP2.0P2.1AT24C02I2C总线协议I2C总线协议定义如下•1.只有在总线空闲时才允许启动数据传送•2.在数据传送过程中当时钟线为高电平时数据线必须保持稳定状态不允许有跳变时钟线为高电平时数据线的任何电平变化将被看作总线的起始或停止信号启动、停止I2C总线voidinit()//24c02初始化子程序{scl=1;nop();sda=1;nop();}voidstart()//启动I2C总线{sda=1;nop();scl=1;nop();sda=0;nop();scl=0;nop();}voidstop()//停止I2C总线{sda=0;nop();scl=1;nop();sda=1;nop();}总线时序选择读时序voidwritebyte(unsignedcharj)//写一个字节{unsignedchari,temp;temp=j;for(i=0;i8;i++){temp=temp1;scl=0;nop();sda=CY;//temp左移时,移出的值放入了CY中nop();scl=1;//待sda线上的数据稳定后,将scl拉高nop();}scl=0;nop();sda=1;nop();}unsignedcharreadbyte()//读一个字节{unsignedchari,j,k=0;scl=0;nop();sda=1;//初始化for(i=0;i8;i++){nop();scl=1;nop();if(sda==1)j=1;elsej=0;k=(k1)|j;scl=0;}nop();return(k);}voidrespons()//I2C总线时钟{unsignedchari=0;scl=1;nop();while((sda==1)&&(i255))i++;scl=0;nop();}////////从24c02的地址address中读取一个字节数据/////unsignedcharread24c02(unsignedcharaddress){unsignedchari;start();writebyte(0xa0);respons();writebyte(address);respons();start();writebyte(0xa1);//最低位为1,读操作respons();i=readbyte();stop();delay1(100);return(i);}//////向24c02的address地址中写入一字节数据info/////voidwrite24c02(unsignedcharaddress,unsignedcharinfo){start();writebyte(0xa0);//最低为0,写操作respons();writebyte(address);respons();writebyte(info);respons();stop();delay1(5000);//这个延时一定要足够长,否则会出错。因为24c02在从sda上取得数据后,还需要一定时间的烧录过程。}AT24C02CAT24WC02是一个2K位串行CMOSE2PROM。本实验是利用24c02的第110到115地址单元作为密码存储区,同时掉电可记忆。液晶模块初始化过程/*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38);/*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08);/*显示关闭*/LCD_Write_Com(0x01);/*显示清屏*/LCD_Write_Com(0x06);/*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C);/*显示开及光标设置*/}/*------------------------------------------------写入字符函数------------------------------------------------*/voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData){if(y==0){LCD_Write_Com(0x80+x);}else{LCD_Write_Com(0xC0+x);}LCD_Write_Data(Data);}红外遥控模块数据格式:引导码是9ms+4.5ms,头码过后可以看到4个8位的数据,我们最终目的就是要把这个32位(4x8)从一体化红外接收头提取出来,并转换成16进制数,用于区分不同按键按下得出的不同数值。在遥控器发射波形中,可以看出,8位数中的0或者1不是用高低电平表示,而是用不同的低电平的宽度表示,0.565ms表示0,1.69ms表示1,2个位中间还会有一个0.56ms的高电平。遥控器发射出去的含有载波的红外信号通过一体化红外接收头处理后得到的是含有载波的反向的波形,用中断方式,外部中断0和定时器,外部中断主要用于接收红外波形下降沿触发,定时器用于计时(测量2个下降沿的宽度)。基本原理分析如下,如接收到头码是4.5ms低电平+4.5ms高电平,我们分析第一个下降沿到第二个下降沿的宽度是9ms,我们判断这个头码可以给定一个范围,只要数据在这个范围内则认为头码是正确的,检测头码正确后接着检测剩下的32位数值。voidtim0_isr(void)interrupt1using1{irtime++;//用于计数2个下降沿之间的时间}voidEX0_ISR(void)interrupt0//外部中断0服务函数{staticunsignedchari;//接收红外信号处理staticbitstartflag;//是否开始处理标志位if(startflag){if(irtime63&&irtime=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}红外遥控器按键编码switch(IRcord[2])//判断第三个数码值{case0x16:key=0;wei++;break;//0显示相应的按键case0x0c:key=1;wei++;break;//1case0x18:key=2;wei++;break;//2case0x5e:key=3;wei++;break;//3case0x08:key=4;wei++;break;//4case0x1c:key=5;wei++;break;//5case0x5a:key=6;wei++;break;//6case0x42:key=7;wei++;break;//7case0x52:key=8;wei++;break;//8case0x4a:key=9;wei++;break;//9case0x19:genggai=1;wei=0;break;//更改密码100+case0x09:if(allow)ok=1;break;//ok按键EQcase0x0d:retry=1;break;//retry按键200+case0x07:close=1;break;//close按键-default:break;}
本文标题:遥控电子密码锁剖析
链接地址:https://www.777doc.com/doc-3618349 .html