我最近在研究用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; } |