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

📄 msp430f1611_9600_only.c

📁 利用MSP430F1611系列单片机内部的TIMER_A模块功能CCR0、CCR1和CCR2的捕获功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#define  BP2400 0
#define  BP4800 1
#define  BP9600 2
#define  BP19200 3

#define COM6_RXD   	BIT1                      	// RXD on P1.1 for com6
#define COM6_TXD   	BIT5                      	// TXD on P1.5 for com6

#define COM7_RXD   	BIT2                      	// RXD on P1.2 for com7	
#define COM7_TXD   	BIT6                      	// TXD on P1.6 for com7

#define COM8_RXD   	BIT3                      	// RXD on P1.3 for com8
#define COM8_TXD   	BIT7                      	// TXD on P1.7 for com8

#define BaudRate        BP9600     				// 0-2400 1-4800 2-9600 3-19200
#define CheckMode		2					// 0-None 1-Odd 2-Even 10 bit
#if BaudRate==BP2400 							// Conditions for 2400 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5  	0x4E2          			// ~ 0.5 bit length + small adjustment
#define Bitime    	0x9C4          			// ~ 2400 baud
#elif BaudRate== BP4800						//  Conditions for 4800 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5  	0x271          			// ~ 0.5 bit length + small adjustment
#define Bitime    	0x4E2          			// ~ 4800 baud
#elif BaudRate== BP9600	      				//  Conditions for 9600 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5  	0x1A0         			// ~ 0.5 bit length + small adjustment
#define Bitime    	0x271          			// ~ 9620 baud
#elif BaudRate== BP19200						//  Conditions for 19200 Baud SW UART, SMCLK = 6MHZ
#define Bitime_5  	0x47          			// ~ 0.5 bit length + small adjustment
#define Bitime    	0x6C          			// ~ 19200 baud
#endif

//***********************************************************

#if CheckMode==0
const unsigned char BitTime[]={14,     13,14,  13,14,14,13,  14,14,13,14}
#else
const unsigned char BitTime[]={14,  14,13,14,  13,14,14,13,  14,14,13,14}
#endif
;
#define MaxBuffer	40						//各通道缓冲区的最大长度
#define TotalMaxBuffer	400					//接收和发送缓冲区的最大长度
#define plus_bufsize    TotalMaxBuffer - MaxBuffer
#define max_save_number TotalMaxBuffer/MaxBuffer
struct Channel
{
    unsigned RxErr:1;						//接收错误标志
    unsigned Rx_status:1;                  		//一帧数据正在接收状态标志
    unsigned Tx_status:1;					//一帧数据正在发送状态标志
    unsigned Rx_finish:1;					//一帧数据接收完成
    unsigned Tx_finish:1;					//一帧数据发送完成

    unsigned char BufferPtr;					//数据指针
    unsigned char CheckSum;					//校验和
    unsigned char Len;						//收发数据的长度
    unsigned char BitCnt;					//位计数器
    unsigned char Checkbit;					//采用定时器收发数据的校验码

    unsigned char RxBuf[MaxBuffer];				//接收缓冲区
    unsigned char TxBuf[MaxBuffer];				//发送缓冲区

    unsigned int  RxTemp;					//收数据字节寄存器
    unsigned int  TxTemp;					//发数据字节寄存器
    unsigned int  IdleTime;					//Idle时间

 };
struct Channel com34,com5,com6,com7,com8;

unsigned char TotalRXBuf[TotalMaxBuffer];
unsigned char TX_TotalBuf[TotalMaxBuffer];
unsigned char * RXStart_Ptrt;
unsigned char * RXEnd_Ptr;

unsigned char * TX_PtrStart;
unsigned char * TX_PtrEnd;
unsigned char * TX_cmp;
unsigned char * RX_cmp;

unsigned char r_len;
unsigned char main_len;
unsigned char main_i;

unsigned char count;

unsigned char rx_number;
unsigned char tx_number;
unsigned int  Rxmark;               			//com6,com7,com8对应接收标志

#define  begin_TotalRX_add &TotalRXBuf[0]
#define  last_TotalRX_add  &TotalRXBuf[TotalMaxBuffer-1]

#define  begin_TotalTX_add &TX_TotalBuf[0]
#define  last_TotalTX_add  &TX_TotalBuf[TotalMaxBuffer-1]
//**************************************************************

unsigned int RXTXData;
unsigned char BitCnt;

void com6_TX_Byte (void);
void com6_RX_Ready (void);

void com7_TX_Byte (void);
void com7_RX_Ready (void);

void com8_TX_Byte (void);
void com8_RX_Ready (void);


//******************************************************************************

#include <msp430x16x.h>
unsigned char Start = 0;
unsigned char i;
void main (void)
{
  unsigned char ii,jj;
  unsigned int kk;

  WDTCTL = WDTPW + WDTHOLD;             			// Stop watchdog timer
  BCSCTL1 |= XTS;                       			// Configure load caps
  CCTL0 = OUT;                          			// TXD Idle as Mark
  CCTL1 = OUT;
  CCTL2 = OUT;
  TACTL = TASSEL_1 + MC_2;              			// ACLK, continuous mode
  P1SEL |= COM6_RXD+COM7_RXD+COM8_RXD;  			// P1.1/2/3 TA0/1/2 for RXD function
  P1SEL |= COM6_TXD+COM7_TXD+COM8_TXD;
  P1DIR |= COM6_TXD+COM7_TXD+COM8_TXD;  			// P1.5/6/7 TA0/1/2 for TXD output on P1
  Rxmark = 0x0;                        			// 接收标志清零;
  com6.Tx_finish = 1;						// set frame TX finish, enable ini RX
  com7.Tx_finish = 1;
  com8.Tx_finish = 1;
  //------------------------ test oscfault falg  ----------------------------
  do									
  {
  IFG1 &= ~OFIFG;                       			// Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);           			// Time for flag to set
  }
  while ((IFG1 & OFIFG));               			// OSCFault flag still set?

  BCSCTL2 |= SELM_3;                    			// MCLK= LFXT1 (safe)
  //-------------------------------------------------------------------------

  _EINT();


  for (;;)
  {
  	if (com6.Tx_finish == 1)				// test if enable RX ini
      {
  		com6_RX_Ready();                      	// COM6/com7/com8 ready to RX one Byte
      }
       if (com7.Tx_finish == 1)
      {
      	com7_RX_Ready();	
      }
          if (com8.Tx_finish == 1)
      {
      	com8_RX_Ready();	
      }

  _BIS_SR(CPUOFF + GIE);                			// Enter LPM0 Until character RXed
  _NOP();	

  switch( Rxmark )               	   			//com6,com7,com8对应接收标志
    {
    case 2:								// ccr0 case deal
        {
          	if (com6.Rx_status == 1)
            {
          		com6.Rx_status = 0;
              	if ( com6.BitCnt == 0)			//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<			
      		{                  	
                        if(com6.Checkbit == 0)  	//校验位和停止位检测
                        {
                              com6.RxBuf[com6.BufferPtr++]=com6.RxTemp;            		
                        }
          			TACCTL0 |= CAP;			// ini RX next bit
                        if (com6.BufferPtr >= 0x12)
                        //if (com6.BufferPtr >= (com6.RxBuf[12]+ 15))
          			{
          				CCTL0 &=  ~CCIE;        // All bits RXed, disable interrupt         		
          				com6.BufferPtr=0;          				             			//com6 RX
          				CCTL0 &=~0x3000;
                              com6_TX_Byte();
          			}
      		}	
            }
            else if (com6.Tx_status == 1)
            {
              	com6.Tx_status = 0 ;
            	if ( com6.BitCnt == 0)
    		  	{    		
              		if (com6.BufferPtr <= 0x11)
              		//if (com6.BufferPtr <= (com6.RxBuf[12]+ 17))		//check send byte number
            		{            			
                  		com6.TxTemp = com6.TxBuf[com6.BufferPtr++];
    					com6.BitCnt = 0x0b;
  					ii=com6.TxTemp;					//add even bit start
  					kk=0;		
  					for(jj=0;jj<8;jj++)
      				{
     				 		if(ii&0x80) kk^=0x100;
				 		ii<<=1;
     					}
  					com6.TxTemp |=kk;					//add even bit end
  					com6.TxTemp |=0x200;		 		//add stop bit
            			com6.TxTemp = com6.TxTemp << 1;    	 		// Add space start bit
                        	CCR0 = TAR;                         		// Current state of TA counter
            			CCR0 += Bitime;                     		// Some time till first bit
            		}	
        			else
        			{
        				com6.BufferPtr=0;
        				CCTL0 &= ~ CCIE;                    		// All bits TXed, disable interrupt
                        	com6.Tx_finish = 1;
        				_NOP();
        			}
    			}
    			else
    			{      			
      			if (com6.TxTemp & 0x01) CCTL0 &= ~ OUTMOD2;           // TX Mark
                 		else CCTL0 |= OUTMOD2;                  			// TX Space
      				com6.TxTemp = com6.TxTemp >> 1;
      				com6.BitCnt --;
            	}
            }
        } break;

    case 4:			//--------------------- ccr2 rx/tx -----------------
        {
		if (com7.Rx_status == 1)
            {
          		com7.Rx_status = 0;
              	if ( com7.BitCnt == 0)			
      		{                  	
                        if(com7.Checkbit == 0)  	//校验位和停止位检测
                        {
                              com7.RxBuf[com7.BufferPtr++]=com7.RxTemp;            		
                        }
          			TACCTL1 |= CAP;			// ini RX next bit
                        if (com7.BufferPtr >= 0x12)
                        //if (com6.BufferPtr >= (com6.RxBuf[12]+ 15))
          			{
          				CCTL1 &=  ~CCIE;        // All bits RXed, disable interrupt         		
          				com7.BufferPtr=0;          				             			//com6 RX
          				CCTL1 &=~0x3000;
                              com7_TX_Byte();
          			}
      		}	
            }
            else if (com7.Tx_status == 1)
            {
              	com7.Tx_status = 0 ;
            	if ( com7.BitCnt == 0)
    		  	{    		
              		if (com7.BufferPtr <= 0x11)
              		//if (com6.BufferPtr <= (com6.RxBuf[12]+ 17))		//check send byte number
            		{            			
                  		com7.TxTemp = com7.TxBuf[com7.BufferPtr++];
    					com7.BitCnt = 0x0b;
  					ii=com7.TxTemp;					//add even bit start
  					kk=0;		
  					for(jj=0;jj<8;jj++)
      				{
     				 		if(ii&0x80) kk^=0x100;
				 		ii<<=1;
     					}
  					com7.TxTemp |=kk;					//add even bit end
  					com7.TxTemp |=0x200;		 		//add stop bit
            			com7.TxTemp = com7.TxTemp << 1;    	 		// Add space start bit
                        	CCR1 = TAR;                         		// Current state of TA counter
            			CCR1 += Bitime;                     		// Some time till first bit
            		}	
        			else
        			{
        				com7.BufferPtr=0;
        				CCTL1 &= ~ CCIE;                    		// All bits TXed, disable interrupt
                        	com7.Tx_finish = 1;
        				_NOP();
        			}
    			}
    			else
    			{      			
      			if (com7.TxTemp & 0x01) CCTL1 &= ~ OUTMOD2;           // TX Mark
                 		else CCTL1 |= OUTMOD2;                  			// TX Space
      				com7.TxTemp = com7.TxTemp >> 1;
      				com7.BitCnt --;
            	}
            }

        } break;
    case 6:				//--------------------- ccr2 rx/tx -----------------
        {
        	if (com8.Rx_status == 1)
            {
          		com8.Rx_status = 0;
              	if ( com8.BitCnt == 0)			
      		{                  	
                        if(com8.Checkbit == 0)  	//校验位和停止位检测
                        {
                              com8.RxBuf[com8.BufferPtr++]=com8.RxTemp;            		
                        }
          			TACCTL2 |= CAP;			// ini RX next bit
                        if (com8.BufferPtr >= 0x12)
                        //if (com6.BufferPtr >= (com6.RxBuf[12]+ 15))
          			{
          				CCTL2 &=  ~CCIE;        // All bits RXed, disable interrupt         		
          				com8.BufferPtr=0;          				             			//com6 RX
          				CCTL2 &=~0x3000;
                              com8_TX_Byte();
          			}

⌨️ 快捷键说明

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