【MCU方案】MSP430F5529制作的施工车辆信息监测系统

2019-07-26 17:07发布

                                                                 MSP430F5529制作的施工车辆信息监测系统
一,功能介绍:
         本系统主要用于监测施工车辆运行的速度,运行时路面的温度以及车辆的位置信息。然后将这些这些信息借助移动的网络发送到服务器上去并将温度,速度,时间信息通过显示屏进行显示。系统的控制核心选用的是TI的msp430F5529,考虑到整个系统用到的IO管脚比较多,所以选用了该款430。一下是整个系统的方案选型:
   (1)测速系统采用的霍尔器件,430单片机对霍尔器件输出的脉冲进行输入捕获对其频率进行测量就可计算出车辆  的速度;
   (2)测量车辆运行的路面温度系统我采用的是红外测温温度传感器,430通过smBUS总线方式读取温度传感器的数据,然后进行数据处理,显示在LCD屏上。
   (3)计时系统我选用了的是DS1302时钟芯片,外加上一个3v的纽扣电池起到掉电时间保护左右,然后430负责读取时间进行显示。
  (4)车辆定位系统我选用的GPS模块,430通过GPS读取到车辆的经纬度信息。
  (5)数据发送装置我采用的GPRS模块将采集到速度,温度,时间,位置信息发送到我们自己建立的服务器上去
  (6)LCD屏,我选用的是240*128的LCD屏,这样尺寸的屏刚好满足我设计的要求。    (7) 考虑到有时没有移动信号,我们在电路上设计了SD卡,这样当GPRS没有信号时,我们的数据可以自动的到存到我们的SD卡中
二,系统框图
整个系统的框图 整个系统的框图

图1
  上图就是我整个设计的框图。
                                              (1)电源给整个系统供电,输入12v通过两种稳压芯片,分别稳压到5v和3.3v给整个系统供电。
                                              (2)测速,键盘, LCD我采用的都是IO进行和430单片机进行连接
                                              (3)GPS和GPRS采用的是UART和430进行连接
                                              (4) SD卡采用的是SPI接口和430进行连接
三,系统原理图


                      电源.png                                                           LCD和时钟.png         
                                   图2  电源                                                                                                                            图3 LCD和时钟芯片

                                                                              MCU.png
                                                                                                  图4 430核心部分

  整个系统的原理图如图2,3,4所示。图2是整个系统的电源部分,图3是lcd显示屏,图4是整个430核心部分。


四,源代码,


void main(void)
{
//--------------------------------------初始化------------------------------------
  WDTCTL=WDTPW+WDTHOLD;
  ON_XT2();               //初始化时钟
  VelocityMeasure_Init(); //速度初始化
  TemperatureMeasure_Init();//温度初始化
  IO_Init();
  LcdInit();
  LCD_Clear();  //清屏
//---------------------------------------配置定时器A------------------------------
  TA0CTL=TASSEL_1+MC_1+TACLR;//时钟ACLK,增计数模式,开定时中断,计数器清零
  TA0CCR0=150;//定时15ms中断一次
  TA0CCTL0 = CCIE; // 开定时器0中断
//---------------------------------------配置串口---------------------------------  
  P3SEL |= BIT3+BIT4;// 将P3.3,P3.4 配置为串口的 TXD/RXD
  UCA0CTL1 |= UCSWRST;// 处于软件复位
  UCA0CTL1 |= UCSSEL__SMCLK; //选择SMCLK作为时钟                          
  UCA0BR0 = 52; //查表得到  
  UCA0BR1 = 0;                           
  UCA0MCTL = UCBRS_0 + UCBRF_1 + UCOS16;   // 配置UCBRSx=0, UCBRFx=1,
  UCA0CTL1 &= ~UCSWRST;                     // 退出软件复位状态
  UCA0IE |= UCRXIE;                         // 使能 USCI_A0 RX 中断


  Homepage();
  Show_LuDuanZhi();

   while(1)
{
  if((temperBuff[0]-0x30)>=(Temperature_H[0]-0x30))
  {
    Beep(20);
  }//当温度超过30°,指示灯亮1s左右
   if(TimeDispFlag==0)
    {
      Time();
    }  //显示时间标志位
   if(keyCnt >= 1)
    {
      keyCnt = 0;
      Menu_Process();
    }   //15ms执行一次按键函数

   if(MainCnt >= 100)
    {

      MainCnt = 0;

      //P2OUT ^= BIT4;//灯2s钟闪烁一次

      TemperatureMeasure();//调用测温函数
      sprintf(temperBuff,"%-5.1f",Temperature);
      strncat(memoryBuff,temperBuff,5);//将浮点型的温度值变为字符串
      sprintf(VelocityBuff,"%-5.1f",VelocityValue);
      strncat(memoryBuff,VelocityBuff,5);//将浮点型的速度值变为字符串
      strncat(memoryBuff,(char*)latitudeBackup,10);
      strncat(memoryBuff,(char*)longitudeBackup,11);
      GetDirectory("");
      WriteExistingFile("/孙永强.txt",memoryBuff,31);
      WriteExistingFile("/孙永强.txt",Enter,2);//将温度、速度、纬度及经度值存储

      for(int i=0;i<=40;i++)
      {
        memoryBuff=0;
      }

    if(TemVeloDispFlag == 0)
     {
    //  Show_Float(6,7,VelocityValue);
      Show_Float(7,7,Temperature);
     }//显示速度和温度值
    if(CoorDispFlag == 1)
     {
     Show_String(3,7,latitudeBackup,10);
     Show_String(4,7,longitudeBackup,11);
     }//显示经度和纬度值

    }
  }

}
/********************************************************************************
名称:TIMER0_A0_ISR()
函数功能:将定时器TIMER0_A作为基准定时器使用,15ms产生一次中断
说明:TIMER0_A0_VECTOR表示定时器TIMER0_A的CCR0中断源

*********************************************************************************/
#pragma vector=TIMER0_A0_VECTOR   
__interrupt void  TIMER0_A0_ISR(void)
{
    //_EINT();
    keyCnt ++;
    lcdCnt ++;
    MainCnt++;
    Beep_Process();
   // if(lcdCnt >= 100)
   // {
   //   lcdCnt = 0;
   //    P2OUT ^= BIT4;//灯2s钟闪烁一次
   //  }
    Key_ScanIO();
}


/*------------------------------------------------------------
名称:USCI_A0_ISR()
功能:串口接收中断函数
--------------------------------------------------------------*/
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
  gpsData=UCA0RXBUF;
  Valid(gpsData);
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。