找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1928|回復(fù): 0
收起左側(cè)

基于51單片機(jī)控制AJ-SR04M超聲波測(cè)試程序 實(shí)測(cè)版

[復(fù)制鏈接]
ID:1023100 發(fā)表于 2022-5-3 17:04 | 顯示全部樓層 |閱讀模式
該測(cè)試程序經(jīng)過實(shí)際驗(yàn)證,并有實(shí)際數(shù)據(jù)輸出,期間調(diào)試所出現(xiàn)的問題進(jìn)行備注注釋中添加,解決辦法計(jì)算公式都已注明,在程序主函數(shù)中注明;

同時(shí)附錄:
            程序的部分有相應(yīng)詳細(xì)注釋解釋,方便不太理解的朋友觀看;

單片機(jī)源程序如下:
  1. #include<reg51.h>

  2. #include<intrins.h>

  3. typedef unsigned char uint8; //重定義u8

  4. typedef unsigned int uint16; //重定義u16

  5. sbit Trig=P3^3;              //觸發(fā)引腳定義
  6. sbit Echo=P3^2;              //測(cè)量引腳定義
  7. uint16 distance;             //定義全局變量 距離變量
  8. uint16 flag;                 //定義全局變量 標(biāo)志位


  9. /******************************************

  10. 延時(shí)讓Trig引腳產(chǎn)生大于10us的脈沖

  11. ********************************************/
  12. void Delay1ms(uint16 time)                //@11.0592MHz 基于該晶振的1ms延時(shí)計(jì)算
  13. {
  14.         unsigned char i, j,n;
  15.         for(n=0;n<time;n++)
  16.         {
  17.                 _nop_();
  18.                 _nop_();
  19.                 _nop_();
  20.                 i = 11;
  21.                 j = 190;
  22.                 do
  23.                 {
  24.                         while (--j);
  25.                 } while (--i);
  26.         }        
  27. }


  28. void delay(void) //進(jìn)行脈沖輸出延時(shí)時(shí)間
  29. {

  30.         uint8 i;
  31.         for(i=0;i<100;i++); //進(jìn)行空運(yùn)轉(zhuǎn)延時(shí)

  32. }

  33. void Init()
  34. {

  35.                 EA=1;      //開總中斷
  36.                 IT0=0;     //外部中斷0,低電平觸發(fā)
  37.                 TMOD|=0x01;//定時(shí)器0 工作模式1
  38.                 TH0=0;                 //定時(shí)器裝載值清0
  39.                 TL0=0;                 //定時(shí)器裝載值清0
  40.                 TR0=0;     //關(guān)閉定時(shí)器0 特定條件觸發(fā)開啟
  41. }

  42. //串口設(shè)置函數(shù)

  43. void UART_init()
  44. {

  45.                 SCON=0x50;  //使能串口接收,同時(shí)配置相應(yīng)的定時(shí)器
  46.                 TMOD=0x20;
  47.                 TH1=0xFD;   //波特率9600
  48.                 TL1=0xFD;
  49.                 TR1=1;      //開啟定時(shí)器1

  50. }

  51. //發(fā)送一個(gè)字節(jié)函數(shù)

  52. void UART_send_byte(uint8 dat)
  53. {

  54.         SBUF=dat;    //數(shù)據(jù)直接賦值給SBUF
  55.         while(TI==0);//等待發(fā)送中斷硬件置1 發(fā)送完成
  56.         TI=0;        //硬件中斷軟件清0

  57. }

  58. //串口發(fā)送距離函數(shù)
  59. void UART_send_dat(uint16 temp)
  60. {

  61.                 UART_send_byte((temp/10000)%10 + '0'); //發(fā)送距離千位 +‘0’為輸出字符轉(zhuǎn)化
  62.                 UART_send_byte((temp/1000)%10 + '0');  //發(fā)送距離百位 +‘0’為輸出字符轉(zhuǎn)化
  63.                 UART_send_byte((temp/100)%10 + '0');   //發(fā)送距離十位 +‘0’為輸出字符轉(zhuǎn)化
  64.                 UART_send_byte((temp/10)%10 + '0');    //發(fā)送距離個(gè)位 +‘0’為輸出字符轉(zhuǎn)化
  65.                 UART_send_byte('.');                   //發(fā)送小數(shù)點(diǎn)字符
  66.                 UART_send_byte(temp%10 + '0');         //發(fā)送距離小數(shù)點(diǎn)后一位
  67.                 UART_send_byte('c');                   //發(fā)送單位CM 字符C
  68.                 UART_send_byte('m');                   //發(fā)送單位CM 字符M

  69. }

  70. void main()
  71. {

  72.                 UART_init();  //串口初始化
  73.                 Init();              //初始化
  74.                 Trig=0;       //先把引腳拉低

  75.                 while(1)     //進(jìn)入主循環(huán)
  76.                 {

  77.                                 Trig=1; //電平拉高
  78.                                 delay();//產(chǎn)生脈沖延時(shí)
  79.                                 Trig=0; //電平拉低
  80.                                 while(Echo==0);//等待引腳被拉高
  81.                                 TR0=1;//打開定時(shí)器0
  82.                                 EX0=1;//打開外部觸發(fā)中斷
  83.                                 while(flag==0); //等待信號(hào)測(cè)算標(biāo)志位
  84.                                 flag=0; //信號(hào)標(biāo)志位清0
  85.                                 TR0=0;  //關(guān)閉定時(shí)器0
  86.                                 TL0=0;  //定時(shí)器裝載值清0
  87.                                 TH0=0;  //定時(shí)器裝載值清0
  88.                                 UART_send_dat(distance);//向串口發(fā)送測(cè)得的距離值
  89.                                 UART_send_byte('\r');
  90.                                 UART_send_byte('\n');  
  91.                                 //發(fā)送回車換行
  92.                                 Delay1ms(10); //方便觀察,延時(shí)一定時(shí)間,進(jìn)行距離測(cè)算

  93.                 }
  94.                
  95. //                1.型號(hào)是
  96. //                        AJ-SR04M 收發(fā)一體化 倒車?yán)走_(dá)防水型超聲波傳感器測(cè)距模塊 K02
  97. //                        模塊版本是:新版本
  98. //                        模塊背面信息為:RCWL-1655
  99. //                        模塊正面絲印為R7
  100. //                        NC      默認(rèn)模式下兼容HCSR04 雙探頭超聲波測(cè)距模塊


  101. //                2.測(cè)試 代碼:
  102. //                (1)當(dāng)R7為NC 默認(rèn)不焊接 懸空時(shí),該例程代碼測(cè)試代碼輸出正常;
  103. //                                此程序?yàn)镻32為Echo - P33為Trig 進(jìn)行脈沖發(fā)送測(cè)距
  104. //                        a.實(shí)際數(shù)據(jù)反饋結(jié)果可行,測(cè)量范圍>=20cm (注意測(cè)量量程)
  105. //                        b.當(dāng)小于20cm時(shí) 距離為不可靠   (很多朋友這里不注意)
  106. //                                實(shí)際測(cè)試距離:0063.6cm
  107. //                                實(shí)際測(cè)試距離:0063.6cm(未加濾波處理或者其他算法處理)

  108. //                (2)當(dāng)R7位10K時(shí) 位串口9600 停止位1 數(shù)據(jù)位8 無奇偶校驗(yàn)
  109. //                        a.串口助手可實(shí)際發(fā)送0XA0 (切記是16機(jī)制發(fā)送)
  110. //                                數(shù)據(jù)返回 03 06 CE
  111. //                        距離計(jì)算方式為:((0x03<<16)+(0x06<<8)+0xce)/1000  MM
  112. //               

  113. }

  114. void EXIT_interrupt() interrupt 0        //外部中斷函數(shù)地址入口
  115. {

  116.                 distance=(256*TH0+TL0)*0.184;//測(cè)得最小精度位mm(晶振為11059200Hz)
  117.                 flag=1;                      //標(biāo)志位置1,表明距離測(cè)算完成
  118.                 EX0=0;                       //關(guān)閉外部中斷

  119. }
復(fù)制代碼


程序注釋截圖

程序注釋截圖

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表