}
while(IRIN) //等IR变为低电平,跳过4.5ms的前导高电平信号 {
delay(1); }
for (j=0;j<4;j++) // 收集四组数据 {
for(k=0;k<8;k++)//每组数据有8位 {
while(IRIN)//等IR变为低电平 {
delay(1); }
while(!IRIN)//等IR变为高电平 {
delay(1); }
while(IRIN)//计算IR高电平时长 {
delay(1); Num++; if(Num>=15) {
EX0=1;//0.14ms计数过长自动离开 return; }
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0” if(Num>=8)
IRCOM[j]=IRCOM[j]|0x80;//数据最高位补“1” Num=0; } }
if(IRCOM[0]!=0x00)//比较用户码 {EX0=1; //开INT0中断 return;//退出 }
if(IRCOM[2]!=~IRCOM[3])//接收数据是否正确 {
EX0=1;//开INT0中断 return;//退出 }
else beep(); flag=1;
if(IRCOM[2]==0x09)//“+”键 {
if(rate>4) rate--; else rate=4; }
if(IRCOM[2]==0x15) {
if(rate<15) rate++; else
rate=15; }
EX0=1;//重新开INT0中断 }
/*******************************************************************
定时器0中断服务子函数
*******************************************************************/
void motor_onoff() interrupt 1 {
TL0=0xcc;//2ms定时常数 TH0=0xf8; count1++;
if(count1 return; } else { count1=0; if(direction==1) //运行方向标志 { if(count2<8) P0=FFW[count2]&0x1f; //取数据,正转 count2++; //取数据次数加1 if(count2==8) count2=0; } else { if(count2<8) P0=REV[count2]&0x1f; //取数据,反转 count2++; //取数据次数加1 if(count2==8) count2=0; } } } 十、毕业作品实物照 。