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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
一個星期做的設計,沒加溫補,感興趣的可以自己加上,親自測試過,沒任何問題,附件里有原理圖代碼

制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:

  1. /*************************************************
  2. *STC15單片機超聲波測距數碼管顯示:
  3. *定時器0用于測量時間
  4. *定時器2用于數碼管掃描
  5. *
  6. *模塊工作原理:
  7. *1、采用(I0觸發測距、給至少10us的高電平信號)
  8. *2、模塊自動發送8個40khz的方波、自動檢測是否有信號返回
  9. *3、有信號返回、通過I0輸出一高電平、高電平持續的時間就是超聲波從發射到返回的時間、
  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   //設置報警值,低于此值,蜂鳴器報警


  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;              //用于定時器計數
  26. unsigned long S=0;                  //存放計算出來的距離


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


  29. /* 函數聲明 */
  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;                   //設定定時器模式  
  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;                  //設定定時器初值  2Ms
  48.         T2H = 0XF8;               
  49.         AUXR |= 0x10;                //開啟定時2中斷
  50.         IE2 =0X04;                        //啟動定時器2
  51. }


  52. /*************主函數*******************************************/
  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);                //清屏時間
  68.                 OLED_Clear();  
  69.         Timer0Init();
  70.         Timer2Init();
  71.         while(1)
  72.         {
  73.          Start_modle();
  74.          while(!ECHO);                //當ECHO為零時等待
  75.          TR0=1;                            //開啟計數
  76.          while(ECHO==1);//&&(flag==0));                //當ECHO為1計數并等待
  77.          TR0=0;                                //關閉計數
  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;                         //復位定時器0的數值
  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中斷函數***********************************/
  144. void Timer0Interrupt(void) interrupt 1                
  145. {
  146.         flag = 1;
  147. }
  148.   /**************定時器2中斷函數*****************/
  149. void Timer2Interrupt(void) interrupt 12
  150. {
  151.          time0++;               //用于定時時間
  152.          count++;
  153.         if(count >=100)
  154.         {
  155.                 count = 0;
  156.                 if(S<SETDISTANCE)    //判斷距離是否小于設定值
  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. }
復制代碼

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



評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品性做久久久久久 | 欧美高清一级片 | 日本久草 | 中文字幕一区在线 | 国产免费视频 | 在线中文一区 | 亚洲精品福利视频 | 国产欧美一区二区精品忘忧草 | 精品国产女人 | 久久久久久91香蕉国产 | 亚洲一区二区三区桃乃木香奈 | 夜夜操操操| 黄视频国产 | 91视视频在线观看入口直接观看 | 国产精品国产 | 日本免费在线观看视频 | 国产精品综合网 | 高清久久久 | 亚洲综合色网 | 99久久久久国产精品免费 | 亚洲黄色网址视频 | 久草免费在线视频 | 天天综合成人网 | 欧美三级视频 | 欧美不卡一区二区三区 | 色婷婷久久久亚洲一区二区三区 | 一级片免费在线观看 | 免费特黄视频 | 国产精品视频yy9299一区 | 剑来高清在线观看 | 69xxx免费| 国产精品久久久久久久久久久久久久 | 国产精品视频网站 | 欧美一区二区三区视频在线 | 国产中文字幕在线 | 91视频进入 | 久久精品国产免费看久久精品 | 91久久国产综合久久91精品网站 | 黄页网址在线观看 | 一区二区免费在线观看 | 一级毛片播放 |