模块就是那种很常见的HC-SR04的,头文件 12c5a.H下载: http://www./f/12c5a.rar /******************************************************************************************* 程序内容:超声波测距 有待改善:10cm内的物体无法测量,会存在盲点,当采用stc89之类的单片机时候数码管会比较暗,不过反应速度并没有影响 优点:反应速度很快,实时传递距离信息并数码管显示。 *******************************************************************************************/ #include"12c5a.h" #include"intrins.h" #define BIN(x0,x1,x2,x3,x4,x5,x6,x7) x0|(x1<<1)|(x2<<2)|(x3<<3)|(x4<<4)|(x5<<5)|(x6<<6)|(x7<<7); //宏定义位 #define P(x) P2=~(1<<x); sbit P20=P2^0;//数码管第1位 sbit P21=P2^1;//数码管第2位 sbit P22=P2^2;//数码管第3位 sbit P23=P2^3;//数码管第4位 sbit Trig=P1^7;//超声波测试trig sbit Echo=P3^2;//超声波测距echo sbit beeps=P3^7;//蜂鸣器 unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //数码管显示数据 unsigned int shuju,ychu; //距离数据 unsigned char *led; void daley(unsigned int); void TI0_init(); void beep(); void shumagan(unsigned int num); void main() { led=LEDDis; TI0_init(); daley(10); while(1) { shumagan(shuju); } } void daley(unsigned int time) //延时 { unsigned int i; unsigned int j; for(i=0;i<1000;i++) for(j=0;j<time;j++); } void beep() //蜂鸣器 { char num,nun; beeps=0; for(num=100;num>=0;num--) { beeps=~beeps; for(nun=60000;nun>0;nun--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } } void shumagan(unsigned int num) //数码管显示 { P0=*(led+(num/1000)); P(0); P2=0xff; P0=*(led+((num%1000)/100)); P(3); P2=0xff; P0=*(led+(num%100)/10); P(2); P2=0xff; P0=*(led+(num%100)%10); P(1); P2=0xff; } void TI0_init() //定时器0外部0初始化 { Trig=0; TMOD=BIN(1,0,0,0,0,0,0,0); AUXR|=0xC0; //T0,T1工作在1T EA=1; ET0=1; EX0=1; TR0=1; IT0=1; //外部中断设置为跳变,回波引脚echo在不接受回波型号是都是低电平,所以这里必须是跳变方式 } void EX0_() interrupt 0 //外部0中断处理,用以接受回波并测量时差 { TR0=0; if(((TH0*256+TL0)+(ychu-1)*65536)>=15000) //排除测距模块工作范围之外的数据,消除干扰 { TH0=0; TL0=0; TR0=1; ychu=0; beep(); return; } shuju=(TH0*256+TL0)*17/1000; TH0=0; TL0=0; TR0=1; ychu=0; return; } void TI0() interrupt 1 //定时器0中断处理 { int num; TR0=0; TH0=0; TL0=0; if(ychu==0|ychu==3) { Trig=1; for(num=30;num>0;num--) //发送回波脉冲 { _nop_(); _nop_(); } Trig=0; } ychu++; TR0=1; return; }
|