SR-HY05超声波程序
初三 其它 2429字 98人浏览 mubbox195

/***********************************************************************************************************/

//HY-SRF05 超声波测距模块 DEMO 程序

//晶振:11.0592

//接线:模块TRIG 接 P3.7 ECH0 接P3.6

//串口波特率9600

/***********************************************************************************************************/

#include <reg52.h>

//#include <intrins.h>

#include <STDIO.H>

#define uchar unsigned char

#define uint unsigned int

sbit RX=P3^7;sbit TX=P3^6;

sbit dula=P2^6;sbit wela=P2^7;

//#define RX P3_6 #define TX P3_7

uint time=0;

uint timer=0;

uint S=0;

bit flag =0;

/********************************************************/

void delay12us()

{ unsigned char i,j;//12微秒

for(i=2;i>0;i--)

for(j=1;j>0;j--);

}

void delayms(unsigned int ms)

{

unsigned char i=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

void display(uint n)//增添4位数码管程序, 显示出来带小数点,所以单位是米

{ uchar code table[]={0x3f,

0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar code table2[]={0xbf,

0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

int qian,bai,shi,ge;

qian=n/1000;

bai=n%1000/100;

shi=n%100/10;

ge=n%10;

dula=1;P0=table2[qian];dula=0;

P0=0xff;

wela=1;P0=0xfe;wela=0;delay12us(1);

dula=1;P0=table[bai];dula=0;

P0=0xff;

wela=1;P0=0xfd;wela=0;delayms(1);

dula=1;P0=table[shi];dula=0;

P0=0xff;

wela=1;P0=0xfb;wela=0;delay12us(1);

dula=1;P0=table[ge];dula=0;

P0=0xff;

wela=1;P0=0xf7;wela=0;delay12us(1);

wela=0;P0=0xff;wela=0;

}

/********************************************************/ void Conut(void)

{uint i;

time=TH0*256+TL0;

TH0=0;

TL0=0;

S=(time*1.88)/10; //算出来是毫米

if(flag==1) //超出测量范围显示“-”

{

flag=0;S=9999;for(i=15;i>0;i--)display(S);printf("-----\n"); }

else

{

for(i=10;i>0;i--)display(S);printf("S=%d\n",S);

}

}

/********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出, 超过测距范围

{

flag=1; //中断溢出标志 RX=0;

}

void Timer_Count(void)

{

TR0=1; //开启计数

while(RX); //当RX 为1计数并等待 TR0=0; //关闭计数

Conut(); //计算

}

/********************************************************/ void StartModule()

//T1中断用来扫描数码管和计800MS 启动模块

{ TX=1; //800MS 启动一次模块 delay12us();

TX=0;

}

/********************************************************/

void main(void)

{

unsigned int valA;

TMOD=0x21; //设T0为方式1,GATE=1;

SCON=0x50;TH1=0xFD;TL1=0xFD;

TH0=0;

TL0=0;

TR0=1;

ET0=1; //打开T0中断

TR1=1; //开启定时器1

TI=1; //发送中断标志位

EA=1; //开启总中断

while(1)

{

delayms(60);

RX=1;

StartModule();

for(valA=40;valA>0;valA--)

{

if(RX==1) {

Timer_Count(); }

}

}

}