main.c

来自「基于MSP430平台位置速度系统的设计 MSP430 驱动」· C语言 代码 · 共 1,069 行 · 第 1/2 页

C
1,069 行
字号
#include <msp430x14x.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);
void OneCircle(void);
void MotorTurn(unsigned int circle_n,unsigned int step_n,unsigned char direction);
void stepfan(unsigned int step_n);
void stepzheng(unsigned int step_n);
void Motorzheng(unsigned int circle_n,unsigned int step_n);
void Motorfan(unsigned int circle_n,unsigned int step_n);
void OneCirclefan(void);
unsigned int Distance(INT8U circle,INT8U step);
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];
unsigned int step_num;
unsigned char  flag=0;
INT8U	BridgeBuf[15],rcfrpcbuf[6],sentopcbuf[15];
INT8U   string[10];
unsigned int   stepall,circleall,flag1,flagall;
unsigned int stepcount,stepf,stepcountever;
INT8U resettopcbuf[]="A99999P0D00000E";
INT8U   distance[5];
INT8U   huiche[]="12345";
unsigned int dis;
//INT8U   step=0;
INT8U   NoSend=1;
typedef struct ISRRUNNINGFLAG
{
	INT8U	usartTxISR:1;
	INT8U	recPacketTimerOut:1;
	INT8U	noUsed:6;
}ISRRUNNINGFLAG;

#define	RINGBUFLEN	63
#define	RINGHALFBUFLEN	32
#define	RINGSENDBUFLEN	63
#define	RINGBUFLEN1	63
#define	RINGHALFBUFLEN1	32
#define	RINGSENDBUFLEN1	63  
typedef struct USATR0BUFFPTR
{
	INT8U 	headPtr;
	INT8U 	endPtr;
	INT8U	count;
}USATRBUFFPTR;

ISRRUNNINGFLAG	ISRRunningFlag0,ISRRunningFlag1;
INT8U	RecvRingBufForUsart0[RINGBUFLEN+1];
INT8U	SendRingBufForUsart0[RINGSENDBUFLEN+1];
INT8U	RecvRingBufForUsart1[RINGBUFLEN1+1];
INT8U	SendRingBufForUsart1[RINGSENDBUFLEN1+1];
USATRBUFFPTR	SendQueuePtr0, RecvQueuePtr0,SendQueuePtr1, RecvQueuePtr1;
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	ManagePtr1Init()
{
	SendQueuePtr1.headPtr = 0;
	SendQueuePtr1.endPtr = 0;
	SendQueuePtr1.count = 0;

	RecvQueuePtr1.headPtr = 0;
	RecvQueuePtr1.endPtr = 0;
	RecvQueuePtr1.count = 0;

	ISRRunningFlag1.usartTxISR = 0;
	ISRRunningFlag1.recPacketTimerOut = 0;
	ISRRunningFlag1.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 void	Uart1Init(void)
{
	UCTL1 = SWRST;
	UCTL1 = CHAR;
	UTCTL1 = SSEL1;//USART0选择smclk
	UBR01 = 0x41;                         // 8MHz 115200
        UBR11 = 0x03;                         // 8MHz 115200
        UMCTL0 = 0x81;                        // 8MHz 115200 modulation
        ME2 |= UTXE1 + URXE1;                 // Enable USART1 TXD/RXD
        IE2 |= URXIE1;                        // Enable USART1 RX interrupt
        UCTL1 &= ~SWRST;
        P3SEL |= 0xC0;                        // P3.6,7 = USART1 option select
        P3DIR |= 0x20;                        // P3.6 = output direction
	
	
	ISRRunningFlag1.usartTxISR = 0;
	ManagePtr1Init();
	
}


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

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

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

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	USART1SendData(INT8U* buf, INT8U len)
{
	INT8U	count=0;

	if((buf == (void*)0) || (len == 0))
		return count;
	do
	{
		if(Usart1SendQueueNoFull() == 1)
		{
			SendRingBufForUsart1[SendQueuePtr1.headPtr] = buf[count];        
			count++;
			_DINT();
			SendQueuePtr1.headPtr++;
			SendQueuePtr1.headPtr &= RINGSENDBUFLEN1;
			SendQueuePtr1.count++;
			_EINT();
		}
		else
			break;
	}while(count != len);
	if(!ISRRunningFlag1.usartTxISR)
		startupUSART1Send();
	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;
}
static INT8U	USART1RecvData(unsigned char* buf, unsigned char len)
{
	unsigned char	count=0;

	if((buf == (void*)0) || (len == 0))
		return count;
	while(Usart1RecvQueueNoEmpty() == 1)
	{
		buf[count] = RecvRingBufForUsart1[RecvQueuePtr1.endPtr];
		count++;
		_DINT();
		RecvQueuePtr1.endPtr++;
		RecvQueuePtr1.endPtr &= RINGBUFLEN1;
		RecvQueuePtr1.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(URXIFG1)
  if(RXBUF0=='R')
     {
   //  BridgeBuf[0]=='S'
     rcfrpcbuf[0]=RXBUF0;
     Delay(15);
     rcfrpcbuf[1]=RXBUF0;
     Delay(15);
     rcfrpcbuf[2]=RXBUF0;
     Delay(15);
     rcfrpcbuf[3]=RXBUF0;
     Delay(15);
     rcfrpcbuf[4]=RXBUF0;
     Delay(15);
      rcfrpcbuf[5]=RXBUF0;
     Delay(15);
     if(rcfrpcbuf[5]=='0')
     {CCR0=50000;}
     if(rcfrpcbuf[5]=='1')
     {CCR0=30000;}
      if(rcfrpcbuf[5]=='2')
     {CCR0=20000;}
      if(rcfrpcbuf[5]=='3')
     {CCR0=10000;}
     if(rcfrpcbuf[5]=='4')
     {CCR0=5000;}
     if(rcfrpcbuf[5]=='5')
     {CCR0=4000;}
      if(rcfrpcbuf[5]=='6')
     {CCR0=1000;}
      if(rcfrpcbuf[5]=='7')
     {CCR0=700;}
     if(rcfrpcbuf[5]=='8')
     {CCR0=400;}
      if(rcfrpcbuf[5]=='9')
     {CCR0=200;}
    
  /*   BridgeBuf[11]=RXBUF1;
     Delay(15);
    BridgeBuf[12]=RXBUF1;
     Delay(15);
     BridgeBuf[13]=RXBUF1;
     Delay(15);*/
     }
     
 }
#pragma vector=USART1RX_VECTOR
__interrupt void Usart1RxISR(void)
{
   if(URXIFG1)
  {if(RXBUF1=='A')
     {
   //  BridgeBuf[0]=='S'
     BridgeBuf[0]=RXBUF1;
     Delay(15);
     BridgeBuf[1]=RXBUF1;
     Delay(15);
     BridgeBuf[2]=RXBUF1;
     Delay(15);
     BridgeBuf[3]=RXBUF1;
     Delay(15);
     BridgeBuf[4]=RXBUF1;
     Delay(15);
     BridgeBuf[5]=RXBUF1;
     Delay(15);
     BridgeBuf[6]=RXBUF1;
     Delay(15);
     BridgeBuf[7]=RXBUF1;
     Delay(15);
      BridgeBuf[8]=RXBUF1;
     Delay(15);
   
     }
     }
 }
    
/*#pragma vector=USART1RX_VECTOR
__interrupt void Usart1RxISR(void)
{
	if(URCTL1&0x80)
		return;

	RecvRingBufForUsart1[RecvQueuePtr1.headPtr] = RXBUF1;
	if(RecvQueuePtr1.count < RINGBUFLEN1)
	{
		RecvRingBufForUsart1[RecvQueuePtr1.headPtr] = RXBUF1;
		RecvQueuePtr1.headPtr++;
		RecvQueuePtr1.headPtr &= RINGBUFLEN1;
		RecvQueuePtr1.count++;
	}
}*/
#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;
	}
}
#pragma vector=USART1TX_VECTOR
__interrupt void Usart1TxISR(void)
{
	ISRRunningFlag1.usartTxISR = 1;
	if(SendQueuePtr1.headPtr != SendQueuePtr1.endPtr)
	{
		TXBUF1 = SendRingBufForUsart1[SendQueuePtr1.endPtr];
		SendQueuePtr1.endPtr++;
		SendQueuePtr1.endPtr &= RINGSENDBUFLEN1;
		SendQueuePtr1.count--;
	}
	if(SendQueuePtr1.headPtr == SendQueuePtr1.endPtr)
	{
		ISRRunningFlag1.usartTxISR = 0;
		IE2 &= ~UTXIE1;
	}
}
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 sentopc(void)
{ unsigned int i,j,lenth;
if(((BridgeBuf[0]=='A')&&(BridgeBuf[8]=='E'))&&(BridgeBuf[6]=='P'))
    {
   for(i=0;i<8;i++)
   sentopcbuf[i]=BridgeBuf[i];
   Distance(circleall,stepall);
   itoa(dis,distance,10);
 
   lenth=1;
   if(dis>9999)
   lenth=5;
   else if(dis>999)
   lenth=4;
   else if(dis>99)
   lenth=3;
   else if(dis>9)
   lenth=2;
   sentopcbuf[8]='D';  
   for(j=0;j<5-lenth;j++)
      {sentopcbuf[j+9]='0';}
      for(i=0;i<lenth;i++)
      {sentopcbuf[14-lenth+i]=distance[i];}
   sentopcbuf[14]='E';
  
   BridgeBuf[0]='C';
   BridgeBuf[8]='C';
   }
   if((sentopcbuf[0]=='A')&&(sentopcbuf[6]=='P')&&(sentopcbuf[8]=='D')&&(sentopcbuf[14]=='E'))
  
     {
    USART0SendData(sentopcbuf, 15);
     for(i=0; i<0x2fff; i++) _NOP();
    sentopcbuf[0]=='C';
    }
 }

//无线传输模块函数
void SetTxMode(void)				
{	
	
	P4OUT=CS+PWR+TXEN;
	Delay(1); 					// delay for mode change(>=650us)
}

⌨️ 快捷键说明

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