STC单片机超声波程序

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;							 //中断溢出标志
  }
	

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘零翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值