.
tt=0;//清零重新计数 TF1=0;//计数溢出标志 TH1=0;//定时器1清零 TL1=0;// 定时器1清零 ET1=1;//开定时器1 TR1=1;//启动定时器1 EX1=1;//打开外部中断1 succeed_flag=0;
while(EX1==1);//等待回波标志 if(succeed_flag==1)//测试成功 {time=TH1*256+TL1;//回波响应时间 distance=time*1.72/100;//换算成路程
Led(distance);//显示测到的距离 EX1=1;//开中断1
}
if(succeed_flag==0)//测试不成功或超出时间 {
Led(3333);//表示测不到回波 } }
/****************************红外解码******************************/ /******************** 中断0解码服务子程序 ********************/
精选文档
.
void int0(void) interrupt 0 using 2 {
EA = 0;//??? 可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取
for(k=0;k<10;k++) {
Delay0_9ms();
if (IRsignal==1) //如果0.9ms后IRsignal=1,说明不是引导码 { k=10; break; }
else if(k==9) //如果 持续了10×0.9ms=9ms的低电平,说明是引导码 {
while(IRsignal==0);
Delay4_5ms(); //跳过持续4.5ms的高电平 for(i=0;i<4;i++) //分别读取4个字节 {
for(j=1;j<=8;j++) //每个字节8个bit的判断 {
while(IRsignal==0); //等待上升沿 此处用得很好:因为0.56ms
精选文档
.
的低电平(接收时)是代码0与1的相同部分
Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms(因为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignal if(IRsignal==1) //如果IRsignal是\高位置\,并向右移一位
{
Delay1ms(); //为什么要延时1ms呢?因为要使IRsignal跳至
低电平(即0.56ms的0与1相同部分上)
CodeTemp=CodeTemp|0x80; //此处的算法很好 if(j<8) CodeTemp=CodeTemp>>1; } else if(j<8)
{CodeTemp=CodeTemp>>1;}//如果IRsignal是\则直接向右移一位,自动补\ }
IRcode[i]=CodeTemp; CodeTemp=0; }
for(i=0;i<4;i++) //通过串口将代码发出 {
SBUF=IRcode[i]; //引导码 地址码 数据码 数据反码 while(!TI); //等待一个字节发送完毕
精选文档
.
TI=0; } Delay(); } }
switch(IRcode[2]) //数据位 {
case 69:m=0xfe;break;//电机上升 case 70:m=0xff;break;//电机停止 case 71:m=0xfc;break;//电机下降 case 22:a=0;break; case 25:key=1;break;//功能键 case 12:a=1;;break; case 24:a=2;;break; case 94:a=3;;break; case 8: a=4;;break; case 28:a=5;;break; case 90:a=6;;break; case 66:a=7;;break; case 82:a=8;;break; case 74:a=9;;break; }
精选文档
.
EA = 1;//开总中断 }
/*******************************************************************/ /***********************初始化程序*********************/ void initUart(void) {
TMOD |= 0x11; //定时器T1,T0都用方式1,16位 PCON |= 0x80;
TH1=0;//定时器T1 高位初始化
TL1=0;//定时器T1 低位初始化 ET1=1;//开定时器1
TR1 =1; //用时才启动 //TMOD=0x01; }
/*******************************************************************/ /*******************************************************************/ //设置电机到达的高度
TH0=(65536-count)/256;// 定时器T0 初值 TL0=(65536-count)%6; // EA=1;//开总中断
ET0=0;//先关上38KHz,用到的时候再开 TR0=0; //先关上38KHz,用到的时候再开
精选文档