找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2127|回复: 5
收起左侧

STC15L408AD单片机超声波测距OLED显示 源程序

[复制链接]
ID:1011792 发表于 2022-3-29 12:08 | 显示全部楼层 |阅读模式
一个星期做的设计,没加温补,感兴趣的可以自己加上,亲自测试过,没任何问题,附件里有原理图代码

制作出来的实物图如下:
IMG_20220329_114241.jpg

电路原理图如下:

原理图

原理图


单片机源程序如下:

  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, 下载次数: 69)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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有关系吗?程序能烧录进去,不知是什么原因
回复

使用道具 举报

ID:143767 发表于 2022-4-3 18:19 | 显示全部楼层
不好意思,现正常了,是我把信号接到P1口了,谢谢
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表