找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18677|回復: 8
收起左側

51單片機HC-SR04超聲波測距原理圖pcb文件與程序源碼

  [復制鏈接]
ID:396801 發(fā)表于 2018-9-12 16:15 | 顯示全部樓層 |閱讀模式
關于HC-SR04超聲波模塊,基于51單片機程序加硬件。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png 0.png

單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. sbit RX=P2^7; //接收端
  4. sbit TX=P2^6; //控制端
  5. sbit RS=P2^5; //定義LCD引腳
  6. sbit RW=P2^4;
  7. sbit E=P2^3;

  8. unsigned char lcd0[]="Measuring  Range";
  9. unsigned char lcd1[]=" ERROR ";
  10. unsigned char lcd2[]=" TURE ";
  11. // unsigned char lcd3[]="999";
  12. unsigned char lcd_r_start();         //讀狀態(tài)字函數(shù)
  13. unsigned char i;
  14. unsigned long S=0;
  15. unsigned int  time=0;

  16. void lcd_w_cmd(unsigned char com);   //寫命令字函數(shù)
  17. void lcd_w_dat(unsigned char dat);   //寫數(shù)據(jù)函數(shù)
  18. void lcd_int();                      //LCD初始化函數(shù)
  19. void int_1();
  20. void delay(unsigned int ms);
  21. void delay1();
  22. bit  flag=1;

  23. //函數(shù)功能:LCD初始化       
  24. void lcd_int()
  25. {
  26. lcd_w_cmd(0x38); //設置工作方式
  27. lcd_w_cmd(0x0C); //設置光標
  28. lcd_w_cmd(0x01); //清屏
  29. lcd_w_cmd(0x06); //設置輸入方式
  30. lcd_w_cmd(0x80); //設置初始顯示位置
  31. }
  32. //函數(shù)功能:讀狀態(tài)字
  33. //形式參數(shù):無
  34. //返回值:返回狀態(tài)字,最高位D7=0,LCD控制器空閑;D7=1,LCD控制器忙
  35.         unsigned char lcd_r_start()
  36.         {
  37.          unsigned char s;
  38.          RW=1;            //RW=1,RS=0,讀LCD狀態(tài)
  39.          delay1();
  40.          RS=0;
  41.          delay1();
  42.          E=1;
  43.          delay1();
  44.          P1=s;  //s=P1 從LCD的數(shù)據(jù)口讀狀態(tài)
  45.          delay1();
  46.          E=0;
  47.          delay1();
  48.          RW=0;
  49.          delay1();
  50.          return(s);
  51.          }         
  52. //函數(shù)功能:寫命令字
  53. //形式參數(shù):命令字已存入com單元中
  54. //返回值:無
  55. void lcd_w_cmd(unsigned char com)
  56. {
  57.    unsigned char i;
  58.    do{
  59.          i=lcd_r_start();
  60.          i&=0x80;
  61.          delay(2);
  62.          }
  63.          while(i!=0);
  64.          RW=0;
  65.          delay1();
  66.          RS=0;
  67.          delay1();
  68.          E=1;
  69.          delay1();
  70.          P1=com;
  71.          delay1();
  72.          E=0;
  73.          delay1();
  74.          RW=1;
  75.          delay(255);
  76. }
  77. //函數(shù)功能:寫數(shù)據(jù)
  78. //形式參數(shù):數(shù)據(jù)已存入dat單元中
  79. //返回值:無
  80. void lcd_w_dat(unsigned char dat)
  81.   {
  82.            unsigned char i;
  83.         do{
  84.          i=lcd_r_start();
  85.          i &=0x80;
  86.          delay(2);
  87.          }
  88.         while(i!=0);
  89.          RW=0;
  90.          delay1();
  91.          RS=1;
  92.          delay1();
  93.          E=1;
  94.          delay1();
  95.          P1=dat;
  96.          delay1();
  97.          E=0;
  98.          delay1();
  99.          RW=1;
  100.          delay(255);
  101.   }
  102. /*********************超聲波測距公式*********************/
  103. void Conut(void)
  104. {
  105.         time=TH0*256+TL0;
  106.         TH0=0;
  107.         TL0=0;
  108.         S=(time*1.87)/100;     //算出來是CM
  109.         lcd_w_cmd(0xC0);
  110.         lcd_w_dat(S/100+0x30);//送數(shù)據(jù)百位
  111.         lcd_w_cmd(0xC1);
  112.         lcd_w_dat(S%100/10+0x30);//送數(shù)據(jù)十位
  113.         lcd_w_cmd(0xC2);
  114.         lcd_w_dat(S%100%10+0x30);//送數(shù)據(jù)個位
  115.         if((S>=200)||flag==1)
  116.         {
  117.                 flag=0;       
  118.                 lcd_w_cmd(0xCA);                   //設置顯示位置
  119.             for(i=0;lcd1[i]!='\0';i++)          //顯示字符串,字符串結束符為'\0'
  120.                 {
  121.                 lcd_w_dat(lcd1[i]);}       
  122.         }
  123.         else
  124.         {
  125.                 lcd_w_cmd(0xCA);                   //設置顯示位置
  126.                 for(i=0;lcd2[i]!='\0';i++)          //顯示字符串,字符串結束符為'\0'
  127.                 {
  128.                 lcd_w_dat(lcd2[i]);}       
  129.         }
  130. //     if((S==999)||flag==1)
  131. //         {
  132. //                 flag=0;
  133. //                 lcd_w_cmd(0xC0);                   //設置顯示位置
  134. //             for(i=0;lcd3[i]!='\0';i++)          //顯示字符串,字符串結束符為'\0'
  135. //                 {
  136. //                 lcd_w_dat(lcd3[i]);}       
  137. //         }
  138. }
  139. void zd0() interrupt 1          //T0中斷用來計數(shù)器溢出,超過測距范圍
  140. {
  141.         flag=1;                     //中斷溢出標志
  142. }
  143. void  StartModule()          //T1中斷用來掃描數(shù)碼管和計800MS啟動模塊
  144. {
  145.         TX=1;                     //800MS  啟動一次模塊
  146.         _nop_();
  147.         _nop_();
  148.         _nop_();
  149.         _nop_();
  150.         _nop_();
  151.         _nop_();
  152.         _nop_();
  153.         _nop_();
  154.         _nop_();
  155.         _nop_();
  156.         _nop_();
  157.         _nop_();
  158.         _nop_();
  159.         _nop_();
  160.         _nop_();
  161.         _nop_();
  162.         _nop_();
  163.         _nop_();
  164.         _nop_();
  165.         _nop_();
  166.         _nop_();
  167.         TX=0;
  168. }
  169. void main()
  170. {
  171.         delay(40);
  172.         lcd_int();
  173.         TMOD=0x01;                   //設T0為方式1,GATE=1;
  174.         TH0=0;
  175.         TL0=0;         
  176.         ET0=1;             //允許T0中斷
  177.         EA=1;
  178.         P1=0xff;                           //送全1到P1口       
  179.                  
  180.         lcd_w_cmd(0x80);                   //設置顯示位置
  181.         for(i=0;lcd0[i]!='\0';i++)          //顯示字符串,字符串結束符為'\0'
  182.         {
  183.         lcd_w_dat(lcd0[i]);
  184.         delay1();}       
  185.         lcd_w_cmd(0xc3);
  186.         lcd_w_dat('c');
  187.         lcd_w_cmd(0xc4);
  188.         lcd_w_dat('m');
  189. ……………………

  190. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
超聲波硬件.rar (653.95 KB, 下載次數(shù): 604)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:501901 發(fā)表于 2019-3-31 19:43 | 顯示全部樓層
跪求代碼發(fā)郵箱,57469263@qq.com
回復

使用道具 舉報

ID:472273 發(fā)表于 2019-4-21 21:12 來自手機 | 顯示全部樓層
電路有問題…
回復

使用道具 舉報

ID:582963 發(fā)表于 2019-7-13 15:35 | 顯示全部樓層

我的顯示不出來,你解決了嗎?
回復

使用道具 舉報

ID:378732 發(fā)表于 2019-11-22 17:03 | 顯示全部樓層
S=(time*1.87)/100; 這段是啥意思?不是1.7嗎?
回復

使用道具 舉報

ID:711435 發(fā)表于 2020-3-19 11:17 | 顯示全部樓層
感謝樓主分享,這個可以接入聲光提示電路嗎
回復

使用道具 舉報

ID:711720 發(fā)表于 2020-3-19 19:20 | 顯示全部樓層
跪求代碼發(fā)郵箱,853933066@qq.com
回復

使用道具 舉報

ID:628110 發(fā)表于 2022-4-19 12:46 | 顯示全部樓層
程序注釋有問題,如果不知道延時時間就不要亂寫,看了半小時這個代碼才發(fā)現(xiàn)注釋好多亂寫的,什么800ms什么T1之類的。只初始了一個中斷函數(shù)注釋里居然出現(xiàn)了倆中斷,不看驅動流程都不知道是程序注釋有問題。
回復

使用道具 舉報

ID:195496 發(fā)表于 2023-11-24 08:15 | 顯示全部樓層
呵呵呵,不要太當真,能有個參考的思路,有時候也是很難得的。
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表