51单片机1602显示的超声波测距源程序

发布者:MysticGlow最新更新时间:2017-09-02 来源: elecfans关键字:51单片机  1602显示  超声波测距 手机看文章 扫描二维码
随时随地手机看文章

制作超声波测距仪,是很多学生、单片机爱好者学习单片机动手实践的一个实作项目,这款超声波测距程序,针对目前比较广泛使的HC-SR04超声波模块而设计的,这款1602显示的超声波测距距源程序,单片机是51系列单片机,超声波测距模块先用的是HC-SRO4 超声波测距模块,单片机的晶振是12M,接线:模块TRIG接 P2.5  ECH0 接P3.2,当距离超出测量时,范围显示“-”,显示单位是CM。这款程序由于硬件比较简单,制作时焊接工作量小,几乎是百分之百的成功,也可以用PROTEUS软件直接进行。需要超声波测距仿真配套的爱好者,可百度搜索:电子乐屋,这个网上有很多款超声波测距仿真资料。

 

51单片机1602显示的超声波测距源程序

 

#include[reg52.h>    //注意请把‘ [ ’换成 "<"
#include [intrins.h>  //

#define uint unsigned int
#define uchar unsigned char

sbit rs=P2^0;            //1602的数据/指令选择控制线
sbit rw=P2^1;           //1602的读写控制线
sbit en=P2^2;          //1602的使能控制线

sbit trig=P2^5;      //超声波测距模块Trig
sbit echo=P3^2;     //超声波测距模块Echo
bit flag1;         //触发信号标志位//

uchar count;           //中断累加变量
long int distance;    //测量所得距离

unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字


void delay(uint n)                          
{
    uint x,y; 
    for(x=n;x>0;x--)
    for(y=110;y>0;y--);
}



void delayt(uint x)
{
    uchar j;
    while(x-- > 0)
    {
              for(j = 0;j < 125;j++)
        {
          ;
        }
    }
}



void lcd_wcom(uchar com)           
{
    rs=0;                //选择指令寄存器
    rw=0;               //选择写
    P0=com;            //把命令字送入P0
    delay(5);         //延时一小会儿,让1602准备接收数据
    en=1;            //使能线电平变化,命令送入1602的8位数据口,这点非常重要
    en=0;
 }



void lcd_wdat(uchar dat)       
{
    rs=1;             //选择数据寄存器
    rw=0;            //选择写
    P0=dat;         //把要显示的数据送入P0
    delay(5);      //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
    en=1;         //使能线电平变化,数据送入1602的8位数据口
    en=0;
  }



void lcd_init()             
{
    lcd_wcom(0x38);       //8位数据,双列,5*7字形  ,用到功能设定指令    
    lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令
    lcd_wcom(0x06);     //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令
    lcd_wcom(0x01);    //清屏,用到了清屏指令
}
 


void lcd_xianshi()             
{
    lcd_wcom(0x80+0x40);
        lcd_wdat('D');
        lcd_wdat('i');
        lcd_wdat('s');
        lcd_wdat('t');
        lcd_wdat('a');
           lcd_wdat('n');
        lcd_wdat('c');
        lcd_wdat('e');
        lcd_wdat(':');
        lcd_wcom(0x80+0x4c);
        lcd_wdat('.');
        lcd_wcom(0x80+0x4e);//单位是厘米//
        lcd_wdat('c');
        lcd_wdat('m');

}



void init_t0()
{
        TMOD=0x01;        
         TL0=0x66;
        TH0=0xfc;              //1ms
    ET0=1;            
        EA=1;                     
}



void trigger()
{
    trig=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
        trig=1;      
}



void init_measuring()
{
        trig=1;
        echo=1;
        count=0;
}



void measuring()
{
        uchar l;
        uint h,y;
        TR0 = 1;
        while(echo==1)
    {
        ;
    }       
        TR0 = 0;
        l = TL0;
        h = TH0;
        y = (h << 8) + l;
        y = y - 0xfc66;//us部分
        distance = y + 1000 * count;//计算总时间,单位是微秒
        TL0 = 0x66;
        TH0 = 0xfc;
        delayt(30);
        distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//       
}



void display(uint x)
{
        uchar qian,bai,shi,ge;
        qian=x/1000;
        bai=(x/100);
        shi=(x/10);
        ge=x;

        lcd_wcom(0x80+0x49);//单位是厘米//
        lcd_wdat(table[qian]);
        lcd_wdat(table[bai]);
        lcd_wdat(table[shi]);
        lcd_wcom(0x80+0x4d);
        lcd_wdat(table[ge]);
}


void main()           
{   lcd_init();          //液晶初始化       
    init_t0();          //定时器0初始化  
        init_measuring();  //超声波相应端口初始化


        while(1)
        {
         lcd_xianshi();   //液晶显示特定字符
         trigger();      //触发超声波启动
          while(echo==0)          //等待回声
          {
             ;
          }
            measuring();           //进行距离测量
            display(distance);    //对测量结果进行显示
            init_measuring();    //超声波相应端口初始化
            delayt(600);        //每次测量间隔60ms
        }
}


//……………………………………………中断服务函数…………………………………………………//

void T_0()interrupt 1
{
        TF0 = 0;
        TL0 = 0x66;
        TH0 = 0xfc;
        count++;
        if(count==18)
        {
          TR0 =0;
          TL0 = 0x66;
          TH0 = 0xfc;
          count = 0;
        }
}


关键字:51单片机  1602显示  超声波测距 引用地址:51单片机1602显示的超声波测距源程序

上一篇:51单片机超声波测距仿真结果分析
下一篇:超声波测距51单片机12864液晶显示

推荐阅读最新更新时间:2024-03-16 15:35

51单片机的ds1302驱动程序
////////////////////////////////////////////////////////////头文件///////////////////////////////////////////////// /******************************************************************************* * 标题: ds1302时钟芯片驱动程序 * * 文件: ds1302.h ds1302.c
[单片机]
取键值MC51单片机子程序实例
;取键值程序 ;功能:等待键入,并刷新显示,并返回键值放A ;占用:PSW,A,DPTR,R0,R2,R3,R4,R6,R7 ;入口:无 出口:A ORG 0190H WAT_KB: MOV R0,#3FH WAT_0: ACALL DISP_0 ;刷新显示器 ACALL T_KB JZ WAT_0 ;无键,循环 ACALL KEY_LD ;延时消抖,刷新显示 JZ WAT_0 ;无键,循环 KB_VUL: CLR A CPL A MOV DPTR,#PORT_B MOVX @DPTR,A ;关显示 MOV R2,#0FEH MOV R
[单片机]
51单片机做的PWM无级调光程序
#i nclude reg51.h #i nclude user.h #define uchar unsigned char unsigned int value=100; unsigned int del=0; uchar value_temp=4; uchar temp=0; uchar code tab ={0x88,0xbe,0xc4,0x94,0xb2,0x91,0x81,0xbc,0x80,0x90,0xf7}; sbit pwm_port=p3^1; sbit key=p3^7; bit lamp_enable=0; void display(uchar dat) { p1=tab ; } void timer_i
[单片机]
C51单片机学习笔记之中断系统
简介 什么是中断 在CPU 运行主程序时,暂停去处理别的程序,然后再回来处理主程序,这就是中断。 中断源 共8个,外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3。 中断寄存器 ps:优先级从高到低。 TCON寄存器 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。 TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作 IE0(IE1)——外部中断请求标志位 IT1(IT0)——外部中断触发方式选择位 IE寄存器 EA:中断的总开关,E
[单片机]
C<font color='red'>51单片机</font>学习笔记之中断系统
51单片机】学习总结
1. Ctrl+S为保存当前文件,如图 打开了两个文件,可以看到有个文件是带星号且有个红叉的,有个红叉说明它为当前打开的文件,也就是正在编辑的文件。当按下Ctrl+S时只保存了当前文件。另一个文件没有保存,当你的电脑意外断电或死机时,如果你在那之前按了Ctrl+S那么可以挽回点损失,可是另一个文件的信息可能就丢失了。所以推荐按F7(对所以文件进行编译,并且保存),这样就可以在编译的同时将所以文件保存一次。所以在真正做工程的时候就要学会定期按F7,不是说一定要程序编写完整后才按F7。 2. 默认情况下头文件和源文件应该放在同一个文件目录下,如果将头文件放在一个独立的文件夹中如名为include的文件夹,此时就读取不出。
[单片机]
51单片机显示静态数码管
#include reg51.h //头文件 sbit SMGA=P2^2;//位定义 sbit SMGB=P2^3; sbit SMGC=P2^4; unsigned int table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管字形码 void main()//主函数 { SMGA=0;//Y0非输出端对应的数码管显示 SMGB=0; SMGC=0; P0=table ;//数码管显示 while(1); } 注: P0口接74H
[单片机]
简述51单片机延时函数
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。扩展阅读:汇编延时程序算法详解 一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2
[单片机]
基于51单片机的新型步进电机运动控制器
1 引言   数控技术是一种采用计算机对机械加工过程中各种控制信息进行数字化运算处理,并通过高性能的驱动单元对机械执行构件进行自动化控制的高新技术。现代机械加工业逐步向柔性化、集成化、智能化方向发展,因此新一代数控技术就必需强调具有开放式、智能化、网络化的特征 。本文采用新型微处理器、高性能集成电路,研究开发智能步进电机控制卡。 2 系统总体结构设计   通过对步进电机控制器关键技术进行分析、研究和比较,并综合国内外运动控制器产品智能化、集成化、开放化的发展趋势,我们提出的步进电机运动控制器总体结构如图1所示。 图1 系统总体结构 3 系统硬件电路设计   3.1 脉冲分频电路设计   本系统的主要控制对象为步进
[单片机]
基于<font color='red'>51单片机</font>的新型步进电机运动控制器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved