超声波

实验目的
1.了解超声波传感器的工作原理和数据采集;
2.掌握使用CC 2530 IO口控制超声波传感器的采集、显示和编程实现;
3.进一步熟悉IAR的使用;
实验需求
安装IAR和相关驱动的个人PC1台
迷你USB线mini USB1根
仿真器CC Debugger1根
串并转换线USB to UART1根
ZigBee通用节点板1块
实验原理
超声波传感器是利用超声波的特性研制而成的传感器。超声波是一种振动频率高于声波的机械波,由换能晶片在电压的激励下发生振动产生的,它具有频率高、波长短、绕射现象 小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中,它可穿透几十米的深度。超声波碰到杂质或分界面会产 生显著反射形成反射回波,碰到活动物体能产生多普勒效应。因此超声波检测广泛应用在工业、国防、生物医学等方面。以超声波作为检测手段,必须产生超声波和接收超声波。完成 这种功能的装置就是超声波传感器,习惯上称为超声换能器,或者超声探头
超声波传感器可以广泛应用在物位(液位)监测,机器人防撞,各种超声波接近开关,以及防盗报警等相关领域,工作可靠,安装方便,防水型,发射夹角较小,灵敏度高,方便 与工业显示仪表连接,也提供发射夹角较大的探头。
本实验采用S906超声波传感器。当CC2530的 P1.0 输出低电平时,超声波传感器的 Trig 端为高电平,超声波传感器发出声波信号。当接收到回声时,Echo 接收端输出高电平,否则输出低电平;
实验步骤
1.创建IAR工作空间;
2.创建基于C的IAR工程;
3.配置工程;
4.编辑代码并调试[无差错;无告警];
5.试验箱上电;使用mini USB分别连接CC Debugger和PC;并将仿真器CC Debugger的另外一端和ZigBee通用节点板上的JTAG插座相连;按下仿真器CC Debugger的复位按钮,绿灯常亮表示模块连接成功,可以往芯片中烧写程序;
6.在IAR中点击,download and debug(CTRL+D)烧写程序;
7.在IAR的调试窗口中,点击开始运行;
8.用串并转换线USB to UART线连接节点板串口和PC机某USB接口,在PC设备管理器中确认串口端口;
9.打开PC机上的串口调试助手,选择对应的串口,波特率为57600bps,8位数据、1位停止、无校验、无流控;
10.CC 2530会将串口采集的通信数据传到串口助手并显示出来;实验时请用纸板在超声波模块上方进行遮挡测距;
开发过程中,请注意CTRL+S保存项目!
参考源码

    #include "ioCC2530.h"     

    unsigned char counter;
    unsigned char buf[3];
    float distance;

    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*50/1000000*340/2*100);
        counter = (unsigned int)distance;
        //counter保存高电平长度,单位为50us
        buf[0] = counter/100;
        buf[1] = (counter%100)/10;
        buf[2] = (counter%10);
        if(buf[0] > 0x9)
        buf[0] = buf[0] - 0xA + 'A';
        else
        buf[0] = buf[0] + '0';		      
        if(buf[1] > 0x9)
        buf[1] = buf[1] -0xA + 'A';
        else
        buf[1] = buf[1] + '0';
        if(buf[2] > 0x9)
        buf[2] = buf[2] -0xA + 'A';
        else
        buf[2] = buf[2] + '0';
        UartTX_Send_String("Ultrasonic = ",13);
        UartTX_Send_String(&buf[0],1);
        UartTX_Send_String(&buf[1],1);
        UartTX_Send_String(&buf[2],1);
        UartTX_Send_String("cm",2);
        UartTX_Send_String("\r\n",2);
        delay();
    }
    } // end of main()
                
项目提升
请使用宏和函数优化代码,使其符合模块化开发,同时可读性更强;
实验报告
1. 根据实操部分的内容,完成数码管项目;
2. 以纸质的形式提交实验报告;
3. 论文格式请参照范文[点击下载]