/*仲:该程序是可以使用的超声波测距程序,没有使用外部中断,由于T1中断中使用一点时间,会导致最后的结果S有误差。解决方法是把main函数中的while(TX)放在外部中断0中。另外数码管显示函数在最后可以不使用*////hc-sr04超声波测距模块DEMO程序//接线:模块TRIG接P1.2ECH0接P1.1#includereg52.H//器件配置文件#includeintrins.hunsignedinttime=0;unsignedinttimer=0;unsignedlongS=0;//用于显示最后计算得到的距离bitflag=0;//判断是否溢出sbitdula=P2^6;sbitwela=P2^7;//用于数码管显示sbitRX=P1^1;//echosbitTX=P1^2;//trigsbitD5=P1^4;//可以不要。echo高电平时点亮D5灯unsignedlongx;//用于数码管显示unsignedcharcodetable[]={//共阴数码管0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidDisplay(unsignedlongnum);voidDelay(unsignedintz);//z=1大概是1msvoidConut(void)///////////计算程序{time=TH0*256+TL0;//这是最后算到的时间,往返时间,但应该再乘以//12/11.0593M是一个机器周期!时间应该是time*12/11.0592TH0=0;//定时器0的初始值为0TL0=0;S=(time*1.845)/100;//算出来是CM//S=(time*1.845)/10;//算出来是mm//time*12*170/(11.0592*1000)mm=time*1845/10000mmif(S=500)//最大距离5m,即500cmS=888888;if(flag==1)//判断是否溢出{S=888888;flag=0;TH0=0;TL0=0;}}/********************************************************/voidzd0()interrupt1//T0中断用来计数器溢出,超过测距范围{flag=1;//中断溢出标志}//这是最重要的计时0中断,TH0和TL0初始值为0/********************************************************/voidzd3()interrupt3//T1中断用来扫描数码管和计800MS启动模块{//这是计时器1中断TH1=0xf8;//赋初值,应该是2ms?TL1=0x30;timer++;if(timer=400){timer=0;TX=1;//800MS启动一次模块Delay(30);//一次超声波信号时长30msTX=0;}}/*********************************************************/voidmain(void){TMOD=0x11;//设T0为方式1,GATE=1TH0=0;//目的都是用中断T0和T1TL0=0;//中断0初始化TH1=0xf8;//2MS定时TL1=0x30;ET0=1;//允许T0中断ET1=1;//允许T1中断TR1=1;//开启定时器EA=1;//开启总中断while(1){while(!RX);//当RX为零时等待,即echo为低电平TR0=1;//开启计数D5=0;//可以不要指示灯while(RX);//当RX为1计数并等待TR0=0;//关闭计数D5=1;//可以不要指示灯Conut();//计算Display(S);//数码管显示}}voidDisplay(unsignedlongnum)//定义子函数,用于显示五位数{//调用子函数前,先要在main函数前面声明位选和段选/*即:sbitdula=P2^6;sbitwela=P2^7;*/unsignedinttemp;//用于延迟for函数unsignedcharshiwanwei,wanwei,qianwei,baiwei,shiwei,gewei;//定义这个六位数的十万位到个位shiwanwei=num/100000;wanwei=num%100000/10000;qianwei=num%10000/1000;baiwei=num%1000/100;shiwei=num%100/10;gewei=num%10;wela=1;P0=0xdf;//11111011//位选个位wela=0;dula=1;P0=table[gewei];dula=0;for(temp=100;temp0;temp--);if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0||shiwei!=0){//判断高位是否都为0,为0的话不显示高位的0wela=1;P0=0x6f;//11110110//位选十位wela=0;P0=0xff;dula=1;P0=table[shiwei];dula=0;for(temp=50;temp0;temp--);}if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0){wela=1;P0=0x77;//11101110//位选百位wela=0;P0=0xff;dula=1;P0=table[baiwei];dula=0;for(temp=50;temp0;temp--);}if(shiwanwei!=0||wanwei!=0||qianwei!=0){wela=1;P0=0x7b;//11011110//位选千位wela=0;P0=0xff;dula=1;P0=table[qianwei];dula=0;for(temp=50;temp0;temp--);}if(shiwanwei!=0||wanwei!=0){wela=1;P0=0x7d;//10111110//位选万位wela=0;P0=0xff;dula=1;P0=table[wanwei];dula=0;for(temp=50;temp0;temp--);}if(shiwanwei!=0){wela=1;P0=0x7e;//01111110//位选万位wela=0;P0=0xff;dula=1;P0=table[shiwanwei];dula=0;for(temp=50;temp0;temp--);}}voidDelay(unsignedintz)//基本上是z赋值为1就对应1ms{unsignedinta,b;for(a=z;a0;a--)for(b=110;b0;b--);}