/*********************************************************************///remote.c//学习型遥控器//使用keilc512004.10.12/*********************************************************************///使用AT89C52单片机,12MHZ晶振,////#pragmasrc(E:\remote.asm)#includereg51.h#includeintrins.h//_nop_();延时函数用//#defineucharunsignedchar#defineuintunsignedint//sbitstudylamp=P1^6;//学习状态指示灯sbitlamp=P1^7;//发射指示灯sbitstudykey=P3^2;//学习键(中断口)sbitremotein=P3^4;//遥控信号输入口sbitremoteout=P3^5;//遥控输出口sbittxkey=P1^0;//发射键////uinti,j,m=255,n,k,s;ucharidataremotedata[206];//存肪冲宽度数据用uinthead;//存起始位用uintremdata;/////////*********1毫秒延时程序**********/delay1ms(uintt){for(i=0;it;i++)for(j=0;j120;j++);}/////***********初始化函数**********/clearmen(){studylamp=0;//关学习灯lamp=0;//关发射指示remoteout=0;//关遥控输出remotein=1;//for(i=0;i206;i++)//清内存{remotedata[i]=0x00;}IE=0x00;IP=0x01;TMOD=0x22;//8位自动重装模式PCON=0X00;TH1=0xf3;//40KHZ初值TL1=0xf3;IT0=1;EX0=1;//外中断允许EA=1;//开总中断}/////**********键功能函数************/keywork(){if(txkey==0){while(txkey==0);//等待键释放ET1=1;TR1=1;//发起始位for(i=head;i0;i--){;}remoteout=0;ET1=0;TR1=0;n=0;while(1){if(remotedata[n]==0x00){delay1ms(10);break;}//数据为0结束for(i=remotedata[n];i0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}lamp=~lamp;n++;//偶地址不发脉冲//ET1=1;TR1=1;//奇地址发调制脉冲for(i=remotedata[n];i0;i--){;}remoteout=0;ET1=0;TR1=0;n++;}}}/////***********主函数***************/main(){clearmen();//初始化while(1){keywork();//按键扫描}}/////*********40KHZ发生器***********///定时中断T1voidtime_intt1(void)interrupt3{remoteout=~remoteout;}/////***********学习函数***********///外中断0voidintt0(void)interrupt0{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(remotein==1){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}if(remdatam)//高电平5毫秒退出{remotedata[n]=0x00;EX0=1;EA=1;gotoend;}remotedata[n]=remdata;n++;//存高电平脉宽数据remdata=0x0000;//脉宽计数器清零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=1;studylamp=0;}////*********************结束**************************//