📄 main.c
字号:
}
else if((Flag & SwitchOff) == SwitchOff) //异常开关解除
{
SendData(SwitchOffCode , 6);
}
WatchTransTimeOut = 0;
ConflictFlag |= TXDTIMEOUT; //设置发送超时标志
CommunicationErr |= STATESENDERR; //设置状态发送错误标志
}
}
else
{
UartFlag = 0X00;
UartCount = 2;
while((ReceviceBuff[UartCount] == CodeTable[1][UartCount]) //接收到自PLC的安静指令
&& (UartCount < 9) && (UartFlag == 0X00))
{
if(UartCount == 7)
{
UartFlag &= ~BUSENABLEFLG; //总线申请允许
ConflictFlag &= ~SENDENABLE; //不允许发送总线申请
ConflictFlag |= SENDDISABLE;
UartFlag &= ~CONFLICTFLG; //无总线冲突
SecIndex = 0; //当前延时值副本
TimerCount = 0; //总线空闲值
Index = 0; //当前延时
break;
}
else
{
UartCount++;
}
}
UartCount = 2;
while((ReceviceBuff[UartCount] == CodeTable[7][UartCount]) //接收到自其他子台的总线申请
&& (UartCount < 9) && (UartFlag == 0X00))
{
if(UartCount == 7)
{
UartFlag &= ~BUSENABLEFLG; //总线申请允许
ConflictFlag &= ~SENDENABLE; //不允许发送总线申请
ConflictFlag |= SENDDISABLE;
UartFlag &= ~CONFLICTFLG; //无总线冲突
SecIndex = 0; //当前延时值副本
TimerCount = 0; //总线空闲值
Index = 0; //当前延时
break;
}
else
{
UartCount++;
}
}
}
}
if((WatchRecevice >= 5) && (UartCounter > 9)) //接收到总线上的乱码 //接收到总线上的乱码
{
TBCCTL0 &= ~CCIE; //不允许定时器A中断
WatchRecevice = 0; //延时变量为0
UartCounter = 0;
//SendData(CodeTable[0], 6);
//CommunicationErr = ReSendErr;
ConflictFlag |= TIMEOUTFLG; //定时超时标志
//_EINT();
//return;
}
ConflictFlag |= TIMEOUTFLG; //定时超时标志
_EINT();
}
/*if((P6IN & P6IN_4) != P6IN_4) //如果掉电进入掉电处理
{
Flag |= LowPowerFlg;
DisplayFlg &= ~FirstFlg;
if((DisplayFlg & FirstFlg) == FirstFlg)
{
TACCTL0 &= ~CCIE; //不允许定时器A中断
TBCTL = TBSSEL_1 + MC_1; //定时器B 32768HZ 中断
TBCCTL0 = CCIE; //定时器B 中断允许
TBCCR0 = 32768; //定时时间1s
LPM3;
}
}*/
/* if((Flag & ReceiveDataFlg) == ReceiveDataFlg) //接受上位机数据后,解包的处理
{
_DINT();
unsigned char Counter;
unsigned char ii=0;
signed char j=0;
unsigned int k=0;
unsigned int digital=0;
CheckSum=0;
for(ii=0; ii<9; ii++)
{
for(j=0; j<4; j++)
{
TotalProTemp[ii][j]=0; //临时数组初始化
}
}
while(ReceviceBuff[ii++] != '~') ; //获取接收数据指令的长度
j = 0;
for(Counter=4; Counter<(ii-4); Counter++) //截取数据字符
{
CheckSum += ReceviceBuff[Counter];
if((ReceviceBuff[Counter] != ',')) //获取ASCII数据
{
{
TotalProTemp[k][j++] = ReceviceBuff[Counter];
}
}
else
{
k++;
j = 0;
}
}
CheckSum += ReceviceBuff[3];
CheckSum = CheckSum & 0X0F; //校验和
CheckSum |= 0X20;
if(CheckSum == ReceviceBuff[ii-2]) //发送正确数据指令接收完毕
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = AddressIndex[SelfAddress];
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = AddressIndex[SelfAddress];
SendData(CorrectCode,2);
UartCount = 0;
Flag &= ~ReceiveDataFlg;
for(ii=0; ii<10; ii++)
{
TotalPro[ii]=0;
}
for(ii=0; ii<9; ii++) //将ASCII数据转换成数值数据
{
Counter = 0;
for(j=3; j>=0; j--)
{
switch(TotalProTemp[ii][j])
{
case '0':
Counter++;
digital = 0;
break;
case '1':
Counter++;
digital = 1;
break;
case '2':
Counter++;
digital = 2;
break;
case '3':
Counter++;
digital = 3;
break;
case '4':
Counter++;
digital = 4;
break;
case '5':
Counter++;
digital = 5;
break;
case '6':
Counter++;
digital = 6;
break;
case '7':
Counter++;
digital = 7;
break;
case '8':
Counter++;
digital=8;
break;
case '9':
Counter++;
digital = 9;
break;
}
switch(Counter)
{
case 1:
k = 1;
TotalPro[ii+1] += digital * k;
break;
case 2:
k = 10;
TotalPro[ii+1] += digital * k;
break;
case 3:
k = 100;
TotalPro[ii+1] += digital * k;
break;
case 4:
k = 1000;
TotalPro[ii+1] += digital * k;
break;
}
}
}
if(ReceviceBuff[3] == 'k')
Plan = TotalPro[1];
else if(ReceviceBuff[3] == 'l')
Target = TotalPro[1];
else if(ReceviceBuff[3] == 'm')
Real = TotalPro[1];
}
else
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = AddressIndex[SelfAddress];
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = AddressIndex[SelfAddress];
SendData(ReTxdData,2); //要求重新发送
UartCount = 0;
Flag &= ~ReceiveDataFlg;
CommunicationErr = ReSendErr; //记录发送指令
}
_EINT();
}*/
_NOP();
_NOP();
_NOP();
}
}
void Init(void)
{
//利用P2、P3口实现按键扫描
_DINT();
SysInit(); //打开主震荡器
P1IE = 0XE0; //允许P1.6中断
P1SEL = 0X00; //无外部模块选择
P1IES = 0XE0; //下降沿触发
P1IFG = 0X00; //中断标志初始为0
P1DIR = 0X00; //P1口设置为输入口,p1.6可中断
//P1DIR = 0X80; //P1口设置为键盘输入口,可中断
//P1OUT |= P1OUT_7; // 八脚拉高。置位输出
P3DIR = 0X1F; //输出端口驱动LED
P3OUT = 0X10;
P3SEL = 0X30; //使用外部模块用于UART串行口通信
P5DIR = 0XFF; //输出端口驱动LED
P5OUT = 0X00;
P6DIR = 0X00; //监测p6.4电源端状态
TACTL = TASSEL_1 + MC_1; //定时器A 32768HZ 中断
TACCTL0 = CCIE; //允许定时器A中断
TACCR0 = 819; //定时时间为25ms
TBCTL = TBSSEL_1 + MC_1; //定时器A 32768HZ 中断
TBCCTL0 = CCIE; //允许定时器A中断
TBCCR0 = 165;
U0CTL &= ~SWRST; // Release USART
ME1 |= UTXE0 + URXE0; //使能RX TX
U0CTL = 0;
U0CTL = CHAR+PENA; //一位停止位\8位数据位\奇校验允许
U0TCTL = 0;
U0TCTL = SSEL1; //主时钟选择MCLK, 4MHZ
U0RCTL = URXEIE; //发送错误允许中断
IE1 |= URXIE0 ; //允许RX TX中断
U0BR0 = BaudRate[BaudDefault][0]; //默认波特率为 9600
U0BR1 = BaudRate[BaudDefault][1];
UMCTL0 = BaudRate[BaudDefault][2];
//Index = BaudDefault; //波特率索引
DisplayFlg |= FirstFlg;
Flag = SwitchOff; //启动标志
ConflictFlag |= SENDENABLE;
Plan =0; //计划
//Target =0; //目标
Real =0; //实绩
CounterForNumber = 0;
Counter = 0;
WatchRecevice =0;
ConflictTimer =0;
ScaleClock= -1; //标尺置位
_EINT();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -