基于cc2530超声波测距报警系统

基于cc2530超声波测距报警系统

1. 关于超声波传感器
简介:超声波传感器是将超声波信号转换成其他能量信号的传感器。超声波是振动频率高于20kHz的机械波超声波测距主要应用于一些工业现场的位置监控、移动机器人的自动避障行走、汽车倒车、建筑施工工地,可在潮湿高温。多尘等恶劣环境下工作。例如:液位、厚度、管道长度等场合。
技术特点:超声波具有指向性强、能量消耗缓慢且在介质中传播的距离较远的优点,因而经常用于距离的测量。相比于其它定位技术而言,超声波定位技术成本低、精度高、操作简单、工作稳定可靠,非常适合于短距离测量定位。cc2530单片机为许多控制提供了高度灵活和低成本的解决办法。

2 系统分析与设计
2.1 需求分析
2.1.1 系统概要
基于cc2530单片机超声波传感器测距报警系统利用人耳听不到的超声波(20000Hz以上)来作为探测源进行探测的设备称为超声波探测器,一般用于探测移动物体。超声波探测器的工作原理是利用超声波发射, 通过被测物体的反射、回波接收后的时差来测量被测距离的,当单片机接收到传感器测量的距离,通过双机通信把所测量的距离传到另一块单片机,通过另一块单片机根据不同的测距距离来驱动调光灯模块的灯光闪烁情况,来实现简单的基于超声波传感器测距的警报系统(也可使用蜂鸣器等其他硬件来实现报警应答。
2.1.2 系统简易流程图
2.1.2简易流程图

在这里插入图片描述
3 系统实现
3.1 硬件系统
超声波测距系统:
基于单片机的超声波测距系统,是利用单片机编程产生的高频率方波,经过发射驱动电路放大,使超声波传感器发射端震荡,发射超声波。超声波经过反射回来后,由传感器接收,再经接收电路放大、整形,控制单片机中断口。其系统框图3.1.1所示。

在这里插入图片描述
图3.1.1超声波测距系统框图
基本工作原理: (1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; 本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值(图3.1.2传感器原理图)
在这里插入图片描述
图3.1.2超声波传感器原理图
单片机为核心的超声波测距系统通过单片机记录超声波发射的时间和收到反射波的时间。当收到超声波的反射波时,接收电路输出端产生一个负跳变,在单片机的外部中断源输入口产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离

双机通讯系统:
通过杜邦线连接把两个实验板连接起来,把控制超声波的传感器的实验板的发送端口TXD与控制调光灯传感器的实验板接受端口RXD通过杜邦线连接起来组成简单的双机通信系统同步通信中,所有设备使用同一个时钟,以数据块为单位传送数据,每个数据块包括同步字符、数据块和校验字符。同步字符位于数据块的开头,用于确认数据字符的开始;接收时,接收设备连续不断地对传输线采样(如图3.1.4所示)说明本系统的双机通讯时是单向通讯在这里插入图片描述

                    图3.1.4双机通讯原理图

报警提示系统:
本警报提示模块用调光灯的灯光闪烁状态来代替警报提示,对于cc2530而言,其I/O口可配置为输入或是输出,其控制寄存器为:PxDIR,设置其对应位为0则为输入,置位则为1,芯片复位时初始化为输入状态。为了控制LED,需要将其设置为输出引脚在分析电路图知道,当输出口为高电平时,灯不亮;当输出口为低电平时,灯会亮,那么在初始化时只要控制输出口的电平就可以控制调光灯的状态
在这里插入图片描述
图3.1.5调光灯原理图
3.2 软件设计
配置超声波传感器关键代码说明:
设置窗口发送函数,字符型窗口发送函数UartTX_Send_String数字型窗口发送函数UartTX_Send_Data,由于本次使用的是双机通讯,只需要用到数字窗口发送函数,把超声波的数据存放于 U0DBUF寄存器(U0DBUF = Data);设置定时器中断函数__interrupt void Timer1,这里设置成48us发生一次中断,用参数counter来记录定时器1发生中断的次数,然后根据超声波传感器的工作原理:distance = (distance48/1000000340/2*100);来计算出超声波所测到的距离,并通过data=distance语句把distance的值赋予data,然后通过UartTX_Send_Data函数发送数据。
配置双机通讯关键代码说明:
在cc2530开发板由于要实现双机通讯,所以要两块cc2530要保持相同的晶振频率CLKCONCMD &= ~0x40;选择32M晶振,CLKCONCMD = 0xb8TICHSPD 128分频,CLKSPD 不分频,用U0GCR |= 10; U0BAUD |= 216;将波特率设为57600,设置串口中断函数__interrupt void uart0,并通过uart_buffer = U0DBUF语句来接受寄存器的数据。
配置调光灯状态关键代码说明:
通过语句P0DIR |= (0x01 << 0) | (0x01 << 4);来设置设置P0.0为输出方式;P0.4方式,T1IE=0关闭定时器时调光灯调光灯呈现最亮状态,T1IE=1开启定时器时调光灯呈现微亮状态;当P0_4= 0开启调光灯,当P0_4= 1关闭调光灯

#include "ioCC2530.h"     
#define uint8 unsigned char
unsigned char counter;
unsigned char buf[3];
float distance;
uint8 data;
void SendASignal(void)
{
  unsigned char i;
  P1 &= ~(1<<0);
  P1 |= (1<<0);  
  for(i=0;i<33;i++){
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
  }
  P1 &= ~(1<<0);
} 
void delay(void)
{
  unsigned int i;
  unsigned char j;

  for(i=0;i<5000;i++)
  {
    for(j=0;j<200;j++)
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }
  }
} 
void UartTX_Send_String(unsigned char *Data,int len)   //串口发送函数
{
    int j;
    for(j=0;j<len;j++)
    {
    	U0DBUF = *Data++;   
    	while(UTX0IF == 0);
    	UTX0IF = 0;
    }
}

void UartTX_Send_Data(unsigned char Data,int len)   //串口发送函数
{
    int j;
    for(j=0;j<len;j++)
    {
    	U0DBUF = Data;   
    	while(UTX0IF == 0);
    	UTX0IF = 0;
    }
}
#pragma vector=URX0_VECTOR   //uart0中断函数
__interrupt void uart0(void){
    URX0IF = 0; //清中断标志
}

#pragma vector=T1_VECTOR   //定时器1中断函数 50us
__interrupt void Timer1(void){
    counter++;
    //P0_0=~P0_0;
}

void main( void )
{
  P0DIR |= 0x01;  //设置P0.0为输出方式
  P2DIR |= 0x01;  //设置P2.0为输出方式
  P1SEL &= ~((1<<0)|(1<<1));//P1.0,P1.1为GPIO        
  P1DIR |= ((1<<0));        //P10为OUTPUT
  P1DIR &= ~(1<<1);         //P11为INPUT
  P1 &= ~(1<<0);

  P0_0 = 1; 
  P2_0 = 1;                    //熄灭LED
  counter = 0;
  CLKCONCMD &= ~0x40;          //选择32M晶振
  while(!(SLEEPSTA & 0x40));   //等待XSOC稳定
  CLKCONCMD = 0xb8;            //TICHSPD 128分频,CLKSPD 不分频
  SLEEPCMD |= 0x04;            //关闭不用的RC 振荡器
  T1CC0L = 6;
  T1CC0H = 0x00;               //比较值
  T1CTL = 0x33;                //通道0,不分频,up/down模式
  PERCFG = 0x00;               //位置1 P0 口
  P0SEL = 0x3c;                //P0 用作串口
  U0CSR |= 0x80;               //UART 方式
  U0GCR |= 10;                 //baud_e = 10;
  U0BAUD |= 216;               //波特率设为57600
  UTX0IF = 1;
  U0CSR |= 0X40;               //允许接收
  IEN0 |= 0x84;                //开总中断,接收中断   
  EA = 1;                      //开总中断
  T1IE = 1;                    //开定时器T1中断
  
  while(1){        
    P2_0=~P2_0;
    SendASignal();
    while(1){
      if(P1_1==1) break;
    }
    counter = 0;
    
    while(1){
      if(P1_1==0) break;
    }
    distance = counter;
    distance = (distance*48/1000000*340/2*100);
    counter = (unsigned int)distance;
    data=distance;
   
     if(data>30){
        UartTX_Send_Data('h',2);
	delay();
        }else{
          if(data>10&&data<30){
        UartTX_Send_Data('n',2);
	delay();}else{
           UartTX_Send_Data('l',2);
        }
        
        }
  }} // end of main()

#include "ioCC2530.h"     

unsigned int counter;
char uart_buffer;



void delay(void)
{
  unsigned int i;
  unsigned char j;

  for(i=0;i<1500;i++)
  {
    for(j=0;j<200;j++)
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }
  }
} 




#pragma vector=URX0_VECTOR   //uart0中断函数
  __interrupt void uart0(void){
     P2_0 = 0;
      URX0IF = 0; //清中断标志
  
      uart_buffer = U0DBUF;
      //UartTX_Send_Data('h',10);
  }

void main( void )
{
  P0DIR |= (0x01 << 0) | (0x01 << 4);  //设置P0.0为输出方式;P0.4输出方式
  P2DIR |= 0x01;  //设置P2.0为输出方式
  P0_4 = 1;       //熄灭
  P0_0 = 1; 
  P2_0 = 1;       
  counter = 0;
  
  CLKCONCMD &= ~0x40;          //选择32M晶振
  while(!(SLEEPSTA & 0x40));   //等待XOSC稳定
  CLKCONCMD = 0xb8;            //TICHSPD 128分频,CLKSPD 不分频
  SLEEPCMD |= 0x04;            //关闭不用的RC 振荡器
  
  T1CC0L = 0x00;   
  T1CC0H = 0x02;              //比较值
  T1CTL = 0x33;               //通道0,不分频,up/down模式
   PERCFG = 0x00;               //位置1 P0 口
 //   P0SEL = 0x3c;                //P0 用作串口
  U0CSR |= 0x80;              //UART 方式
  U0GCR |= 10;                //baud_e = 10;
  U0BAUD |= 216;              //波特率设为57600
  UTX0IF = 1;
  U0CSR |= 0X40;              //允许接收
  IEN0 |= 0x84;                //开总中断,接收中断  
  EA = 1;                     //开总中断
 
  while(1){
   
    if( uart_buffer=='l'){
      P0_4= 0;
      delay();
      P0_4= 1;
      delay();
      P0_4= 0;
  }
  if( uart_buffer=='n'){
     P0_4= 0;
     delay(); delay();
    }
    else {
      P0_4= 1;
      delay(); delay();
 }
  
} 
}
  

效果我用简单的流程图表示:
(10cm-20cm应改为10-30cm)
在这里插入图片描述
***本文章为我这个物联网小白所写,有错误的地方请各位大神多多指正
最近有太多同学私信问我拿这篇博客的源码啦,太多人问我很容易漏发给同学们,所以我把源码放在我的资源里啦有兴趣的同学可以花点积分下载哦(没有积分的可以去某宝搜csdn下载 doge)实在没有积分可以多次私信我,下载链接:https://download.csdn.net/download/weiweiweiIT/19759732

  • 21
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 81
    评论
下面是一个基于CC2530和L9110模块的超声波测距项目源码示例: ```c #include <ioCC2530.h> // 定义GPIO口控制L9110模块 #define IN1 P1_0 #define IN2 P1_1 #define OUT1 P1_2 #define OUT2 P1_3 // 定义超声波测距模块的GPIO口 #define TRIG P0_0 #define ECHO P0_1 // 定义常量 #define SPEED_OF_SOUND 340 // 声速 #define MAX_DISTANCE 4000 // 最大测距距离,单位为毫米 #define TIMEOUT 60000 // 超时时间,单位为微秒 // 延时函数,用于控制电机转动的时间 void delay(unsigned int t) { unsigned int i, j; for(i=0; i<t; i++) { for(j=0; j<100; j++) { // do nothing } } } // 初始化L9110模块的GPIO口 void initL9110() { IN1 = 0; IN2 = 0; OUT1 = 0; OUT2 = 0; } // 控制电机前进 void forward() { IN1 = 1; IN2 = 0; OUT1 = 1; OUT2 = 0; } // 控制电机后退 void backward() { IN1 = 0; IN2 = 1; OUT1 = 0; OUT2 = 1; } // 控制电机停止 void stop() { IN1 = 0; IN2 = 0; OUT1 = 0; OUT2 = 0; } // 初始化超声波测距模块的GPIO口 void initUltrasonic() { TRIG = 0; ECHO = 0; } // 发送超声波脉冲 void sendPulse() { TRIG = 1; // 将TRIG置为高电平 delay(10); // 延时10微秒 TRIG = 0; // 将TRIG置为低电平 } // 接收超声波回波并计算距离 unsigned int getDistance() { unsigned int distance; unsigned int timeout; unsigned int time; // 发送超声波脉冲 sendPulse(); // 等待ECHO口变为高电平 timeout = 0; while(!ECHO && timeout < TIMEOUT) { timeout++; } // 记录开始时间 time = 0; if(timeout < TIMEOUT) { while(ECHO && time < TIMEOUT) { time++; } // 计算距离 if(time < TIMEOUT) { distance = time * SPEED_OF_SOUND / 2; } else { distance = MAX_DISTANCE; } } else { distance = MAX_DISTANCE; } return distance; } // 主函数 void main() { unsigned int distance; initL9110(); initUltrasonic(); while(1) { distance = getDistance(); // 根据距离控制电机前进、后退或停止 if(distance > 2000) { forward(); } else if(distance > 1000) { stop(); } else { backward(); } // 延时一段时间 delay(100); } } ``` 这个程序会不断地测量超声波测距模块到障碍物的距离,并根据距离控制L9110模块的电机前进、后退或停止。需要注意的是,这个程序只是一个示例,具体实现方式可能会因为硬件差异等原因而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 81
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值