📄 main485.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 + -