<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51單片機加HC—SR04超聲波測距儀用LCD1602顯示

        作者:我行天下   來源:本站原創   點擊數:  更新時間:2014年03月30日   【字體:

        #include <reg51.H>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint unsigned int
        sbit lcden=P1^2;
        sbit lcdrs=P1^0;
        sbit lcdrw=P1^1;
        sbit  RX=P2^1;
        sbit  TX=P2^0;
            
        uint  time=0;
        unsigned long S=0;
        bit  flag =0;
        uchar disdat[4]={ 0,0,0,0,};
        void delay(uint z) //延時子程序
        {
          uint x,y;
          for(x=z;x>0;x--)
             for(y=110;y>0;y--);
        }
        void write_com(uchar com)//定義一個帶參數的寫命令子程序
        {
         lcdrs=0; //1602的rs為0時,接收命令,為1時接收數據
         P0=com;//把void write_com(uchar com)中的COM中的數據給P0口
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
         delay(5);
        }
        void write_shu(uchar shu)//定義一個帶參數的寫數據子程序
        {
         lcdrs=1; //1602的rs為0時,接收命令,為1時接收數據
         P0=shu;//把void write_shu(uchar shu)中的COM中的數據給P0口
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
         delay(5);
        }
        void write_1602(uchar add,uchar dat)
        {
         write_com(0x80+0x40+add);
         write_shu(dat);
        }

        void zifuchuan(uchar *ch)
        {
        while(*ch!=0)
        write_shu(*ch++);
        delay(20);
        }
        void init()//定義一個初始化子程序
        {
         lcden=0;
         lcdrw=0;
         write_com(0x38);//調用 write_com子程序并把0x38賦給P0口,顯示模式打開
         delay(2);
         write_com(0x0c);//調用 write_com子程序并把“開顯示,顯示光標,光標不閃爍”指令碼賦給P0口
         write_com(0x06);//調用 write_com子程序并把“地址指針加1,整屏不移動”指令碼賦給P0口
         write_com(0x80);//數據指針初始化,讓指針指向最左端,顯示從第一行開始
         write_com(0x01);//調用 write_com子程序并把"清零指"令碼賦給P0口
          zifuchuan("HHSY Zhoujiaoshi");
         
        }
         
        /********************************************************/
        void Conut()
         {
          time=TH0*256+TL0;
          TH0=0;
          TL0=0;
         
          //S=(time*1.7)/100;
           S=time/58;     //算出來是CM
           disdat[0]=S%1000/100;
           disdat[1]=S%1000%100/10;
           disdat[2]=S%1000%10 %10;
           write_1602(1, disdat[0]+0x30);
           write_1602(2, disdat[1]+0x30);
           write_1602(3, disdat[2]+0x30);
           write_1602(4,'.');
           write_1602(5, disdat[3]+0x30);
           write_1602(6, 'C');
           write_1602(7, 'm');
           
         }
        /********************************************************/
        void zd0() interrupt 1  //T0中斷用來計數器溢出,超過測距范圍
        {
          flag=1;//中斷溢出標志
        }
        /********************************************************/
        void  StartModule()   //啟動模塊
          {
           TX=1; //啟動一次模塊
           _nop_();  _nop_();    _nop_();    _nop_();    _nop_();
           _nop_();   _nop_();    _nop_();    _nop_();   _nop_();
           _nop_();   _nop_();    _nop_();   _nop_();   _nop_();
           _nop_();   _nop_();   _nop_();   _nop_();   _nop_();
           _nop_();
           TX=0;
          }
        /*********************************************************/
        void main(void)
        {
         delay(400); //啟動等待,等LCD講入工作狀態
            init(); //LCD初始化
          TMOD=0x01;//設T0為方式1,GATE=1;
          TH0=0;
          TL0=0;        
          ET0=1; //允許T0中斷
          EA=1;//開啟總中斷  
         
         while(1)
           {
              StartModule();
              while(!RX);  //當RX為零時等待
              TR0=1;       //開啟計數
              while(RX);   //當RX為1計數并等待
              TR0=0;    //關閉計數
                 Conut();   //計算
           delay(20);
         
           }
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮