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

📄 main485.c

📁 基于MSP430FE427单片机的RS485源码
💻 C
字号:
//#include "msp430x41x.h"//"msp430xE42x.h"
#define uchar  unsigned char
#define uint   unsigned int

#include "msp430xE42x.h"
#include "LCD.h"

#define UTXD   BIT4 
#define URXD   BIT5
#define Num 64

uchar ss[10]={char_0,char_1,char_2,char_3,char_4,char_5,char_6,char_7,char_8,char_9};
uint r0 = 0,s0 = 0,rr0 = 0;
uchar RXFLG = 0,TXFLG = 0,CS = 0x00,SS = 0x00,ACC,aa = 0,CY = 1,Command_Status1 = 0x00;
uchar r_buf[Num],s_buf[Num],a[Num];

uchar Rec_Judge(uchar *s)
{
   uchar i,j,k;
   if((*s != 0x68) && (*(s+7) != 0x68)) 
     return 0;
   else
   {
      for(i=1;i<7;i++)
      {
         if(*(s+i) > 0x99)
           return 0;
      }
   }
   if(*(s+9) > (Num-12))
      return 0;
   for(j=0;j<*(s+9);j++)
   {
      *(s+10+j) -= 0x33;
   }
   for(k=0;k<(*(s+9)+10);k++)
   {
      CS += *(s+k);
   }
   if(CS != *(s+(*(s+9)+10)))
     return 0;
   if(*(s+(*(s+9)+11)) != 0x16)
     return 0;
   else
     return 1;
}

void Send_Set(uchar *s)
{
   uint ii,jj,kk; 
   for(ii=0;ii<4;ii++)
   {
      s_buf[ii] = 0xFE;
      aa += 1;
   }
   for(jj=0;jj<10;jj++)
   {
      s_buf[4+jj] = *(s+jj);
      aa += 1;
      SS += s_buf[4+jj];
   }
   for(kk=0;kk<*(s+9);kk++)
   {
     s_buf[14+kk] = (*(s+10+kk) + 0x33);
     aa += 1;
     SS += s_buf[14+kk];
   }
   aa ++;
   s_buf[(14+s_buf[13])] = SS;
   aa ++;
   s_buf[(15+s_buf[13])] = 0x16;
   IE1 &= ~URXIE0;
   IE1 |= UTXIE0;
   CY = 1;
}

void delay(uint n)
{
    while(n -->0);
}

uchar Serial_Address(uchar *s1)
{
   uchar i,a[6];
   for(i=0;i<=5;i++)
   {
      if((*(s_buf+i)) != 0x99)
      break; 
      if(i==5)
      return(0x01);
   }
   for(i=0;i<=5;i++)
   {
      if((*(s1+i)) != a[i])
      return(0x00); 
   }
   return(0x02);
}

char Serial_Password(uchar *s1)
{
   uchar i,a[4];
   for(i=0;i<=3;i++)
   {
      if((*(s1+i)) != a[i])
      return 0;
   }
   return 1;
}

char Serial_Command_Run(uchar *s)
{
   switch(Serial_Address(s))
   {
      case 0x02:
      break;
      case 0x01: 
      switch(*(s_buf+6))
      {
         case 0x0f: 
         if(~Serial_Password(s+8))
         return 0;
         delay(5);
         (*(s+6)) |= 0x80;
         (*(s+7)) = 0x04; 
         Send_Set(s); 
         break;
         case 0x02:

         break;
         case 0x04: 
         break;
         default:
         break;
      }
      break;
      case 0x00:
      return 0;
   }
   return 1;
}

void Serial_Command()
{
   if(RXFLG)
   {
      RXFLG = 0;
      TXFLG = Rec_Judge(r_buf);
      if(TXFLG)
      {
         TXFLG = 0;
         CS = 0x00;
         Command_Status1 |= 0x04;
         if(CY == 1)
         {
            Send_Set(r_buf);
         }
      }
   }
   if(Command_Status1 & 0x04) 
   {
      if(~Serial_Command_Run(s_buf))
      {
         Command_Status1 &= 0xfb;
         return;
      } 
      Command_Status1 &= 0xfb;
   }
}

void Init_USART0(void)
{
   U0CTL |= (SWRST + PENA + PEV + CHAR); //选择偶校验,8位传送
   U0TCTL |= SSEL0; //选择ACLK
   ME1 |= (URXE0 + UTXE0);   //使能UART0的URXD和UTXD
   
   
   P2SEL |= URXD + UTXD; //设置P2.5为URXD,P2.4为UTXD
   P2DIR |= UTXD;
   
   U0BR0 = 0x1B; //波特率1200bps
   U0BR1 = 0x00; 
   U0MCTL = 0x03;
   
   TXBUF0 = 0x00;
   U0CTL &= ~SWRST;
   IE1 |= URXIE0;  //使能UART0的RX
   return;
}

void main(void)
{
   uchar i;
   WDTCTL = WDTPW + WDTHOLD;   //关看门狗
   _DINT();
   BTCTL = BTHOLD + BTFRFQ1;
   LCDCTL = LCDON + LCD4MUX + LCDSG0_3;
   U0IFG &= ~URXIFG0;
   U0CTL = 0X00;
   U0TCTL = 0X00;
   for(i = 0;i < 12;i ++) 
   {
      LCDMEM[i] = 0x00;
   }
   Init_USART0();
   _EINT();
   while(1)
   { 
      Serial_Command();
   }
}

uchar Lead_Flag = 0; //前导字节接受标志
uchar Begin_Flag = 0;//开始接收数据帧的标志

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
   IFG1 &= ~URXIFG0;
   if(RXBUF0 == 0xfe)
   {
      Lead_Flag ++;
   }
   if((RXBUF0 != 0xfe) && (Lead_Flag > 3))
   {
      Begin_Flag = 1;
   }
   if(Begin_Flag)
   {
      r_buf[r0 ++] = RXBUF0;
      if(r0 >= 10)
      {
         ACC = r_buf[9];
         r_buf[9+rr0] = RXBUF0;
         rr0 ++;
         if(rr0>(ACC+2))
         { 
            r0 = 0;
            rr0 = 0;
            ACC = 0;
            RXFLG = 1;
            Lead_Flag = 0;   
            Begin_Flag = 0;
         }
      } 
   }
}

#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx(void)
{
   IFG1 &= ~UTXIFG0;
   TXBUF0 = s_buf[s0++];
   if(s0 >= aa)
   {
      s0 = 0;
      aa = 0;
      SS = 0;
      IE1 &= ~UTXIE0;
      IE1 |= URXIE0;
   }
}

⌨️ 快捷键说明

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