[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
sbit TrigPin = P1^1;//发送引脚
sbit EchoPin = P1^2;//接收引脚
typedef unsigned int uint;
typedef unsigned char uchar;
uint num=0;
void delay(unsigned int ms)
{
unsigned int x;
for(;ms>0;ms--)
for(x=114;x>0;x--)
;
}
void delayMicroseconds()//延迟12微秒
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void UART_INIT()
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 0;//允许串口接收
EA = 1;//开总中断
ET0=1;//开启定时器0中断
TMOD = 0x29;//定时器1_8位自动重装模式,定时器0_16位定时器,开启门控
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//启动定时器1
TR0=1;//启动定时器0
}
float sr04_read(void)
{
float distance;
num=0;
TH0=0x4c;//定时器复位
TL0=0x02;
TrigPin=0;//拉低发送端
_nop_();//延迟3微秒
_nop_();
_nop_();
TrigPin=1;//拉高发送端
delayMicroseconds();//延迟十二微秒
TrigPin=0;//拉低发送端
while(!EchoPin);//等待接收端电平变高
while(EchoPin);//等待接收端电平变低
distance=num*50+((TH0-0X4c)*256+(TL0-0x02))*1.085/1000;//正脉冲时间(毫秒)
distance = distance*340/2000;//距离(M)
distance = distance*100;//距离(CM)
return distance;
}
void main()
{
float distance;
UART_INIT();//串口初始化
while(1)
{
distance = sr04_read();//读出距离
TI=1;
printf("distance:%.2f CM\n",distance);//串口发送距离
TI=0;
delay(1000);//延迟1秒
}
}
void timer0() interrupt 1//定时器0中断服务程序
{
TH0=0x4c;
TL0=0x02;
num++;
if(num==20)
{
num=0;
}
}
}