SR05,这款只能用定时器计算
#include <intrins.h>
#include "12864.h"
#include <stdio.h>
sbit RX = P1 ^ 6;
sbit TX = P1 ^ 7;
uchar disbuff[3]={0,0,0};
uchar time_flag,ttt;
uint time=0;
long S=0;
bit flag =0;
uchar ba[10]={0};
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xEE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
void Timer1Init(void) //0微秒@11.0592MHz 超声波 中断不开
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x00; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
void Delay20us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 52;
while (--i);
}
void StartModule()
{
TX=1;
Delay20us();
TX=0;
}
void Conut()
{
StartModule();
while(!RX); //当RX为零时等待
TR1=1; //开启计数
while(RX); //当RX为1计数并等待
TR1=0; //关闭计数
time=TH1*256+TL1;
TH1=0;
TL1=0;
S=time*1.87/100; //算出来是CM 11。0592M晶振
if(flag==1) //超出测量
{
flag=0;
dis(0,0,"距离超出范围");
}
else
{
dis(0,0,"距离:");
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
wrnum(disbuff[0]);
wrnum(13);
wrnum(disbuff[1]);
wrnum(disbuff[2]);
wdata('m');
}
}
void main(void)
{
Timer0Init();
Timer1Init();
initlcd(); //设置液晶显示器
EA = 1;
while(1)
{
if(time_flag)
{
time_flag=0;
Conut();
}
wcode(0x91);
wrnum(ttt/10);wrnum(ttt%10);
// sprintf(ba,"%d",(int)ttt);
// dis(0,1,(uchar *)ba);
}
}
void t0() interrupt 1
{
static uchar time_f,tt;
TL0 = 0x00; //设置定时初值
TH0 = 0xEE; //设置定时初值
if(++time_f>4) //20ms刷新一次数据
{
time_f=0;
time_flag=1;
}
if(++tt>200)
{
tt=0;
ttt++;
if(ttt>60) ttt=0;
}
}
void t1() interrupt 3 //T1中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}