OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 1124|回复: 2

基于60s2的超声波测距系统/倒车测距系统

[复制链接]

  离线 

10

主题

69

帖子

0

精华

高级会员

Rank: 4

积分
736
金钱
736
注册时间
2017-1-17
在线时间
31 小时
发表于 2017-1-31 23:46:35 | 显示全部楼层 |阅读模式
正点原子公众号
本帖最后由 caijie0513 于 2017-2-1 11:51 编辑

在学校做的超声波测距,刚刚接触一年的51,起码得做点什么东西出来,所以自行设计了超声波测距系统/倒车系统测距系统,也来分享一下给大家,本系统以STC12C5A60S2作为核心板,以某宝上买的超声波模块作为检测模块,以oled屏幕作为显示文字、数字、英文、等等、用有源蜂鸣器作为报警器,红色直插LED顺便作为提示,兼容5——12V供电,引出io口,方便以后当做最小系统使用,方便兼容多个其他模块,(自行脑补)。。。。带复位,下载口,,正常工作时候oled显示:“xxx超声波测距,距离xxxCM”,蜂鸣器不响,绿色LED亮,红色灭,当距离小于xxxCM时,蜂鸣器象棋警报,红色LED亮起,绿色灭,大致就是这样。系统为本人亲自制作,单层板,上图。还有pcb,原理图等,代码等;代码有点乱,提供一部分看看,源代码在附件--------杰杰制作。



下载请回复下,祝大家身体健康学习进步,么么哒
[AppleScript] 纯文本查看 复制代码
主函数部分
void main()
{
        
  gg=0;
        UartInit();
        OLED_Init();
        TMOD=0x11;                   //设T0为方式1,GATE=1;
        TH0=0;
        TL0=0;          
        TH1=0xf8;                   //2MS定时
        TL1=0x30;
        ET0=1;             //允许T0中断
        ET1=1;                           //允许T1中断
        TR1=1;                           //开启定时器
        EA=1;                           //开启总中断

        while(1)
        {
         while(!RX);                //当RX为零时等待
         TR0=1;                            //开启计数
         while(RX);                        //当RX为1计数并等待
         TR0=0;                                //关闭计数
   Conut();
   display();                //计算
        }

}
 void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
/********************************************************/
   void  zd3()  interrupt 3                  //T1中断用来扫描数码管和计800MS启动模块
  {
         TH1=0xf8;
         TL1=0x30;
//        display();
         timer++;
         if(timer>=400)
         {
          timer=0;
          TX=1;            
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_();
          _nop_(); 
          _nop_(); 
          _nop_(); 
          _nop_();
                _nop_(); 
          _nop_(); 
        _nop_(); 
          _nop_();
                        _nop_(); 
          _nop_();

          TX=0;
         } 
  }

/*****************************************************************************
 函 数 名  : LED_Init
 功能描述  : OLED初始化
 输入参数  : VOID  
 输出参数  : NONE
 返 回 值  : NONE
 备    注  :详细请参考0.96inch_LDR128064B2B201 9.5 Recommanded Software Initialization
*****************************************************************************/
void OLED_Init(void)        
{
    unsigned char i;

    SCL_OLED = 1;      
    RST = 0;
    for(i = 0; i < 100; i++)
        {
                ;                      //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕    
    }      
    RST = 1;

    SetDisplayOnOff(0);        // 关显示 (0:关显示/1:开显示)
    SetDisplayClock(0x80);     // 设置时钟为100Frames/Sec ,0x80为缺省值
    SetMultiplexRatio(0x3F);   // 1/64 Duty (0x0F~0x3F)
    SetDisplayOffset(0x00);    // 垂直显示无偏移 (0x00~0x3F)
    SetStartLine(0x00);        // 设置映射内容显示的起始行(0x00~0x3F)
    SetChargePump(1);          // 使能内部DC/DC转换(0x00/0x04)
    SetAddressMode(0x02);      // 设置为页地址模式 (0x00/0x01/0x02)
    SetSegmentRemap(0x01);     // Segment重映射;  0x00左右反置 0x01正常
    SetCommonRemap(0x01);      // 设置COM扫描方向  0x00上下反置 0x08正常
    SetCommonConfig(0x10);     // 设置com序列的配置 (0x00/0x10)
    SetContrast(0x7F);         // 设置对比度
    SetPrechargePeriod(0xF1);  // 设置预充电周期为15个时钟,放电周期为1个时钟周期
    SetVCOMH(0x40);            // 设置COM端电平等级
    SetEntireDisplay(0);       // 正常显示(0:正常显示/1:忽略显示)
    SetInverseDisplay(0);      // 反白设置 (0:正常显示/1:反白显示)  
    SetDisplayOnOff(1);        // 开显示 (0:关显示/1:开显示)
    FillScreen(0x00);            // 初始清屏,填充空白
///    SetPos(0,0);                   //并将位置设置在0页,0列

} 
 


/*oled显示*/
void display()
{
        
        WriteChinese16x16(0,0,"杰杰号超声波测距");
   PrintNum_8x16(2,60,qian);
         PrintNum_8x16(2,70,bai);
         PrintNum_8x16(2,80,shi);
//         PrintNum_8x16(2,90,ge);
        WriteMixStrXx16(2,10,"距离:");
        WriteMixStrXx16(2,97,"CM");
        bee=1;
  d1=0;
        d2=1;
if(S<5)
{
        delay(5);
        if(S<5)
{
        d1=1;
        bee=0;//蜂鸣器暴警红灯亮
        d2=0;
}
}
//if(S>50)
//{
//        bee=1;
//  d1=0;
//        d2=1;
//}
//        if((S>700)||flag==1) //超出测量范围显示“-”
//         {        
//                flag=0;
//          bee=0;
//         WriteMixStrXx16(2,60,"xxxx");
//                 
//         }




捕获.PNG
捕获1.PNG
捕获3.PNG
捕获4.PNG

代码.zip

111.84 KB, 下载次数: 245

原理图.zip

16.51 MB, 下载次数: 999

看帖回复是一种美德
http://openedv.com/?fromuser=caijie0513
回复

使用道具 举报

  离线 

31

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2016-12-31
在线时间
60 小时
发表于 2017-3-12 13:49:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

  离线 

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2017-2-27
在线时间
26 小时
发表于 2017-5-10 11:02:09 来自手机 | 显示全部楼层
距离多远?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-18 16:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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