单片机高级系列丨超声波测距(数码管显示)

单片机高级系列丨超声波测距(数码管显示)

超声波模块的TRIG管脚接在单片机的P20口,ECHO管脚接在单片机的P21口 其他的电源管脚接在单片机开发板上电源口即可。

#include"reg51.h"

#include <intrins.h>
sbit RX=P2^1;
sbit TX=P2^0;
unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned long S=0;
bit      flag =0;
//--定义使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char disbuff[4]	   ={ 0,0,0,0,};
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
	unsigned char i;
	unsigned int j;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//显示第7位	
		}
		GPIO_DIG=disbuff[i];//发送段码
		j=10;						 //扫描间隔时间设定
		while(j--);	
		GPIO_DIG=0x00;//消隐
	}
}
/********************************************************/
    void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S= (long)(time*0.17);     //算出来是CM
	 if((S>=4000)||flag==1) //超出测量范围显示“ERR0”
	 {	 
	  flag=0;
	  disbuff[0]=0x3f;	   //“-”
	  disbuff[1]=0x50;	   //“-”
	  disbuff[2]=0x50;	   //“-”
	  disbuff[3]=0x79;	   //“-”
	 }
	 else
	 {
	  disbuff[3]=DIG_CODE[S%10000/1000];
	  disbuff[2]=DIG_CODE[S%1000/100];
	  disbuff[1]=DIG_CODE[S%100/10];
	  disbuff[0]=DIG_CODE[S%10/1];
	 }
	}
/********************************************************/
     void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;							 //中断溢出标志
  }
/********************************************************/
   void  zd3()  interrupt 3 		 //T1中断用来扫描数码管和计800MS启动模块
  {
	 TH1=0xf8;
	 TL1=0x30;
	 DigDisplay();
	 timer++;
	 if(timer>=100)
	 {
	  timer=0;
	  TX=1;			                //800MS  启动一次模块
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  TX=0;
	 } 
  }
/*********************************************************/

	void  main(  void  )

  {  
    TMOD=0x11;		   //设T0为方式1,GATE=1;
	TH0=0;
	TL0=0;          
	TH1=0xf8;		   //2MS定时
	TL1=0x30;
	ET0=1;             //允许T0中断
	ET1=1;			   //允许T1中断
	TR1=1;			   //开启定时器
	EA=1;			   //开启总中断

	while(1)
	{
	 while(!RX);		//当RX为零时等待
	 TR0=1;			    //开启计数
	 while(RX);			//当RX为1计数并等待
	 TR0=0;				//关闭计数
     Conut();			//计算
	}

  }
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C52单片机超声波测距数码显示代码如下: 首先,我们需要定义一些常量和变量。常量包括超声波模块的引脚接口,数码管的段选接口和位选接口,还有一些用于计算距离的参数。变量包括用于存储距离值的变量。 接着,我们需要初始化单片机的IO口,将超声波模块和数码管连接的引脚设置为输出和输入。 然后,我们进入主函数中的循环。在循环中,首先发送超声波模块发射信号,等待一段时间后关闭发射信号。然后等待接收到回波信号,计算并存储距离值。最后,将距离值通过数码管的段选接口和位选接口显示出来。 下面是一个简单的示例代码: #include <51.h> #include <intrins.h> #define echo P2_0 #define trigger P1_0 sbit digit1 = P3^0; // 数码管的段选接口 sbit digit2 = P3^1; sbit digit3 = P3^2; sbit digit4 = P3^3; sbit bit1 = P3^4; // 数码管的位选接口 sbit bit2 = P3^5; sbit bit3 = P3^6; sbit bit4 = P3^7; unsigned int distance; // 用于存储距离值 void delay(unsigned int t); // 延迟函数 void display(); // 数码显示函数 void main() { while (1) { trigger = 1; // 发射超声波信号 delay(10); trigger = 0; // 等待接收到回波信号 while (!echo); TR0 = 1; // 开启定时器0 while (echo); TR0 = 0; // 关闭定时器0 // 计算并存储距离值 distance = TH0 * 256 + TL0; display(); // 数码显示距离值 } } void delay(unsigned int t) { unsigned int i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void display() { unsigned int temp; unsigned char i; temp = distance; // 将距离值存储到临时变量中 // 分离距离值的每一位,并通过数码显示出来 for (i = 0; i < 4; i++) { switch (i) { case 0: bit1 = 1; bit2 = bit3 = bit4 = 0; break; case 1: bit2 = 1; bit1 = bit3 = bit4 = 0; break; case 2: bit3 = 1; bit1 = bit2 = bit4 = 0; break; case 3: bit4 = 1; bit1 = bit2 = bit3 = 0; break; } P0 = temp % 10; // 将位对应的数码管段亮起 temp = temp / 10; // 距离值右移一位 delay(5); // 等待一段时间,让数码管段亮起 P0 = 0; // 将位对应的数码管段关闭 } } 希望以上代码能够对您有所帮助! ### 回答2: C52单片机超声波测距数码显示代码是用于将超声波测距的结果通过数码管进行显示的代码。以下是一个简单的示例代码: 首先,需要在代码中定义所使用的端口和引脚。例如,我们可以定义TRIG_PIN和ECHO_PIN来分别表示超声波传感器的发送和接收引脚,以及DIGIT_PIN和SEGMENT_PIN来表示数码管的位选引脚和段选引脚。 然后,在主程序中利用延时和IO操作函数实现超声波测距的功能。具体的步骤如下: 1. 设置TRIG_PIN为输出模式,ECHO_PIN为输入模式。 2. 将TRIG_PIN置高电平,并延时一段时间(例如10us或更长)。 3. 将TRIG_PIN置低电平,等待测距信号的返回。 4. 使用定时器和外部中断,测量ECHO_PIN引脚上高电平的时间,并计算出距离值(以厘米或其他单位表示)。 5. 将距离值转化为数码显示的格式,例如将测得的距离数据拆分为个位、十位、百位等。 6. 通过数码管的位选引脚和段选引脚依次显示距离值的每一位数码。 需要注意的是,以上仅是示例代码的基本框架,具体的实现细节可能会因所使用的硬件和编程环境而有所不同。在实际编写代码时,还需根据具体情况进行适当的修改和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值