找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3473|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

STC15L408AD單片機超聲波測距OLED顯示 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1011792 發(fā)表于 2022-3-29 12:08 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一個星期做的設(shè)計,沒加溫補,感興趣的可以自己加上,親自測試過,沒任何問題,附件里有原理圖代碼

制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:

  1. /*************************************************
  2. *STC15單片機超聲波測距數(shù)碼管顯示:
  3. *定時器0用于測量時間
  4. *定時器2用于數(shù)碼管掃描
  5. *
  6. *模塊工作原理:
  7. *1、采用(I0觸發(fā)測距、給至少10us的高電平信號)
  8. *2、模塊自動發(fā)送8個40khz的方波、自動檢測是否有信號返回
  9. *3、有信號返回、通過I0輸出一高電平、高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間、
  10. *        測試距離=(高電平時間*聲速(340M/s)/2)
  11. *
  12. *
  13. *
  14. *
  15. */


  16. #include <stc15.h>
  17. #include <intrins.h>
  18. #include "oled.h"

  19. #define  SETDISTANCE  10   //設(shè)置報警值,低于此值,蜂鳴器報警


  20. int count = 0,count1=0;


  21. sbit  BEEP = P3^4;                         //蜂鳴器接口
  22. sbit  ECHO = P0^0;           //ECHO
  23. sbit  TRIG = P0^1;           //Trig


  24. unsigned int  time=0;               //用于定時時間
  25. unsigned int  time0=0;              //用于定時器計數(shù)
  26. unsigned long S=0;                  //存放計算出來的距離


  27. bit flag =0;                        //定時器0溢出標志位
  28. //bit Beepflag =0;


  29. /* 函數(shù)聲明 */
  30. void Display(void);
  31. void Conut(void);
  32. void Start_modle(void);
  33. //void delay_ms(int);


  34. void Timer0Init(void)                //定時器0初始化
  35. {
  36.         TMOD=0x01;                   //設(shè)定定時器模式  
  37.         TH0=0X00;       //定時器0初值為0
  38.         TL0=0X00;         
  39.         ET0=1;          //開啟定時器0中斷
  40.         TR0=0;                            //先不開啟定時器0
  41.         EA=1;                           //開總中斷
  42. }

  43. void Timer2Init(void)                //定時器2初始化
  44. {
  45.         AUXR &= 0xFB;                 //定時器時鐘為12T模式
  46.                
  47.         T2L = 0XCD;                  //設(shè)定定時器初值  2Ms
  48.         T2H = 0XF8;               
  49.         AUXR |= 0x10;                //開啟定時2中斷
  50.         IE2 =0X04;                        //啟動定時器2
  51. }


  52. /*************主函數(shù)*******************************************/
  53. void  main(  void  )
  54. {  
  55.                 OLED_Init();                        //初始化OLED  
  56. //                 OLED_On();
  57. //                 delay_ms(800);
  58.                 OLED_Clear();
  59.                  OLED_ShowCHinese(20,2,0);//
  60.                 OLED_ShowCHinese(38,2,1);//
  61.                 OLED_ShowString(56,2,"1901",16);//1901       
  62.                 OLED_ShowCHinese(20,4,2);//姓
  63.                 OLED_ShowCHinese(38,4,3);//名
  64.                 OLED_ShowString(56,4,":",16);//:
  65.                 OLED_ShowCHinese(66,4,4);//
  66.                 OLED_ShowCHinese(82,4,5);//                 
  67.                 delay_ms(800);                //清屏?xí)r間
  68.                 OLED_Clear();  
  69.         Timer0Init();
  70.         Timer2Init();
  71.         while(1)
  72.         {
  73.          Start_modle();
  74.          while(!ECHO);                //當ECHO為零時等待
  75.          TR0=1;                            //開啟計數(shù)
  76.          while(ECHO==1);//&&(flag==0));                //當ECHO為1計數(shù)并等待
  77.          TR0=0;                                //關(guān)閉計數(shù)
  78.    Conut();                        //計算       
  79.         }
  80. }

  81. /**********************啟動模塊*********************************/              
  82. void Start_modle(void)
  83. {
  84.                         TRIG = 1;              //拉高TRIG                  
  85.                         _nop_();       //延時10us以上
  86.                         _nop_();
  87.                         _nop_();
  88.                         _nop_();
  89.                         _nop_();
  90.                         _nop_();
  91.                         _nop_();
  92.                         _nop_();
  93.                         _nop_();
  94.                         _nop_();
  95.                         _nop_();
  96.                         _nop_();
  97.                         _nop_();
  98.                         _nop_();
  99.                         _nop_();
  100.                         TRIG = 0;                //拉低TRIG   
  101. }
  102.    
  103. /**********************計算距離方法*******************************/
  104. void Conut(void)
  105. {
  106.         unsigned char a,b,c;
  107.          time=TH0*256+TL0;              //計算高電平時間
  108.          TH0=0;                         //復(fù)位定時器0的數(shù)值
  109.          TL0=0;
  110.        
  111.          OLED_ShowCHinese(0,4,6);//距
  112.          OLED_ShowCHinese(16,4,7);//離
  113.    OLED_ShowString(32,4,":",16);//:
  114.        
  115.         OLED_ShowCHinese(0,2,8);//超
  116.         OLED_ShowCHinese(16,2,9);//聲
  117.         OLED_ShowCHinese(32,2,10);//波
  118.         OLED_ShowCHinese(48,2,11);//測
  119.         OLED_ShowCHinese(64,2,12);//距
  120.        
  121.          S=(time*1.7)/100;     //換算成M          
  122.          if((S>=400)||flag==1) //如果測量超時
  123.          {         
  124.           flag=0;
  125.                  OLED_ShowString(42,4,"-",16);
  126.                  OLED_ShowString(52,4,"-",16);
  127.                  OLED_ShowString(62,4,"-",16);
  128.                  OLED_ShowString(72,4,"-",16);
  129.          }
  130.          else
  131.          {         
  132.                          a=S%1000/100;         
  133.                         b=S%1000%100/10;      
  134.                         c=S%1000%10 %10;     
  135.                 OLED_ShowNum(42,4,a,1,16);
  136.                 OLED_ShowString(52,4,".",16);                 
  137.                 OLED_ShowNum(62,4,b,1,16);       
  138.           OLED_ShowNum(72,4,c,1,16);
  139.                 OLED_ShowString(82,4,"M/S",16);
  140.          }
  141. }
  142.    
  143. /********************* 定時器0中斷函數(shù)***********************************/
  144. void Timer0Interrupt(void) interrupt 1                
  145. {
  146.         flag = 1;
  147. }
  148.   /**************定時器2中斷函數(shù)*****************/
  149. void Timer2Interrupt(void) interrupt 12
  150. {
  151.          time0++;               //用于定時時間
  152.          count++;
  153.         if(count >=100)
  154.         {
  155.                 count = 0;
  156.                 if(S<SETDISTANCE)    //判斷距離是否小于設(shè)定值
  157.                 {
  158.                   BEEP  = ~BEEP ;
  159.                 }
  160.                 else                  
  161.                         BEEP = 1;
  162.         }
  163.          if(time0>=400)                 //每800ms啟動一次
  164.          {
  165.                  time0=0;
  166.                  Start_modle();
  167.          }       
  168. }
復(fù)制代碼

Keil代碼下載:
STC15超聲波測距OLED顯示.7z (54.15 KB, 下載次數(shù): 71)



評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:102963 發(fā)表于 2022-3-30 10:05 | 只看該作者
M/S不是速度單位嗎,怎么成了距離了?
回復(fù)

使用道具 舉報

板凳
ID:1011792 發(fā)表于 2022-4-2 17:20 | 只看該作者
songxia8013 發(fā)表于 2022-3-30 10:05
M/S不是速度單位嗎,怎么成了距離了?

確實是,OLED_ShowString(82,4,"M/S",16); 這個函數(shù)改成CM就好了
回復(fù)

使用道具 舉報

地板
ID:143767 發(fā)表于 2022-4-3 17:54 | 只看該作者
你好樓主,這個我按照你的原理圖接線,并把你編譯好的HE文件燒錄進去,OLED屏幕沒有任何反應(yīng),跟我用STC89C52RC有關(guān)系嗎?程序能燒錄進去,不知是什么原因
回復(fù)

使用道具 舉報

5#
ID:143767 發(fā)表于 2022-4-3 18:19 | 只看該作者
不好意思,現(xiàn)正常了,是我把信號接到P1口了,謝謝
回復(fù)

使用道具 舉報

6#
ID:356957 發(fā)表于 2022-4-4 21:15 來自觸屏版 | 只看該作者
確實是,OLED_ShowString(82,4,"M/S",16); 這個函數(shù)改成CM就好了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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