大神们,能帮我看一下,为什么我的超声波定位到人后停留时间变得只有一秒,我的这个程序设计的意义是定位到最近的人就直接超声波舵机模块就停止,物体或者人移动后,超声波舵机就重新扫描再定位到人移动后的地方,做到一个跟踪的功能,可是程序改完后,定位时间反而变短了,原先是直接停止,等待物体移动后继续跟踪。有没有大神能帮我看一下是什么问题吗?
单片机源程序如下:- #include “reg52.h”
- #include <intrins.h>
- unsigned char mos;
- sbit pwm1 =P1^4; //PWM信号输出
- sbit RX = P0^6; //定义超声波传感器发射端
- sbit TX = P0^7; //定义超声波传感器接收端
- sbit jdq =P2^0; //定义电机
- sbit pwm2=P1^6;
- unsigned char juli,tt;
- unsigned long S=0;
- unsigned int ms,mm,suu,time,shu;
- sbit s=P1^5;
- sbit fmq=P1^3; //定义信号灯
- sbit led1=P1^0;
- sbit led2=P1^1;
- sbit led3=P1^2;
- unsigned char code su[]={ //数码管码共阴
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- };
- /*****************************************************
- 函数功能:延时若干毫秒
- 入口参数:n
- ***************************************************/
- void delay(unsigned char i)//延时
- {
- unsigned char j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- /******************************************************************************/
- /* 函数名称 : Init_timer0 */
- /* 函数描述 : 初始化单片机函数 */
- /* 输入参数 : 无 */
- /* 参数描述 : 无 */
- /* 返回值 : 无 */
- /******************************************************************************/
- void Time0_Init() //定时器初始化
- {
- TMOD=0x11;
- TH1=0x00;
- TL1=0x00;
- TL0 = 0x49; //设置定时初值
- TH0 = 0xFD; //设置定时初值
- TR0=1; //定时器开始
- ET0=1;
- EA=1;
- TR1=0;
- }
- /******************************************************************************/
- /* 函数名称 : timer0 */
- /* 函数描述 : T0中断处理函数 */
- /* 输入参数 : 无 */
- /* 参数描述 : 无 */
- /* 返回值 : 无 */
- /******************************************************************************/
- void Time0_Int() interrupt 1 //中断程序
- {
- TL0 = 0xA6; //设置定时初值
- TH0 = 0xFF; //设置定时初值
- ms++;
- if(ms>mm){pwm1=0;}
- else pwm1=1;
- if(ms>200){ms=0;}
- }
- void ceju()
- {
- TX=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TX=0;
- TH1=0;
- TL1=0;
- suu=0;
- while(!RX) //当RX为零时等待
- {
- suu++;
- if(suu>2000) break;
- }
- TR1=1; //开启定时器
- suu=0;
- while(RX) //当RX为零时等待
- {
- suu++;
- if(suu>2000) break;
- }
- TR1=0; //关闭计数
- time=TH1*256+TL1;
- TH1=0;
- TL1=0;
- S=(time*1.7)/100; //算出来是CM
- shu=(unsigned char)S;
- }
- void xunbo()
- {
- delay(100);
- if(mos==0)
- {
- mm++;
- ms=0;
- TR0=1;
- delay(200);
- TR0=0;
- if(mm>=25){mos=1;}
- }
- if(mos==1)
- {
- mm--;
- ms=0;
- TR0=1;
- delay(200);
- TR0=0;
- if(mm<=5){mos=0;tt++;}
- }
- }
- unsigned char i;
- void delayms(void)
- {while(i--);
- }
- void disp1()
- {
- pwm2=1;delay(8000);
- pwm2=0;delay(12000);
- led1=0;
- }
- void disp2()
- {pwm2=1;delay(12000);
- pwm2=0;delay(12000);
- led1=1;led2=0;
- }
- void disp3()
- {
- pwm2=1;
- led2=1;led3=0;
- }
- void disp4()
- {pwm2=0;
- led3=0;
- }
- void keyscan()
- {if(s==0)
- {delay(5000);
- if(s==0)
- fmq=0;delay(12000);
- fmq=1;
- {if(++i==5)i=1;}
- TR2=0;
- }
- }
- void main()
- { juli=100;
- Time0_Init();
- mm=5;
- ms=0;
- keyscan();
- i=0;
- TH2=(65536-50000)/256;
- TL2=(65536-50000)%256;
- ET2=1;
- EA=1;
- TR2=1;
- while(1)
- {
- P0=~su[tt%10];
- if(tt==0)
- {
- xunbo();
- ceju();
- if(shu<juli){juli=shu;}
- }
- if(tt==1)
- {
- xunbo();
- ceju();
- if(tt==2){tt=0;juli=100;}
- if(shu<(juli+3)) { xunbo(); xunbo(); tt=5;}
- }
- if(tt==5)
- {
- jdq=0;
- delay(200);
- delay(200);
- delay(200);
- delay(200);
- ceju();
- if(juli>5)
- if((shu<(juli-5))||(shu>(juli+5))) {tt=0; juli=100;jdq=1;}
- if (led1==0)
- {disp1();}
- if (led2==0)
- {disp2();}
- if (led3==0)
- {disp3();}
- if (led3==0)
- {disp4();}
- }
- }
- }
- //定时器2中断程序
- void timer2() interrupt 5
- {TF2=0;
- switch(i)
- {
- case 1:disp1();break;
- case 2:disp2();break;
- case 3:disp3();break;
- case 4:disp4();break;
- default:;
- }
- }
复制代码
|