当前位置:   article > 正文

基于Zigbee的智能道路路灯系统_单片机智能交通灯cc2530

单片机智能交通灯cc2530

CC2530作为物联网解决方案孕育而生的芯片,内核是利用了51内核,编程软件主要以IAR为主,ZigBee主要是基于IEEE802.15.4的无线标准,在物联网方面,最大的好处就是能够自组网。

利用zigbee完成小型的道路路灯系统。

 硬件系统总体框图

直接用两个CC2530做了点对点的组网,一个作为节点端控制超声波模块对过往的行人和车辆进行超声波监测,当有物体人或物靠近到达一定距离的时候,会将通行的路灯亮起,当没有行人和车辆经过的时候,就会关闭路灯,起到节能减排的作用,终端节点还使用了光照传感器,当没有天亮的时候并不会因为车辆或路人而开启路灯。

超声波模块

 超声波实物图

超声波模块的具体功能和主要特性可以参考商家给定的数据手册。

 超声波程序的编写,主要依照超声波的时序图去编写代码,利用单片机对超声波模块给定一个起始信号,将电平从低电平拉高至高电平,并等待10us秒,完成超声波的启动和发射,最终便等待超声波的信号回传接收,便可进行相应的数据处理。

起始信号

  1. //产生一个20us的脉冲,在Trig引脚
  2. Trig=1;
  3. delay_20us();
  4. Trig=0;
  5. //等待Echo回波引脚变高电平
  6. while(Echo==0);

程序设计流程图

 程序流程图

两个CC2530,一个作为终端控制节点,另外一个作为路由节点,两个节点组成一个利用Z-stack协议栈进行自组网的操作,首先对两个节点的系统时钟进行初始化,将系统时钟设置成32MHZ(CC2530默认时钟频率为16MHZ),并对其他需要使用到的IO口进行初始化,移植Z-stack协议栈,设置组网模式为点对点组网通信,并对两个节点进行判断,当节点是路由器节点时,会初始化射频模块,并接收终端节点返回的数据,若返回的数据显示有物体接近超过100cm,则会进行路灯开启,并将数据上传到PC端进行距离显示;当节点是终端节点时,会对终端节点的射频模块进行初始化,并对超声波模块和光照传感器进行初始化,当光照传感器监测到天亮之后,便会给超声波模块发送起始信号,驱动模块发射超声波,并对超声波返回的时间进行记录,若监测到有人或车靠近超过100cm的时候,并会将监测到的数据返回给协调器模块。

路由节点跟PC端的上位机进行联通,将终端节点发送过来的数据利用串口将数据以八位的二进制代码进行传输,上位机将发送到上来的数据进行实时显示。终端节点利用CC2530的IO口对超声波传感器和光敏传感器进行数据收集,将AD/DA转换的数据进行处理,最终得到相应的数据值。

关键代码 

  1. 中断处理函数
  2. #pragma vector = P0INT_VECTOR    
  3.  __interrupt void P0_ISR(void)
  4. {
  5.     //P0_5产生中断
  6.     if((P0IFG&0x20)==0x20)
  7.     {
  8.         IEN1 &=~0X20;    // 关闭P0口中断
  9.         outcomeL =T1CNTL;     //取出定时器的值
  10.         outcomeH =T1CNTH;     //取出定时器的值
  11.         succeed_flag=1;    //置成功测量的标志  
  12.     }
  13.     P0IFG = 0;              //清中断标志
  14.     P0IF = 0;              //清中断标志
  15. }

 定义中断处理函数,当超声波模块接收端接收到有超声波传输回来的信息之后,便会产生中断信号,而后处理中断内部函数。利用CC2530的P0_5口作为外部接收中断口,当发生中断的时候会对IO口进行判断,确定是P0_5口产生的中断,并关闭中断,等待下次计数器和中断的开启。并将发射信号时开启的定时器值取出,得到超声波在发射接收过程中所需要的时间,并将因为外部中断产生的中断标志位清除,等待下一次中断的到来。

  1. 数据处理函数
  2. int PrintfDistance()
  3. {
  4.     uint distance_data=0;
  5.     uint date = 0;
  6.     distance_data=outcomeH;                         //测量结果的高8位
  7.     distance_data<<=8;                             //放入16位的高8位
  8.     distance_data=distance_data|outcomeL;          //与低8位合并成为16位结果数据
  9.     distance_data*=4;                             //因为定时器为128分频,32M时钟, 4=128/32,
  10.     distance_data/=58;                            //微秒的单位除以58等于厘米
  11.     date |= distance_data;
  12.     if(date>=1000)
  13.     {
  14.       return -1;
  15.     }
  16.     else
  17.     {
  18.         return date;
  19.     }
  20. }

定义distance_data变量作为存储变量,将测量到的数据高八位存入distance_data变量,并将存入的数据左移八位,作为16位数据的高八位使用,再或上16位数据的低八位,组成监测的16位结果数据;定时器为128分频,32M时钟,因此128/32=4,由于计数时间为微秒。所以利用公式Y米=(X秒*344)/2得到X秒=( 2*Y米)/344得到X秒=0.0058*Y米转化为厘米和微秒得厘米=微秒/58。再将得到的16位数据 distance_data利用或运算将起存储到date变量中,并对data变量进行判断,超过一千厘米返回-1证明没监测到有人或车靠近,否则返回测量到的数据信息。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/848378
推荐阅读
相关标签
  

闽ICP备14008679号