case 1:for(j=0 case 3:for(j=0 case 4:for(j=0 case 5:for(j=0 case 6:for(j=0 default:k=0;break; } init2();//必须先读EEPROM再开定时器中断,不然会无法读EEPROM } } // /**********************************************************************/ void led(uchar x) { j=0; x=x/2;//2个数组是一段电平,而且肯定是偶数个数组 2*N 是偶数嘛 while(x) { TH0=a[j]; j++; TL0=a[j]; j++; TR0=1;// while(!TF0);//等待T0溢出,因为没有采用T0中断 contrl=!contrl; x--; } } // /***************************************************************/ /*****编程时防止中断把寄存器中的数据改变的解决方法是给中断指定寄存器,同优先级的使用同一组没事。 1、写中断程序一定要用using语句指定寄存器组。第1、2、3组都可以,不能是0. 2、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。 这样相同级别中断可以使用同一个组。比如:低优先级的中断函数都用 using 1,高优先级的中断都用 using 2 。这样不会冲突。 下面是一个正常的例子: C程序: void int0() interrupt 0 using 1 默认5个中断时同级的,不会冲突,但是最好养成好习惯 不指定中断要使用的寄存器,每次都要入栈保护数据,中断完还要出栈,代码会增加32字节 ********************************************************************/ //中断函数要指定使用那组寄存器,使用同一组时可能会破坏了上次寄存器中的数据 //同一优先级的中断可以使用同一组寄存器 void time0() interrupt 1 using 1//定时器0中断 { EA=0; EX0=0; EX1=0; ET0=0; FASHE=0; delayms(200); JIESHOU=0; //接收指示灯 delayms(1000); //有65MS以上了,表示接收完毕 b[zu/0x200]=j; //j是从0开始的,最后一次电平存完j自加1了,总长度正好是当前值 addr=zu;//因为下面zu值还要用,所以这里转移其数据 //zu是每个存储空间的起始地址 m=0; for(;j>0;j--)//j是数据总长度,如此判断,不会存储多余的空位 { Byte_Program(addr,a ??);//从本组数据对应扇区首地址开始写EEPROM m++; //数组下移 addr++; //地址下移 delayms(1);} //for end i<(zu<0xa00)//第一组代码完毕后,转到第二组,每组都是200个空间 zu+=0x200; //测完一组 ,扇区地址指向下一个扇区 else { zu=0x000;} //超过6组代码,内存重新指向第1组 flag=0; receive=0;//用完接收启动标志要清0 end=1;//退出接收函数最外层循环 } /******************************************************/ // 发射频率38khz由T1产生 void time1() interrupt 3 using 1 //定时器1中断 ,因为默认是同优先级,所以可以使用同一组寄存器 { khz=!khz; } /******************************************************/ // 外部中断 存储高电平长度 void interint0() interrupt 0 using 1 //外部中断0 { if (flag==0)//flag=0表示是首次接收到脉冲 { TH0=0; TL0=10;//前面延时函数消耗的时间补上 TR0=1; EX0=0;//关闭外部中断0,以后的计数都在接收函数里 flag=1;//表示启动T0 } } // /************************************************************/ /******************************************************/ // 外部按键中断 1 void interint1() interrupt 2 using 1 //外部中断1 { receive=1; delayms(122);//等过抖动时间 EA=0; } /******************************************************/ //AD转换初始化 ----打开ADC电源 void InitADC() { P1=0xff;//这里对其他用到P1口的地方有影响 ADC_CONTR|=0x80; delayms(30); //这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作 P1M0=0x08;//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作 P1M1=0x08;//设置 P1.3做AD } /******************************************************************/ // AD转换程序 void ADC() {
52单片机做的红外学习遥控器-学了按键可以发射(3)
2019-02-16 13:53
52单片机做的红外学习遥控器-学了按键可以发射(3).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!