超声波测距1602显示程序

超声波测距1602显示程序

1.intrins.c

2.1602led.c

3.boardinit.c

4.delay.c

#include <reg52.H>		//机器器件配置文件
#include <intrins.h>
#include "1602led.h"
#include "boardinit.h"
#include "delay.h"


sbit Trig = P2^0;    //	产生脉冲引脚   tx
sbit Echo = P2^1;	 //	回波引脚	   rx
unsigned char flag;
unsigned int S,time;
/*
//5ms延时
void Delay5Ms(void)
{
	unsigned int TempCyc = 5552;
	while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
	unsigned char TempCycA = 5;
	unsigned int TempCycB;
	while(TempCycA--)
		{
			TempCycB=7269;
			while(TempCycB--);
		};
}  */
/********************************************************/
    void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	 S=(time*1.56672)/100;    //晶振11.0592算出来是CM
	
	 //S=(time*1.7)/100;     //晶振12M算出来是CM
	 if((S>=700)||flag==1) //超出测量范围显示“-”
	 {	 
	  flag=0;
	  Disp_1602(1,2,"   S:--- CM  XX ",16);	  
	  delay(500);
	  Disp_1602(1,2,"   S:    CM     ",16);	  	 
	  
	  }
	 else
	 {
	  Disp_1602(1,2,"   S:    CM  OK ",16);	  
	  Disp_1602_number(6,2,S,3) ;		 
	 }	
	}
/********************************************************/
     void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;							 //中断溢出标志
  }
/********************************************************/
     void  StartModule() 		         //启动模块
  {
	  Trig=1;			                     //启动一次模块
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  Trig=0;
  }
/********************************************************/ 
void delayms(unsigned int ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}
/*********************************************************/
void main(void)
{


	
	while(1)
	{
	 TMOD=0x01;		   //设T0为方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允许T0中断
	 EA=1;			   //开启总中断			
	
	while(1)
	  {
	     StartModule();
	     while(!Echo);		//当Echo为零时等待
	     TR0=1;			    //开启计数
	     while(Echo);			//当Echo为1计数并等待
	     TR0=0;				//关闭计数
         Conut();			//计算
		 delayms(80);		//80MS
		 
	  }
	}
}
### boardinit.c
#include <reg52.h>
#include "74hc595.h"
#include "boardinit.h"

sbit duanxuan=P2^5;	// 数码管,的段选使能,1 通 0关
sbit weixuan=P2^6;	// 数码管,的位选使能,1 通 0关

void boardinit()
{
  duanxuan=1; // 数码管,的段选使能,1 通 0关
  weixuan=1;  //数码管,的位选使能,1 通 0关
  P0=0x00; //P0口送清零,关LED数码管的必要数据准备。
  duanxuan=0; // 数码管,的段选使能,1 通 0关
  weixuan=0;  //数码管,的位选使能,1 通 0关
  write_byte_74hc595(0x40);	//选通8位发光二极管控制芯片u6(74HC573)锁存器的使能端	  
  P1=0xff; //P1口送全1,关8位发光二极管的必要数据准备。//写完此句理论上8个发光二级管都会熄灭,因74HC595数据口复用了P1.0故P1.0的二极管可能不能被熄灭。
  write_byte_74hc595(0x00);	//关闭8位发光二极管控制芯片u6(74HC573)锁存器的使能端,把P1口数据保存(既关发光二极管)。  
}

### delay.c
#include "delay.h"

void delay(uint z)
{
	uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);   
}
/*
void delay_ds18b20(uint time)
{
     uint  i,j;
	 for(i=0;i<time;i++)
		for(j=0;j<1;j++);
}*/

### 74hc595.c
#include <reg52.h>
#include "74hc595.h"
#include "delay.h"

sbit data_595si   =P1^0;  //595数据输入口
sbit clk_595srck  =P1^4;  //595数据写进移位寄存器时钟输入口
sbit e_595rck     =P2^3;  //595移位寄存器,数据送输出的时钟

void write_byte_74hc595(uchar dat)			  	//74hc164芯片写一字节数据函数
{
	 uchar i;
	 e_595rck=0;	  //给595RCK低电平	
	 for(i=0;i<8;i++)
	 {
	     clk_595srck=0;	  //给595SRCK低电平				
         data_595si=(dat<<i)&0x80;	   //把我们要使用的数据进行左移处理,保证最终输出的数据与 我们 uchar dat 对应
         clk_595srck=1;	 //给595SRCK高电平		
	 }
	  e_595rck=1;  //给595SRCK高电平,既把 DAT数据数据送到输出
	  data_595si=1;//因该数据口和别的电路共用,因此当74hc595使用完后,置“1”解除冲突	
}  

这些项目的实现都通过本人亲自测试运行,也是自己学习中知识的一点一点积累,整理不易,希望能帮到大家,不足之处大家多多交流。

QQ:1678957377

邮箱:1678957377@qq.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值