久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3650|回復: 1
打印 上一主題 下一主題
收起左側

脈寬測量程序 HC-SRO4超聲波測距模塊1602顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:238437 發表于 2017-10-10 21:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于超聲波的1602顯示,用到了單片機的脈寬測量技術
單片機源程序如下:

  1. /*============================================================
  2. //HC-SRO4 超聲波測距模塊 DEMO 程序
  3. ==============================================================
  4. SMC1602A(16*2)模擬口線接線方式
  5. 連接線圖:        
  6.        ---------------------------------------------------
  7.        |LCM-----51   |        LCM-----51   |        LCM------51      |
  8.        --------------------------------------------------|
  9.        |DB0-----P1.0 |        DB4-----P1.4 |        RW-------P3.4    |
  10.        |DB1-----P1.1 |        DB5-----P1.5 |        RS-------P3.3    |
  11.        |DB2-----P1.2 |        DB6-----P1.6 |        E--------P3.5    |
  12.        |DB3-----P1.3 |        DB7-----P1.7 |        VLCD接1K電阻到GND|
  13.        ---------------------------------------------------
  14. 接線:模塊TRIG接 P2.6  ECH0 接P2.7

  15. 本程序源碼只供學習參考,不得應用于商業用途,如有需要請聯系作者。

  16. [注:AT89x51使用12M或11.0592M晶振,實測使用11.0592M]
  17. =============================================================*/
  18. #include <AT89x51.H>                //器件配置文件
  19. #include <intrins.h>

  20. #define  RX  P2_0
  21. #define  TX  P2_1

  22. #define LCM_RW  P2_5 //定義LCD引腳
  23. #define LCM_RS  P2_6 //#define LCD1602_DATAPINS P0
  24.                      //sbit LCD1602_E=P2^7;
  25.                      //sbit LCD1602_RW=P2^5;
  26.                      //sbit LCD1602_RS=P2^6;
  27. #define LCM_E   P2_7
  28. #define LCM_Data  P0

  29. //#define Key_Data P2_0 //定義Keyboard引腳
  30. //#define Key_CLK  P3_2

  31. #define Busy    0x80 //用于檢測LCM狀態字中的Busy標識

  32. void LCMInit(void);
  33. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  34. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  35. void Delay5Ms(void);
  36. void Delay400Ms(void);
  37. void Decode(unsigned char ScanCode);
  38. void WriteDataLCM(unsigned char WDLCM);
  39. void WriteCommandLCM(unsigned char WCLCM,BuysC);

  40. unsigned char ReadDataLCM(void);
  41. unsigned char ReadStatusLCM(void);
  42. unsigned char code mcustudio[] ={"***2017.09.07***"};
  43. unsigned char code email[] =    {"***tangjiale****"};
  44. unsigned char code Cls[] =      {"                "};
  45. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','*','M'};

  46. static unsigned char DisNum = 0; //顯示用指針                                 
  47.        unsigned int  time=0;
  48.            unsigned long S=0;
  49.            bit      flag =0;
  50.            unsigned char disbuff[4]           ={ 0,0,0,0,};


  51. //寫數據
  52. void WriteDataLCM(unsigned char WDLCM)
  53. {
  54.         ReadStatusLCM(); //檢測忙
  55.         LCM_Data = WDLCM;
  56.         LCM_RS = 1;
  57.         LCM_RW = 0;
  58.         LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  59.         LCM_E = 0; //延時
  60.         LCM_E = 1;
  61. }

  62. //寫指令
  63. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  64. {
  65.         if (BuysC) ReadStatusLCM(); //根據需要檢測忙
  66.         LCM_Data = WCLCM;
  67.         LCM_RS = 0;
  68.         LCM_RW = 0;        
  69.         LCM_E = 0;
  70.         LCM_E = 0;
  71.         LCM_E = 1;        
  72. }

  73. //讀數據
  74. unsigned char ReadDataLCM(void)
  75. {
  76.         LCM_RS = 1;
  77.         LCM_RW = 1;
  78.         LCM_E = 0;
  79.         LCM_E = 0;
  80.         LCM_E = 1;
  81.         return(LCM_Data);
  82. }

  83. //讀狀態
  84. unsigned char ReadStatusLCM(void)
  85. {
  86.         LCM_Data = 0xFF;
  87.         LCM_RS = 0;
  88.         LCM_RW = 1;
  89.         LCM_E = 0;
  90.         LCM_E = 0;
  91.         LCM_E = 1;
  92.         while (LCM_Data & Busy); //檢測忙信號
  93.         return(LCM_Data);
  94. }

  95. void LCMInit(void) //LCM初始化
  96. {
  97.         LCM_Data = 0;
  98.         WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
  99.         Delay5Ms();
  100.         WriteCommandLCM(0x38,0);
  101.         Delay5Ms();
  102.         WriteCommandLCM(0x38,0);
  103.         Delay5Ms();

  104.         WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  105.         WriteCommandLCM(0x08,1); //關閉顯示
  106.         WriteCommandLCM(0x01,1); //顯示清屏
  107.         WriteCommandLCM(0x06,1); // 顯示光標移動設置
  108.         WriteCommandLCM(0x0F,1); // 顯示開及光標設置
  109. }

  110. //按指定位置顯示一個字符
  111. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  112. {
  113.         Y &= 0x1;
  114.         X &= 0xF; //限制X不能大于15,Y不能大于1
  115.         if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
  116.         X |= 0x80; //算出指令碼
  117.         WriteCommandLCM(X, 1); //發命令字
  118.         WriteDataLCM(DData); //發數據
  119. }

  120. //按指定位置顯示一串字符
  121. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  122. {
  123.         unsigned char ListLength;

  124.   ListLength = 0;
  125.         Y &= 0x1;
  126.         X &= 0xF; //限制X不能大于15,Y不能大于1
  127.         while (DData[ListLength]>0x19) //若到達字串尾則退出
  128.                 {
  129.                         if (X <= 0xF) //X坐標應小于0xF
  130.                                 {
  131.                                         DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  132.                                         ListLength++;
  133.                                         X++;
  134.                                 }
  135.                 }
  136. }

  137. //5ms延時
  138. void Delay5Ms(void)
  139. {
  140.         unsigned int TempCyc = 5552;
  141.         while(TempCyc--);
  142. }

  143. //400ms延時
  144. void Delay400Ms(void)
  145. {
  146.         unsigned char TempCycA = 5;
  147.         unsigned int TempCycB;
  148.         while(TempCycA--)
  149.                 {
  150.                         TempCycB=7269;
  151.                         while(TempCycB--);
  152.                 };
  153. }
  154. /********************************************************/
  155.     void Conut(void)
  156.         {
  157.          time=TH0*256+TL0;
  158.          TH0=0;
  159.          TL0=0;
  160.         
  161.          S=(time*1.87)/100;    //算出來是M
  162.          if((S>=700)||flag==1) //超出測量范圍顯示“*”
  163.          {         
  164.           flag=0;
  165.          
  166.           DisplayOneChar(0, 1, ASCII[11]);
  167.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點
  168.           DisplayOneChar(2, 1, ASCII[11]);
  169.           DisplayOneChar(3, 1, ASCII[11]);
  170.           DisplayOneChar(4, 1, ASCII[12]);        //顯示M
  171.          }
  172.          else
  173.          {
  174.           disbuff[0]=S%1000/100;
  175.           disbuff[1]=S%1000%100/10;
  176.           disbuff[2]=S%1000%10 %10;
  177.           DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  178.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點
  179.           DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  180.           DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  181.           DisplayOneChar(4, 1, ASCII[12]);        //顯示M
  182.          }
  183.         }
  184. /********************************************************/
  185.      void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
  186.   {
  187.     flag=1;                                                         //中斷溢出標志
  188.   }
  189. /********************************************************/
  190.      void  StartModule()                          //啟動模塊
  191.   {
  192.           TX=1;                                             //啟動一次模塊
  193.           _nop_();
  194.           _nop_();
  195.           _nop_();
  196.           _nop_();
  197.           _nop_();
  198.           _nop_();
  199.           _nop_();
  200.           _nop_();
  201.           _nop_();
  202.           _nop_();
  203.           _nop_();
  204.           _nop_();
  205.           _nop_();
  206.           _nop_();
  207.           _nop_();
  208.           _nop_();
  209.           _nop_();
  210.           _nop_();
  211.           _nop_();
  212.           _nop_();
  213.           _nop_();
  214.           TX=0;
  215.   }
  216. /********************************************************/
  217. void delayms(unsigned int ms)
  218. {
  219.         unsigned char i=100,j;
  220.         for(;ms;ms--)
  221.         {
  222.                 while(--i)
  223.                 {
  224.                         j=10;
  225.                         while(--j);
  226.                 }
  227.         }
  228. }
  229. /*********************************************************/
  230. void main(void)
  231. {
  232.         unsigned char TempCyc;
  233.         Delay400Ms(); //啟動等待,等LCM講入工作狀態
  234.         LCMInit(); //LCM初始化
  235.         Delay5Ms(); //延時片刻(可不要)
  236.         DisplayListChar(0, 0, mcustudio);
  237.         DisplayListChar(0, 1, email);
  238.         ReadDataLCM();//測試用句無意義
  239.         for (TempCyc=0; TempCyc<10; TempCyc++)
  240.         Delay400Ms(); //延時
  241.         DisplayListChar(0, 1, Cls);        
  242.         while(1)
  243.         {
  244.          TMOD=0x01;                   //設T0為方式1,GATE=1;
  245.          TH0=0;
  246.          TL0=0;         
  247.          ET0=1;             //允許T0中斷
  248.          EA=1;                           //開啟總中斷                        
  249.         
  250.         while(1)
  251.           {
  252.              StartModule();
  253.                 // DisplayOneChar(0, 1, ASCII[0]);
  254.              while(!RX);                //當RX為零時等待
  255.              TR0=1;                            //開啟計數
  256.              while(RX);                        //當RX為1計數并等待
  257.              TR0=0;                                //關閉計數
  258.          Conut();                        //計算
  259.                  delayms(80);                //80MS
  260.                  
  261.           }
  262.         }
  263. }



  264.                
復制代碼

所有資料51hei提供下載:
超聲波測距LC1602顯示.zip (39.81 KB, 下載次數: 16)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:89286 發表于 2017-10-11 07:00 | 只看該作者
thanks for sharing
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜私人影院 | 视频一区在线观看 | 成人精品一区二区户外勾搭野战 | 在线婷婷| 欧美成人综合 | 日韩亚洲欧美综合 | 亚洲一区二区三区久久久 | 亚洲人成人一区二区在线观看 | 成人深夜福利 | 中文字幕av中文字幕 | 亚洲日本免费 | 国产精品美女一区二区 | 国产日韩一区二区三免费高清 | 观看毛片| 日韩国产免费观看 | 国产精品嫩草影院精东 | 懂色av色香蕉一区二区蜜桃 | 欧美成人h版在线观看 | 99精品一区二区三区 | 欧美一级做性受免费大片免费 | 欧美日韩国产一区二区三区不卡 | 日日草天天干 | 精品国产91乱码一区二区三区 | 久久三区| 秋霞电影一区二区 | 男女羞羞视频免费 | 精品视频网 | 国产成人精品一区二三区在线观看 | 欧美乱码精品一区二区三区 | 日日噜噜噜夜夜爽爽狠狠视频, | 久久之精品 | 国产女人与拘做视频免费 | 亚洲精品久久久久久一区二区 | 欧美精品一区三区 | 亚洲va欧美va天堂v国产综合 | 久久精品色欧美aⅴ一区二区 | 欧美另类视频 | 欧美亚洲视频 | 亚洲在线高清 | 欧美老少妇一级特黄一片 | 视频1区2区 |