找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1319|回复: 4
收起左侧

单片机超声波测距下面几行代码的意思求解

[复制链接]
ID:501937 发表于 2019-4-20 20:41 | 显示全部楼层 |阅读模式
求助               
                 bai=s/100;
                 shi=s/10%10;
                 ge=s%10%10;
                 Lcd1602_WriteCom(0x80+0x02);
                 Lcd1602_WriteData(0x30+bai);
                 Lcd1602_WriteData(0x30+shi);
                 Lcd1602_WriteData(0x30+ge);
这些啥意思啊

下面是完整单片机程序:

  1.    #include<reg51.h>
  2.     #include<intrins.h>
  3.     #define uchar unsigned char
  4.     #define uint unsigned int

  5.          uchar shi,ge,bai;
  6.          int jia=0;
  7.          unsigned long  int s=0;

  8.     sbit RS=P2^6;
  9.     sbit RW=P2^5;  
  10.     sbit E=P2^7;  
  11.           sbit trig=P1^1;
  12.         sbit echo=P1^3;


  13.         void start()
  14.         {
  15.          trig=1;
  16.          _nop_();
  17.          _nop_();
  18.          _nop_();
  19.          _nop_();
  20.          _nop_();
  21.          _nop_();
  22.          _nop_();
  23.          _nop_();
  24.          _nop_();
  25.          _nop_();
  26.          _nop_();
  27.          _nop_();
  28.          trig=0;
  29.         }

  30.         
  31.     void delay(uint z)
  32.     {
  33.        uint i,j;
  34.        for(i=z;i>0;i--)
  35.           for(j=110;j>0;j--);
  36.     }



  37.     uchar Lcd1602_ReadBusy()  
  38.     {
  39.        uchar temp;
  40.        RS=0;
  41.        RW=1;
  42.        _nop_();
  43.        P0=0xff;               


  44.        _nop_();
  45.        E=1;
  46.        _nop_();
  47.        temp=P0;   
  48.        _nop_();
  49.        E=0;
  50.        return (temp&0x80);

  51.     }


  52.     void Lcd1602_WriteCom(uchar com)
  53.     {
  54.        while(Lcd1602_ReadBusy());
  55.        RS=0;
  56.        RW=0;  
  57.        _nop_();
  58.        P0=com;  
  59.        _nop_();
  60.        E=1;     
  61.        _nop_();
  62.        _nop_();
  63.        E=0;      
  64.        _nop_();
  65.        _nop_();   
  66.     }

  67.     void Lcd1602_WriteData(uchar dat)
  68.     {
  69.        while(Lcd1602_ReadBusy());   
  70.        RS=1;   
  71.        RW=0;  
  72.        _nop_();
  73.        P0=dat;
  74.        _nop_();
  75.        E=1;
  76.        _nop_();
  77.        _nop_();
  78.        E=0;
  79.        _nop_();
  80.        _nop_();   
  81.     }

  82.     void Lcd1602_init()
  83.     {
  84.        delay(15);
  85.        Lcd1602_WriteCom(0x38);  
  86.        delay(5);
  87.        Lcd1602_WriteCom(0x38);
  88.        delay(5);
  89.        Lcd1602_WriteCom(0x38);
  90.        Lcd1602_WriteCom(0x0c);  
  91.        Lcd1602_WriteCom(0x01);
  92.        Lcd1602_WriteCom(0x06);
  93.     }



  94.          void  main()
  95.          {
  96.                  while(1)
  97.                  {
  98.                  TMOD=0x01;
  99.                  ET0=1;
  100.                  EA=1;
  101.                  TL0=0;
  102.                  TH0=0;
  103.                  start();
  104.                  while(!echo);
  105.                  TR0=1;
  106.                  while(echo);
  107.                  TR0=0;
  108.                  s=TH0*256+TL0+jia;
  109.                  jia=0;
  110.                  s=s*0.017*12/11;
  111.                  Lcd1602_init();
  112.                  bai=s/100;
  113.                  shi=s/10%10;
  114.                  ge=s%10%10;
  115.                  Lcd1602_WriteCom(0x80+0x02);
  116.                  Lcd1602_WriteData(0x30+bai);
  117.                  Lcd1602_WriteData(0x30+shi);
  118.                  Lcd1602_WriteData(0x30+ge);

  119.                  }
  120.          }
  121.          void Time0(void) interrupt 1
  122.          {
  123.          jia=jia+65536;
  124.          TH0=0;
  125.          TL0=0;
  126.          }


复制代码

回复

使用道具 举报

ID:164602 发表于 2019-4-21 08:45 | 显示全部楼层
前三行,是将测量到的距离S,转换为可显示的各位数,百位、十位、个位
我个人习惯这样写:
bai=s/100;
shi=(s%100)/10;
ge=(s%10)/1;
后四行是对1602的显示进行操作:
第四行是向1602发命令,是指定显示位置的意思
最后三行就是显示内容了,0x30的ASCII码数字开始的位置,即将显示值转换为显示码。
回复

使用道具 举报

ID:101620 发表于 2019-4-21 14:31 | 显示全部楼层
取各个位的数值分别储存为单个字符,在LCD1602上显示
回复

使用道具 举报

ID:462827 发表于 2019-4-21 15:38 | 显示全部楼层
bai=s/100;
shi=s/10%10;
ge=s%10%10;
Lcd1602_WriteCom(0x80+0x02);
Lcd1602_WriteData(0x30+bai);
Lcd1602_WriteData(0x30+shi);
Lcd1602_WriteData(0x30+ge);

分别取得s的百位、十位、个位,然后在1602显示屏的第一行的第三个字符处开始显示它们。
回复

使用道具 举报

ID:501535 发表于 2019-4-22 14:19 | 显示全部楼层
将数值分成百十个并显示在1602上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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