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

📄 msp430f1611_2400_three.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

unsigned char flag;						//接收和发送标志寄存器

#define	com6_rx_status	0x01				// com6 rx status一帧数据正在接收状态标志
#define	com6_tx_status	0x02				// com6 tx status一帧数据正在发送状态标志

#define	com7_rx_status	0x04
#define	com7_tx_status	0x08

#define	com8_rx_status	0x10
#define	com8_tx_status	0x20


#define BaudRate        BP2400  //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;
  com6_RX_Ready();
  //------------------------ 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();	
      }

//  检测 com6/ com7/ com8  接收状态
      if (com6.Rx_status == 1)
      {
      	com6.Rx_status = 0;
           	if ( com6.BitCnt == 0)			//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<			
      	{                  	            	
                 	com6.RxBuf[com6.BufferPtr++]=com6.RxTemp;            		
      		TACCTL0 |= CAP;			// ini RX next bit
                  if (com6.BufferPtr >= 0x12)
          		{
          			CCTL0 &=  ~CCIE;        // All bits RXed, disable interrupt         		
          			com6.BufferPtr=0;          				             			//com6 RX
          			CCTL0 &=~0x3000;
                        com6_TX_Byte();
          		}
      	}	
      }
      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();
                        com6_RX_Ready();
        		}
    		}
    		else
    		{      			
      		if (com6.TxTemp & 0x01) CCTL0 &= ~ OUTMOD2;           // TX Mark
            	else CCTL0 |= OUTMOD2;                  			// TX Space
      		com6.TxTemp = com6.TxTemp >> 1;
      		com6.BitCnt --;
            }
      }
//------------------- 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();
          			}
      	}	
      }
      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 --;
           	}
      }

//------------------ ccr2 rx/tx -----------------

      if (com8.Rx_status == 1)
      {
      	com8.Rx_status = 0;
           	if ( com8.BitCnt == 0)			
      	{                  	
            	com8.RxBuf[com8.BufferPtr++]=com8.RxTemp;            		
          		TACCTL2 |= CAP;			// ini RX next bit
                  if (com8.BufferPtr >= 0x12)

⌨️ 快捷键说明

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