caijie001 发表于 2017-2-1 11:40

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

本帖最后由 caijie001 于 2017-2-1 11:47 编辑

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

下载请回复下,祝大家身体健康学习进步,么么哒

主函数部分
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;                                                         //中断溢出标志
}
/********************************************************/
   voidzd3()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");
//               
//         }

caijie001 发表于 2017-2-1 11:42

代码

robter 发表于 2017-2-1 16:07

很好的资料,测距距离是多少?

joy07wang 发表于 2017-2-2 08:07

感谢分享

caijie001 发表于 2017-2-2 11:55

robter 发表于 2017-2-1 16:07
很好的资料,测距距离是多少?

4m左右

Kowalski 发表于 2017-2-2 13:34

感谢楼主分享~~~

zhoukaiyue 发表于 2017-2-13 21:04

感谢楼主分享

噻箩箩箩哩噻 发表于 2017-5-4 16:25

不错的代码!感谢楼主!

xumch 发表于 2017-5-6 23:33

感谢

hzyee 发表于 2021-2-24 11:50

楼主分享的资源已被取消···可否重发 邮箱452330550@qq.com
页: [1]
查看完整版本: 基于60s2的超声波测距系统/倒车测距系统