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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

有關51單片機的超聲波測距(HC—SR04)程序

[復制鏈接]
跳轉到指定樓層
樓主
超聲波的學習參考資料+原理圖+使用手冊

單片機源程序如下
  1. #include <AT89x51.H>                //器件配置文件
  2. #include <intrins.h>
  3. #define  RX  P2_7
  4. #define  TX  P2_6

  5. #define LCM_RW  P3_4 //定義LCD引腳
  6. #define LCM_RS  P3_3
  7. #define LCM_E   P3_5
  8. #define LCM_Data  P1

  9. #define Key_Data P2_0 //定義Keyboard引腳
  10. #define Key_CLK  P3_2

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

  12. void LCMInit(void);
  13. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  14. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  15. void Delay5Ms(void);
  16. void Delay400Ms(void);
  17. void Decode(unsigned char ScanCode);
  18. void WriteDataLCM(unsigned char WDLCM);
  19. void WriteCommandLCM(unsigned char WCLCM,BuysC);

  20. unsigned char ReadDataLCM(void);
  21. unsigned char ReadStatusLCM(void);
  22. unsigned char code mcustudio[] ={"mcustudio.com.cn"};
  23. unsigned char code email[] =    {"fhwxaoo@163.com "};
  24. unsigned char code Cls[] =      {"                "};
  25. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  26. static unsigned char DisNum = 0; //顯示用指針                                 
  27.        unsigned int  time=0;
  28.            unsigned long S=0;
  29.            bit      flag =0;
  30.            unsigned char disbuff[4]           ={ 0,0,0,0,};


  31. //寫數據
  32. void WriteDataLCM(unsigned char WDLCM)
  33. {
  34.         ReadStatusLCM(); //檢測忙
  35.         LCM_Data = WDLCM;
  36.         LCM_RS = 1;
  37.         LCM_RW = 0;
  38.         LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  39.         LCM_E = 0; //延時
  40.         LCM_E = 1;
  41. }

  42. //寫指令
  43. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  44. {
  45.         if (BuysC) ReadStatusLCM(); //根據需要檢測忙
  46.         LCM_Data = WCLCM;
  47.         LCM_RS = 0;
  48.         LCM_RW = 0;        
  49.         LCM_E = 0;
  50.         LCM_E = 0;
  51.         LCM_E = 1;        
  52. }

  53. //讀數據
  54. unsigned char ReadDataLCM(void)
  55. {
  56.         LCM_RS = 1;
  57.         LCM_RW = 1;
  58.         LCM_E = 0;
  59.         LCM_E = 0;
  60.         LCM_E = 1;
  61.         return(LCM_Data);
  62. }

  63. //讀狀態
  64. unsigned char ReadStatusLCM(void)
  65. {
  66.         LCM_Data = 0xFF;
  67.         LCM_RS = 0;
  68.         LCM_RW = 1;
  69.         LCM_E = 0;
  70.         LCM_E = 0;
  71.         LCM_E = 1;
  72.         while (LCM_Data & Busy); //檢測忙信號
  73.         return(LCM_Data);
  74. }

  75. void LCMInit(void) //LCM初始化
  76. {
  77.         LCM_Data = 0;
  78.         WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
  79.         Delay5Ms();
  80.         WriteCommandLCM(0x38,0);
  81.         Delay5Ms();
  82.         WriteCommandLCM(0x38,0);
  83.         Delay5Ms();

  84.         WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  85.         WriteCommandLCM(0x08,1); //關閉顯示
  86.         WriteCommandLCM(0x01,1); //顯示清屏
  87.         WriteCommandLCM(0x06,1); // 顯示光標移動設置
  88.         WriteCommandLCM(0x0F,1); // 顯示開及光標設置
  89. }

  90. //按指定位置顯示一個字符
  91. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  92. {
  93.         Y &= 0x1;
  94.         X &= 0xF; //限制X不能大于15,Y不能大于1
  95.         if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
  96.         X |= 0x80; //算出指令碼
  97.         WriteCommandLCM(X, 1); //發命令字
  98.         WriteDataLCM(DData); //發數據
  99. }

  100. //按指定位置顯示一串字符
  101. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  102. {
  103.         unsigned char ListLength;

  104.   ListLength = 0;
  105.         Y &= 0x1;
  106.         X &= 0xF; //限制X不能大于15,Y不能大于1
  107.         while (DData[ListLength]>0x19) //若到達字串尾則退出
  108.                 {
  109.                         if (X <= 0xF) //X坐標應小于0xF
  110.                                 {
  111.                                         DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  112.                                         ListLength++;
  113.                                         X++;
  114.                                 }
  115.                 }
  116. }

  117. //5ms延時
  118. void Delay5Ms(void)
  119. {
  120.         unsigned int TempCyc = 5552;
  121.         while(TempCyc--);
  122. }

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



  244.                
復制代碼

全部資料51hei下載地址:
超聲波測距資料(HC-SR04)_TB - 副本.rar (2.62 MB, 下載次數: 22)

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久国产精品 | 国产精品国产三级国产aⅴ中文 | 嫩草视频入口 | 男人天堂视频在线观看 | 草草影院ccyy| 国产999精品久久久 日本视频一区二区三区 | 亚洲+变态+欧美+另类+精品 | 日日摸夜夜添夜夜添特色大片 | 在线观看中文字幕视频 | 欧美中文字幕一区 | 成年人在线观看视频 | 久草免费福利 | 欧美性受xxxx白人性爽 | 日韩免费中文字幕 | 亚洲视频国产视频 | 久久剧场| 欧美一级淫片免费视频黄 | 欧美精品综合在线 | 精品久久久久国产免费第一页 | 成人av播放| 亚洲一区二区三区免费观看 | 91精品国产91久久综合桃花 | 欧美一级黄视频 | 国产一区不卡 | 波波电影院一区二区三区 | 国产精品99久久久久久动医院 | 久久国产一区二区 | 久久精品高清视频 | 亚洲欧美一区二区三区国产精品 | 欧美www在线观看 | 欧美精品在线播放 | 超碰在线免费公开 | 在线成人www免费观看视频 | 视频在线一区二区 | 亚洲字幕在线观看 | 日本偷偷操 | 国产精品成人一区二区三区夜夜夜 | 7777精品伊人久久精品影视 | 亚洲精品视频一区二区三区 | 亚洲国产二区 | 天天躁日日躁狠狠躁白人 |