⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data_check.c

📁 基于MSP430平台位置速度系统的设计 MSP430 驱动
💻 C
字号:
#include <msp430x13x.h> // Standard Equations
#include	"in430.h"
#include        "stdlib.h"
#include       "stdio.h"
#define  GAS   BIT1
#define  WATER BIT2
#define  OIL   BIT0
#define  BELL  BIT7
#define  BELL1 BIT3
#define  POWER BIT4
#define CS BIT0
#define PWR BIT2
#define TXEN BIT3
#define num 30

typedef unsigned char	INT8U;
typedef unsigned short	INT16U;
typedef unsigned long	INT32U;
typedef char	INT8;
typedef short	INT16;
typedef long	INT32;
void OILBell(void);
void GASBell(void);
void WATERBell(void);
void Delay(INT32 n);
void SetTxMode(void);
void SetRxMode(void);
unsigned int CheckSum(unsigned char* buf, unsigned char len);
unsigned long ulCount = 0,TBCounter = 0;
unsigned char ucCountFlg = 0,ucLEDFlg = GAS ,ucPowerFlg = 0;
unsigned char buffer[num];
INT8U	BridgeBuf[6];
typedef struct ISRRUNNINGFLAG
{
	INT8U	usartTxISR:1;
	INT8U	recPacketTimerOut:1;
	INT8U	noUsed:6;
}ISRRUNNINGFLAG;

#define	RINGBUFLEN	63
#define	RINGHALFBUFLEN	32
#define	RINGSENDBUFLEN	63

typedef struct USATR0BUFFPTR
{
	INT8U 	headPtr;
	INT8U 	endPtr;
	INT8U	count;
}USATRBUFFPTR;

ISRRUNNINGFLAG	ISRRunningFlag0,ISRRunningFlag1;
INT8U	RecvRingBufForUsart0[RINGBUFLEN+1];
INT8U	SendRingBufForUsart0[RINGSENDBUFLEN+1];
USATRBUFFPTR	SendQueuePtr0, RecvQueuePtr0;
void Delay(INT32 n)
{
	INT8 i;
	while(n--)
	for(i=0;i<80;i++);	
}

static void	ManagePtr0Init()
{
	SendQueuePtr0.headPtr = 0;
	SendQueuePtr0.endPtr = 0;
	SendQueuePtr0.count = 0;

	RecvQueuePtr0.headPtr = 0;
	RecvQueuePtr0.endPtr = 0;
	RecvQueuePtr0.count = 0;

	ISRRunningFlag0.usartTxISR = 0;
	ISRRunningFlag0.recPacketTimerOut = 0;
	ISRRunningFlag0.noUsed = 0;
}

static void	Uart0Init(void)
{
	//UCTL0 = SWRST;
	UCTL0 = CHAR;
	UTCTL0 = SSEL1;//USART0选择smclk
	UBR00 = 0x41;                         // 8MHz 9600
        UBR10 = 0x03;                         // 8MHz 9600
        UMCTL0 = 0x81;                        // 8MHz 9600 modulation
        ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
       IE1 |= URXIE0;
       // IE1 |= URXIE0;                        // Enable USART0 RX interrupt
        //UCTL0 &= ~SWRST;
        P3SEL |= 0x30;                        // P3.4,5 = USART0 TXD/RXD
        P3DIR |= 0x10;                        // P3.4 output direction
      //_EINT();                              // Enable interrupts
	
	
	ISRRunningFlag0.usartTxISR = 0;
	ManagePtr0Init();
	
}



static INT8	Usart0SendQueueNoFull(void)
{
	if(SendQueuePtr0.count < RINGSENDBUFLEN)
		return 1;
	return 0;
}


static INT8	Usart0RecvQueueNoEmpty(void)
{
	if(RecvQueuePtr0.count)
		return 1;
	return 0;
}


static void	startupUSART0Send()
{
	IE1 |= UTXIE0;
}

static INT8U	USART0SendData(INT8U* buf, INT8U len)
{
	INT8U	count=0;

	if((buf == (void*)0) || (len == 0))
		return count;
	do
	{
		if(Usart0SendQueueNoFull() == 1)
		{
			SendRingBufForUsart0[SendQueuePtr0.headPtr] = buf[count];        
			count++;
			_DINT();
			SendQueuePtr0.headPtr++;
			SendQueuePtr0.headPtr &= RINGSENDBUFLEN;
			SendQueuePtr0.count++;
			_EINT();
		}
		else
			break;
	}while(count != len);
	if(!ISRRunningFlag0.usartTxISR)
		startupUSART0Send();
	return count;
}


static INT8U	USART0RecvData(unsigned char* buf, unsigned char len)
{
	unsigned char	count=0;

	if((buf == (void*)0) || (len == 0))
		return count;
	while(Usart0RecvQueueNoEmpty() == 1)
	{
		buf[count] = RecvRingBufForUsart0[RecvQueuePtr0.endPtr];
		count++;
		_DINT();
		RecvQueuePtr0.endPtr++;
		RecvQueuePtr0.endPtr &= RINGBUFLEN;
		RecvQueuePtr0.count--;
		_EINT();
		if(count == len)
			break;
	}
	return count;
}

/*#pragma vector=USART0RX_VECTOR
__interrupt void Usart0RxISR(void)
{
	if(URCTL0&0x80)
		return;

	RecvRingBufForUsart0[RecvQueuePtr0.headPtr] = RXBUF0;
	//SendDataTo595(RecvRingBufForUsart0[RecvQueuePtr0.headPtr]);//
	if(RecvQueuePtr0.count < RINGBUFLEN)
	{
		RecvRingBufForUsart0[RecvQueuePtr0.headPtr] = RXBUF0;
		RecvQueuePtr0.headPtr++;
		RecvQueuePtr0.headPtr &= RINGBUFLEN;
		RecvQueuePtr0.count++;
	}
}
*/
#pragma vector=USART0RX_VECTOR
__interrupt void Usart0RxISR(void)
{
   if(RXBUF0=='A')
   {BridgeBuf[0]=RXBUF0;
    Delay(15);
    BridgeBuf[1]=RXBUF0;
    Delay(15);
    BridgeBuf[2]=RXBUF0;
    Delay(15);
    BridgeBuf[3]=RXBUF0;
    Delay(15);
    BridgeBuf[4]=RXBUF0;
    Delay(15);
    BridgeBuf[5]=RXBUF0;
    Delay(15);
    }
}
#pragma vector=USART0TX_VECTOR
__interrupt void Usart0TxISR(void)
{
	ISRRunningFlag0.usartTxISR = 1;
	if(SendQueuePtr0.headPtr != SendQueuePtr0.endPtr)
	{
		TXBUF0 = SendRingBufForUsart0[SendQueuePtr0.endPtr];
		SendQueuePtr0.endPtr++;
		SendQueuePtr0.endPtr &= RINGSENDBUFLEN;
		SendQueuePtr0.count--;
	}
	if(SendQueuePtr0.headPtr == SendQueuePtr0.endPtr)
	{
		ISRRunningFlag0.usartTxISR = 0;
		IE1 &= ~UTXIE0;
	}
}

INT8U * itoa(INT16U value, INT8U * buf, INT8U radix)
{
	INT16U i;
	INT8U * ptr, * temphold;

  	temphold = buf;
	ptr = buf + 12;
	*--ptr = 0;		// Insert NULL char
	do
	{
	   // First create string in reverse order
	   	i = (value % radix) + 0x30;
		if(i > 0x39) i += 7;
		*--ptr = i;
      		value = value / radix;
  	} while(value != 0);

	// Next, move the string 6 places to the left Include NULL character
	for( ; (*buf++ = *ptr++); );
	return(temphold);
}
//itoa(air_temperature/1000, text, 10);
//ad
typedef struct
{
	unsigned char	Power[2];
}ADCPROCESSPARAM;

ADCPROCESSPARAM	ADCProcessParm;
void	StartADC12(void)
{
	P6SEL = 0x07;
	P6DIR = 0x00;
	ADC12CTL0 &= ~ENC;
	ADC12MCTL0 = SREF_0 + INCH_0;/*供电测量*/
	ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_0 + ADC12SSEL_0 + CONSEQ_0;
	ADC12CTL0 |= SHT0_8 + SHT0_2 + SHT0_1 + ADC12ON;
	ADC12IE = 1;
	ADC12CTL0 |= ENC + ADC12SC;
}

#pragma vector=ADC_VECTOR
__interrupt void AdcISR(void)
{
	unsigned int	IntVector=0;
	_DINT();
	IntVector = ADC12IV;
	switch(IntVector)
	{
		case 6:
			*((unsigned int*)ADCProcessParm.Power) = ADC12MEM0;
			//ADC12CTL0 = 0x0000;
			//ADC12CTL1 = 0x0000;
			break;
		default:
			break;
	}
}
//无线传输模块函数
void SetTxMode(void)				
{	
	
	P4OUT=CS+PWR+TXEN;
	Delay(1); 					// delay for mode change(>=650us)
}
void SetRxMode(void)
{
	
	P4OUT=CS+PWR;
	Delay(1); 					// delay for mode change(>=650us)				
}			
//
unsigned int CheckSum(unsigned char* buf, unsigned char len)
{ 
  unsigned char i;
  unsigned int checkdata;
  checkdata=0;
  for(i=0;i<len;i++)
 {
  checkdata+=buf[i];
  }
  return checkdata;
}
INT8U	suc[]="D101E",can[15],string[5],rcfrpcbuf[]="A12345D101E",receive[]="DE";

INT8U	head=0,tail=0,lenth,k;

void  main(void)
{  
    unsigned int uiCounterm = 0,uiFlg = 0,check=0;
   INT32 i,j;
   
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  BCSCTL1=0x0;                       // ACLK = LFXT1 = HF XTAL
  BCSCTL2 |= SELM_2+SELS;
  /********************等待时钟源转换结束**************************/
  do 
  {
  IFG1 &= ~OFIFG;                       // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG) != 0);         // OSCFault flag still set?                
 
     /**************************I/O口初始化**************************/
  P5DIR |= GAS + WATER + OIL + POWER;//
  P5OUT |= GAS; 
 P5OUT &= ~POWER;
     
 P4SEL = BIT7;//TB COUNT INIT
 P4DIR &= ~BIT7;
     
     //比较器 由CA1输入,接于正端,参考源接于负端,开比较器,下降沿中断,中断允许
     P2SEL |= BIT4;
     P2DIR &= ~BIT4;
   CACTL2 = P2CA1 ;
   CACTL1 = 0;
   //CACTL1= CAREF_2 + CAON  + CAIE;// + CAIES;Comp. A Int. Ref. Select 2 : 0.5*Vcc */
     CACTL1= CAREF_2 + CAON; 
  // CACTL1 |= /*CAIE +*/ ;
     
     // 外部引脚连接到比较器,比较信号经过RC滤波
     
    CCR0 = 60000;//10ms
    CCR2 = 60000;//15MS
     TBCCR0 = 0X0FFFF;
     CCTL2 |= OUTMOD_7 + CCIE;//INTERRUPT ENABLE
     TACTL |= TASSEL_2 + ID_3 + MC_1 + TACLR ;// smclk,60ms //can 1/8分频增计数模式,计数到ccro,再清零计数;
    TBCTL |= TBSSEL_0 + TBCLR + MC_1;//STAR TB选择外部引脚信号作为输入源,增计数模式
    P2DIR =0xff;
    P2OUT =0x00;
    P1DIR =0xff;
    P1OUT =0x00;
     P5OUT &= ~(WATER + OIL);
    P4DIR=0x0f;
     //P4OUT=0x0;
     Uart0Init();
     
     
     _EINT();
  SetTxMode(); 
    while(1)
     { 
    
    itoa(TBCounter,string,10);
      /*if(strlen(string)==3)
      {can[0]='A';
      can[1]='0';
      can[2]='0';
      }*/
     // strcat(can,string);
      //strcat(can,suc);
    lenth=strlen(string);
     can[0]='A';
      for(j=0;j<5-lenth;j++)
      {can[j+1]='0';}
      for(i=0;i<lenth;i++)
      {can[6-lenth+i]=string[i];}
      can[6]='P';
      if ((CAOUT & CACTL2) == CAOUT)
      {can[7]='1';}
      else can[7]='0';
      can[8]='E';
      
     Delay(2);
     USART0SendData(can,9);
     for(j=0; j<0x2fff; j++)_NOP();
     //can[]='A';
    Delay(100);
   /* SetRxMode();
     Delay(2);
    // USART0RecvData(BridgeBuf, 6);
	//for(i=0; i<0x2fff; i++) _NOP();
     Delay(90);
     //check=CheckSum(BridgeBuf,4);
   if((BridgeBuf[0]=='A')&&(BridgeBuf[5]=='E'))
     {//USART0SendData(BridgeBuf, 5);
     for(i=1; i<5; i++) 
     
     
     {receive[i]=BridgeBuf[i];
      }
      if (receive[1] == '1')
    {
        P5OUT = GAS;
    }
    
    else if (receive[1] == '2')
    {
        P5OUT = OIL;
    }
    else if (receive[1] == '3')
    {
        P5OUT = WATER;
    }
     BridgeBuf[0]='C';
    }*/
     
      
     //IE1 |= URXIE0;
       
       
	//USART0SendData(string,12);
      // USART0SendData(suc,8);
     // if((BridgeBuf[0]=='S')&&(BridgeBuf[4]=='E'))
     // {USART0SendData(BridgeBuf,5);
     // for(i=0; i<0xffff; i++)_NOP();
    //  USART1SendData(suc,8);
     // for(i=0; i<0xffff; i++)_NOP();
    //TXBUF1 = 'a';
    //Delay(200);
    //TXBUF1 = 'b';
    //Delay(200);
     //TXBUF1 = 'c';
   // Delay(200);
    //USART1SendData(receive,2);
    //for(i=0; i<0xffff; i++)_NOP();
      //_BIS_SR(CPUOFF);                    // Enter LPM0
    // _NOP();                             // Required only for C-spy
  
     }
}   

void OILBell(void)
{    
    P1SEL |= BELL ;
    P1DIR |= BELL ;
    P2SEL |= BELL1;
    P2DIR |= BELL1;        
    CCR1 = 20000;//CCR0/2;    
    CCTL1 |= OUTMOD_7 ;//INTERRUPT ENABLE
              
    
}

void WATERBell(void)
{    
    P1SEL |= BELL ;
    P1DIR |= BELL ;
    P2SEL |= BELL1;
    P2DIR |= BELL1;        
    CCR1 = CCR0;    
    CCTL1 |= OUTMOD_7 ;//INTERRUPT ENABLE
}

void GASBell(void)
{
    P1SEL &= ~BELL ;
    P1DIR |= BELL ;
    P1OUT &= ~BELL ;
    P2SEL &= ~BELL1;
    P2DIR |= BELL1;
    P2OUT &= ~BELL1;
    
}

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_CCR1(void)
 {   
 
    
 //  if((ulCount++) == 2)
   // {   //P5OUT ^= 0x04;  
        TBCTL &= ~(BIT4 + BIT5);//STOP TB
        TBCounter = TBR;
        TBCTL |= TBCLR + MC_1;//STAR T   
       // ulCount = 0;               
    //itoa(TBCounter,string,10);
      // USART0SendData(string,4);
  // }
  // if(ulCount>2){ulCount=0;}
 /*  if(TBCounter < 100)
            {
                ucLEDFlg = WATER;
                //WATERBell();
                P5OUT &= ~(OIL + GAS); 
               
            }
            else if(TBCounter < 5000)//19000
            {
                ucLEDFlg = OIL;
               // OILBell(); 
                P5OUT &= ~(WATER + GAS);     
            }
            else
            {
                 ucLEDFlg = GAS;
               // GASBell();  
                P5OUT &= ~(WATER + OIL);  
                            
            }
    
    if (ucLEDFlg == GAS)
    {
        P5OUT ^= GAS;
    }
    
    else if (ucLEDFlg == OIL)
    {
        P5OUT ^= OIL;
    }
    else
    {
        P5OUT ^= WATER;
    }*/
    //if(ucPowerFlg == POWER)
   // Delay(1);
    if ((CAOUT & CACTL2) == CAOUT)
    {
        P5OUT ^= POWER;
    }
    ucCountFlg = 0x5A;
    CCTL2 &= ~CCIFG;//软件清除中断标志
  // _DINT(); 
}
/*#pragma vector=COMPARATORA_VECTOR
__interrupt void Comparatora_A (void)
{
    ucPowerFlg = POWER;
} */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -