找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1491|回复: 0
打印 上一主题 下一主题
收起左侧

超声波1602显示

[复制链接]
跳转到指定楼层
楼主
ID:169534 发表于 2020-7-8 04:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg51.h"

#define uchar unsigned char
#define uint unsigned int


//这三个引脚参考资料
sbit E=P2^7;                //1602使能引脚
sbit RW=P2^6;                //1602读写引脚       
sbit RS=P2^5;                //1602数据/命令选择引脚

sbit trig=P1^0;
sbit echo=P3^2;
bit flag=0;
uchar Buffer[28] = "D=            ";         //所要发送的数据
uchar Buffer1[28] = "Ultrasonic test";
uchar Buffer2[28]="fall outside!";

uchar *m,*n;


  void delay1(uint x)
{
        int i,j;
        for(i=0; i<=500; i++)
        for(j=0; j<=x; j++)
                ;
}

// 1602写命令函数
void enable(uchar del)
{
        P0 = del;
        RS = 0;
        RW = 0;
        E = 0;
        delay1(1);
        E = 1;
        delay1(1);
}

// 1602写数据函数
void write(uchar del)
{
        P0 = del;
        RS = 1;
        RW = 0;
        E = 0;
        delay1(1);
        E = 1;
        delay1(1);
}


//1602初始化,请参考1602的资料
void L1602_init(void)
{
        enable(0x01);         //清屏
        enable(0x38);         //功能设定
        enable(0x0c);         //显示开、关设定
        enable(0x06);         //输入模式设定
}


// 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')
void L1602_char(uchar hang,uchar lie,char sign)
{
        uchar a;
        if(hang == 1) a = 0x80;          //第一行地址80H
        if(hang == 2) a = 0xc0;          //第二行地址C0H
        a = a + lie - 1;
        enable(a);
        write(sign);
}


// 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")
void L1602_string(uchar hang,uchar lie,uchar *q)
{
        uchar a;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        enable(a);
        while(1)
        {
                if(*q == '\0') break;
                write(*q);
                q++;
        }
}
    void  HS_init()                 //模块初始化
  {
          TMOD=0x09;                 //方式1,GATE=1
          TH0=0;
          TL0=0;
          EA=1;
          ET0=1;
  }

void HS_run()
{                           //发射超声波
    trig=0;
        trig=1;
        delay1(1);
        trig=0;
}

void chuli()          //数据处理函数
{
float temp=0;
  uint b,c;
  c=TH0*256+TL0;
  TH0=0;
  TL0=0;
  temp=(c*0.017);                           //单位是cm
  b=temp*10;
  if(b>4000||flag==1)                //超范围
     {
          flag=0;
          m=Buffer2;       
          }
   else{
    m=Buffer;
        if(b/1000==0)                                //高位为0时不显示
                 Buffer[5]=' ';
        else  
             Buffer[5]=b/1000+0x30;
        if(b%1000/100==0&&b/1000==0)
             Buffer[6]=' ';
    else
             Buffer[6]=b%1000/100+0x30;
  Buffer[7]=b%100/10+0x30;
  Buffer[8]=0x2E;  //小数点“.”
  Buffer[9]=b%10+0x30;


  Buffer[11]=0x63;         //字母“c”
  Buffer[12]=0x6d;         //字母“m”
  }
}
void main()
{

        m=Buffer;
        n=Buffer1;

    L1602_init();
        HS_init();
        L1602_string(1,1,n);
        while(1)
        {
          HS_run();
          while(!echo);
          TR0=1;
          while(echo);
          TR0=0;
          chuli();
        L1602_string(2,1,m);
        delay1(250);
    }
        }           


    void t0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表