我最近在研究用51做一个学习型遥控器,参考了网上的一些程序,只是这个程序只是用于学习单个按键的,而且还不是很稳定,我想做一个能够学习多个按键的遥控器,不过我刚开始学单片机不久,对于网上的那个程序还不能完全看出究竟有哪些不足,也不知道如何在它的基础上将遥控代码存进AT24C02等系列的存储器里面,希望有相同兴趣爱好的或者之前有过研究的人能够指点下,感激不尽,若有较完善的程序代码的话,那就感激涕零了。 /********学习型遥控器程序*********/ #include<reg52.h> #include<intrins.h> //延时函数 #define uchar unsigned char #define uint unsigned int sbit studylamp=P1^6; //学习指示灯 sbit lamp=P1^7; //发射指示灯 sbit studykey=P3^3; //学习键 sbit remotein=P3^2; //遥控信号输入口 sbit remoteout=P3^5; //遥控信号输出口 sbit txkey=P3^0; //发射键 uint i,j,m=2040,n,k,s; uchar idata remotedata[206]; //存脉冲宽度数据用 uint head; //存起始位用 uint remdata; // /****一毫秒延时程序****/ delay1ms(uint t) { for(i=0;i<t;i++) for(j=0;j<120;j++) ; } /****初始化程序****/ clearmen() { studylamp=1;//关学习指示灯 lamp=1; //关发射指示灯 remoteout=0; //关遥控输出 remotein=1; // for(i=0;i<206;i++) {remotedata=0x00;} //清内存 IE=0x00; IP=0x01; TMOD=0x22;//八位自动重装模式 PCON=0x00; TH1=0xf3;//40KHz初值 TL1=0xf3; IT1=1;//脉冲延跳变模式 EX1=1; //外中断允许 EA=1; //开总中断 } /*****键功能函数****/ keywork() { if (txkey==0) {while(txkey==0);//等待键释放 ET1=1; TR1=1;//发起始位 for(i=head;i>0;i--){;} remoteout=0; ET1=0; TR1=0; n=0; while(1) { if(remotedata[n]==0) {delay1ms(10);break;} //数据为0结束 for(i=remotedata[n];i>0;i--) {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} lamp=~lamp; n++;//偶地址不发送 ET1=1; TR1=1;//奇地址发送调制脉冲 for(i=remotedata[n];i>0;i--){;} remoteout=0; ET1=0; TR1=0; n++; } } } /******主函数****/ main() { clearmen(); while(1) { keywork(); } } /****40KHz载波发生函数*****/ void time_intt(void)interrupt 3 { remoteout=~remoteout; } /*******学习函数*****/ //外中断1 void intt1(void)interrupt 2 { ET1=0;TR1=0;EA=0;EX0=0;EX1=0; head=0;studylamp=0;lamp=1; 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++; } head=head-1; n=0;remdata=0x00; while(1) { while(remotein==1) {_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();remdata++; } if(remdata>m) //高电平大于5毫秒退出 {remotedata[n]=0x00;EX1=1;EA=1; goto end;} remotedata[n]=remdata;n++;//存高电平脉宽数据 remdata=0x00;//脉宽计数器清零 while(remotein==0) {_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); remdata++; }//低电平计数 remotedata[n]=remdata; n++; remdata=0x00;//存低电平脉宽数据 } end:lamp=0;studylamp=1; } |