09超声波测距

#include<STC15.H>
#include<intrins.H>

sbit TX = P1^0 ;
sbit RX = P1^1 ;

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char DigCom=0;
unsigned char DigBuf[8] = {10,10,10,10,10,10,10,10};

unsigned int LCM_tt = 0 ;
bit LCM_Ref = 0 ;
unsigned int LCM = 0 ;
unsigned int LCM_Time = 0 ;

void ALL_Init(void);
void Delay_MS(unsigned int MS);
void KeyScan(void);
void Timer0Init(void);		//1毫秒@11.0592MHz
void Send_wave(void);
void Timer1Init(void);

void main(void)
{
	ALL_Init();
	Timer0Init();
	Timer1Init();
	EA=1;ET0=1;
	
	while(1)
	{
		if(LCM_Ref==1)
		{
			LCM_Ref = 0 ;
			Send_wave();
			TR1 = 1;
			while((RX == 1)&&(TF1 == 0));
			TR1 = 0;
			if(TF1 == 1) 
			{
				TF1 = 0 ;
				LCM = 9999 ;
			}
			else 
			{
				LCM_Time = TH1 ;
				LCM_Time <<= 8 ;
				LCM_Time |= TL1 ;
				LCM = (unsigned int)(LCM_Time*17/921.6); //  1/11059200/12=  1/921600    LCM_Time*17000 * (1/921600)
				//LCM = (unsigned int)(LCM_Time*0.017); 
			}
			TL1 = 0x00;		//设置定时初始值
			TH1 = 0x00;		//设置定时初始值
		}
		DigBuf[5] = LCM/100;
		DigBuf[6] = LCM%100/10;
		DigBuf[7] = LCM%10;  
	}
}



void Timer1Init(void)		//0毫秒@11.0592MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
//	TR1 = 1;		//定时器1开始计时
}


void Delay14us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 45;
	while (--i);
}

void Send_wave(void)
{
	unsigned char i = 8 ;
	do
	{
		TX = 1 ;  Delay14us();
		TX = 0 ;  Delay14us();
	}
	while(i--);
}


void Timer0(void) interrupt 1
{
	P0=0X00;
	P2|=0XC0;  // P2=P2|0XC0;   XXXX XXXX | 1100 0000 = 11XX XXXX
	P2&=0XDF;	 // P2=P2&0XDF;   11XX XXXX & 1101 1111 = 110X XXXX	
	P2&=0X1F;		//关闭所有的74HC573锁存器	
	
	P0=tab[DigBuf[DigCom]];	
	P2|=0XE0;			//	P2=P2|0XE0;   XXXX XXXX | 1110 0000 = 111X XXXX
	P2&=0XFF;		 	// P2=P2&0XDF;   11XX XXXX & 1101 1111 = 110X XXXX	
	P2&=0X1F;			//关闭所有的74HC573锁存器
	
	P0=(0X01<<DigCom); 	//然后选中第一个数码管
	P2|=0XC0;  // P2=P2|0XC0;   XXXX XXXX | 1100 0000 = 11XX XXXX
	P2&=0XDF;	 // P2=P2&0XDF;   11XX XXXX & 1101 1111 = 110X XXXX	
	P2&=0X1F;		//关闭所有的74HC573锁存器

	if(++DigCom == 8)DigCom = 0 ;

	if(++LCM_tt==300){LCM_tt = 0 ; LCM_Ref = 1 ;}
//	XXX_tt++;
//	if(++XXX_tt==NNN){XXX_tt=0;XXX_Ref=1;}	
}

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初始值
	TH0 = 0xD4;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}




void Delay_MS(unsigned int MS)
{
	unsigned i,j;
	for(i=0;i<MS;i++)
		for(j=853;j>0;j--); //STC15单片机设置为853; STC8H单片机修改为1109;STC32G单片机修改为427;
}

void ALL_Init(void)
{
	P0 =0X00;		//先设置关闭蜂鸣器继电器的P0输出值(全关)
	P2|=0XA0;		// 将P27 P25 设置为1 其他位保持不变
	P2&=0XBF; 	// 将P26设置为0 其他位保持不变
	P2&=0X1F;		//关闭所有的74HC573锁存器

	P0 =0XFF;		//先设置关闭所有的LED的P0输出值(全关)
	P2|=0X80;		// 将P27设置为1 其他位保持不变
	P2&=0X9F;		// 将P26 P25设置为0 其他位保持不变
	P2&=0X1F;		//关闭所有的74HC573锁存器
	
	P0 =0X00;		//先设置选择数码管位选的P0输出值(全不选)
	P2|=0XC0;		// 将P27 P26 设置为1 其他位保持不变
	P2&=0XDF;		// 将P26设置为0 其他位保持不变
	P2&=0X1F;		//关闭所有的74HC573锁存器
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值