標題: 單片機超聲波測距下面幾行代碼的意思求解 [打印本頁]

作者: 人生這里    時間: 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.          }


復(fù)制代碼


作者: HC6800-ES-V2.0    時間: 2019-4-21 08:45
前三行,是將測量到的距離S,轉(zhuǎn)換為可顯示的各位數(shù),百位、十位、個位
我個人習慣這樣寫:
bai=s/100;
shi=(s%100)/10;
ge=(s%10)/1;
后四行是對1602的顯示進行操作:
第四行是向1602發(fā)命令,是指定顯示位置的意思
最后三行就是顯示內(nèi)容了,0x30的ASCII碼數(shù)字開始的位置,即將顯示值轉(zhuǎn)換為顯示碼。
作者: 孤劍酷    時間: 2019-4-21 14:31
取各個位的數(shù)值分別儲存為單個字符,在LCD1602上顯示
作者: hantu    時間: 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顯示屏的第一行的第三個字符處開始顯示它們。
作者: 15555    時間: 2019-4-22 14:19
將數(shù)值分成百十個并顯示在1602上




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1