超声波测距单片机C程序

发布者:qiuxubiao最新更新时间:2020-11-27 来源: 51hei关键字:超声波测距  单片机  C程序 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include          //STC89C52头文件

#define uchar unsigned char   

#define uint unsigned int

unsigned int  time=0;

unsigned int  timer=0;

unsigned long S=0;         //距离变量

bit  flag =0;                 //超声波模块量程溢出标志(>5米时置1)

sbit echo=P1^0;               //超声波模块的发射端

sbit trig=P1^1;               //超声波模块的接收端

sbit ds=P2^2;                //DS18B20的信号线

sbit P24=P2^4;

sbit P25=P2^5;

sbit P26=P2^6;            

sbit P27=P2^7;

sbit P07=P0^7;            

int temp;   

//八位共阳极

unsigned char code shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

/*********************************************************/

//毫秒级延时

void delayms(unsigned char z)  

{

       unsigned char a,b;

       for(a=z; a>0; a--)

                for(b=110; b>0; b--);

}

/*********************************************************/

/*********************************************************/

//微秒级延时

void delayus(unsigned char z)  

{

       while(z)

         z--;

}

/********************************************************/

void delay_ms(unsigned int ms)  //1ms延时

{

    uchar a;

    while(ms--)

for(a=123;a>0;a--);

}

/*********************************************************/

//DS18B20初始化

void ds18b20init()

{

           ds=0;

           delayus(80);                //延时480-960us

           ds=1;

           delayus(4);                 //等待应答

}

/*********************************************************/

//DS18B20读命令子程序(读一字节)

uchar dushuju()

{

     uchar i,dat,m;

     for(i=8;i>0;i--)

     {

           ds=0;

           delayus(1);

           ds=1;

           delayus(2);

           m=ds;

           dat=(m<<7)|(dat>>1);   //读出的数据最低位在最前面,刚好一个字节在dat里

           delayus(8);

      }

    return dat;

}

/*********************************************************/

//DS18B20写命令子程序(写一字节)

void xiemingling(uint shuju)

{

       uint i;

       bit m;

       for(i=8;i>0;i--)

       {

          m=shuju&0x01;

          shuju=shuju>>1;

          if(m)                           //写1

          {

                   ds=0;

                   delayus(2);

                   ds=1;

                   delayus(8);

          }

          else                     //写0

          {

                   ds=0;

                   delayus(8);

                   ds=1;

                   delayus(2);

          }

       }

}


/*********************************************************/  

//DS18B20开始获取温度并转换

void zhuanhuan()

{

           ds18b20init();

           delayms(1);

           xiemingling(0xcc);        //写跳过读ROM指令

           xiemingling(0x44);       //写温度转换命令

}

/*********************************************************/

//DS18B20读寄存器中存储的温度数据

int duwendu()

{

           uint a,b;

           ds18b20init();

           delayms(1);

           xiemingling(0xcc);                     //跳过ROM,忽略64位ROM地址

           xiemingling(0xbe);                    //读内部RAM中的9字节的温度数据

           a=dushuju();                            //读低8位

           b=dushuju();                           //读高8位

           b=b<<8;                                //高8位左移8位

           temp=b|a;                             // 高8位和低8位组合为1个字

           temp=temp*0.0625;              //温度在寄存器中位12位,分辨率为0.0625度

           return temp;

}


/*********************************************************/

//显示子程序

void xianshi(unsigned long num)

{

          unsigned char bai,shi,ge;

          bai=num/100;                        //分离三位距离数据

          shi=num%100/10;                     

          ge=num%10;                        

                         P24=0;

                         P0=shuzu[ge];

                         delay_ms(1);

                         P24=1;


                         P25=0;

                         P0=shuzu[shi];

                         P07=1;

                         delay_ms(1);

                         P25=1;


                         P26=0;

                         P0=shuzu[bai];

                         delay_ms(1);

                         P26=1;


        //                 P24=0;

//                         P0=shuzu[bai];

//                         P07=1;

        //                 delay_ms(1);

//                         P24=1;


}


/*********************************************************/


//计算距离子程序

void Conut()

{

        float a;

        time=TH0*256+TL0;             //这是最后计算到的时间,但应该再乘以12/11.092

                                                   //时间应该是time*12/11.0592

        TH0=0;                                   //定时器0的初始值位0           

        TL0=0;

        a=(331.5+0.607*temp);    //声速与温度的函数关系:声速=331.5+0.607*温度

        S=(time*a/200)/100;        //算出来是cm     

        if (S>=500)                     //最大距离为5m,即500cm

        S=888;

        if (flag==1)                     //判断是否溢出

        {

          S=888;

          flag=0;

          TH0=0;

          TL0=0;

       }

}


/********************************************************/

//初始化定时器0和定时器1

void T0_init()

{

          TMOD=0x11;   

           TH0=0;            

           TL0=0;         

           TH1=0xf8;        //定时器1赋初值,应该是2ms

[1] [2]
关键字:超声波测距  单片机  C程序 引用地址:超声波测距单片机C程序

上一篇:stc89c51单片机和lcd12864显示sin函数图像
下一篇:单片机+L298直流电机驱动程序

推荐阅读最新更新时间:2024-11-13 11:22

51单片机编程环境的搭建及代码编写的方法
1. 51单片机概述 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。目前教科书基本都是以早期的MCS-51为原型,讲解微机的原理及其接口技术的。早期的51单片机功能都较弱,需扩展rom,ram等才能组成一个较复杂的系统。而现今流行的8位51单片机都比早期芯片作了较多的功能扩展,性能强劲。生产51单片机的厂家有很多,像atmel的at80c51系列,华邦w78c051系列,宏晶stc80c51系列等,其中***宏晶stc系列51单片机在国内尤为流行。因此,笔者采用宏晶性价比较高的一款51单片机stc12c5a60s2来作开发讲解。该款51单片机已经是宏昌第N代产品了,其主要特征如下: 1.1. 增强型8051
[单片机]
51<font color='red'>单片机</font>编程环境的搭建及代码编写的方法
例说单片机数据通信之单总线数据传输
纯单片机干不了大事,必须得配上各种外设,那么了解单片机与传感器之间的数据通信就显得必不可少了。常见的单片机数据通信方式有SPI,IIC,RS232,单总线等等。每种通信方式都有相应的时序图,分析时序图并完成代码的编写是单片机学习者的必修课。本文以DS18B20为例分析一下单总线数据传输。 DS18B20是单总线数据传输,因此对于时序的要求就非常的高,学会分析其时序图是非常有必要的。 1.初始化时序图分析: 首先是由总线控制器拉低总线,维持480us。在480us后释放总线,由上拉电阻讲总线拉高。等待5-60us后,DS18B20开始响应,会将数据总线拉低60-240us.之后便释放总线,由上拉电阻拉高总线。转换为代码如下
[单片机]
例说<font color='red'>单片机</font>数据通信之单总线数据传输
利用单片机实现多路温度测量
  引言   在孵化设备的科研过程中,常常用多路温度测试仪来对孵化机器内部的温度场进行测量,而我们以前用的多路温度测试仪是用两片16选1的模拟开关来完成对32路温度的测量, 温度的采样时间受模拟开关开通关断时间的限制,开关信号对温度采样也造成了一定的干扰。在实际使用过程中还常受到温度采样路数(如8路、20路、64路、70路,128路等)的限制,为能更灵活的应用该多路温度测试仪,我们采用了主从机RS-485通讯的模式来完成多路温度的测量。每个从机采样8路温度并作为一个模块,每个从机有独立的地址,这样我们就可以在主机通讯负载能力范围内灵活的配置从机模块的数量,并且能提高温度采集的及时性和准确性,为科研实验提供便利工具。   硬件设计
[单片机]
利用<font color='red'>单片机</font>实现多路温度测量
[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_adc] ADC配置和使用
Analog to Digital Converter (ADC) The 10 bit incremental Analog to Digital Converter (ADC) enables sampling of up to 8 external signals through a front-end multiplexer. The ADC has configurable input, reference prescaling, and sample resolution (8, 9, and 10 bit). Note: The ADC module uses the same analog inputs as
[单片机]
51单片机的精确延时程序一
51单片机的精确延时程序分析(C语言和汇编语言程序) 一、C51程序 在晶振为11.0592的情况下,如下程序能实现ms级的比较精确的延时: 1 void Delayms(unsigned int n) 2 { 3 unsigned int i,j; 4 for(j=n;j 0;j--) 5 for(i=112;i 0;i--); 6 } 用keil可以看出这个延时的时间,我们先延时1ms,即Delayms(1)。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时
[单片机]
单片机与PC机通信示例
#include STC89C51RC_RD_PLUS.h #define SENDBUFSIZE 0x0f #define BR_19K2 0xfd #define RMAX 0x10 //必须是2的整数次幂。21ic上看到的,好像是 刘前辈 的创意 unsigned char xdata *cpSendBufPtr; unsigned char cFront; unsigned char cBack; unsigned char sendData; bit cTranFlag; unsigned char cTranData; bit cRecFlag; unsigned char cRecData; bit
[单片机]
51单片机——I2C总线驱动程序
为方便移植,采用多文件工程的方式。 void Delay10us()//延时10us { unsigned char a,b; for(b=1;b 0;b--) for(a=2;a 0;a--); } 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 void I2cStart()//为方便与其他函数衔接,起始之后SDA和SCL都为0,虽然这与I2C总线空闲状态不符,但并不影响程序运行 { SDA=1; Delay10us(); SCL=1; Delay10us();//建立时间是SDA保持时间 4.7us SDA=0; Delay10us();//保持时间是 4us SCL=0;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved