📄 leddisp.c
字号:
#include<head.h>
void WordLoad(void);
/*---------------------------------------------------------------------------------*/
/* 通讯用的函数 */
/*---------------------------------------------------------------------------------*/
void COM(void);
void NAPCOMM(void);
void serial(void);
void WSBUF(unsigned char ch);
void ModbusCrc(unsigned char x);
/*---------------------------------------------------------------------------------*/
/* 显示用的函数 */
/*---------------------------------------------------------------------------------*/
void OUT(unsigned char start,unsigned char size);
/*---------------------------------------------------------------------------------*/
/* 通讯用的变量 */
/*---------------------------------------------------------------------------------*/
unsigned int idata CRC2;
unsigned int idata yafslong=0,yifslong=0;
unsigned char idata comml=0,crc=0,modbus0=0;
bit yxfs=0;
unsigned data T2MS=0;
/*---------------------------------------------------------------------------------*/
/* 内部变量 */
/*---------------------------------------------------------------------------------*/
unsigned char data ledcs=1;
unsigned char code dd[64]={0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x0F,0xE0,0x08,0x20,0x0F,0xE0,0x00,0x00,
0x7F,0xFC,0x40,0x04,0x4F,0xE4,0x48,0x24,0x48,0x24,0x4F,0xE4,0x40,0x14,0x40,0x08,0x08,0x02,0x08,0x02,0x14,0x12,0x13,0x12,0x21,0xD2,0x40,0x92,0xBF,0x12,0x21,0x12,
0x21,0x12,0x25,0x12,0x22,0x12,0x20,0x82,0x20,0x82,0x20,0x8A,0x1F,0x84,0x00,0x00};
unsigned char tempi=0;
unsigned char temp=0;
unsigned char timei=0;
unsigned char str[3]="上";
main()
{
AUXR=0x00;
IE=0X9A;
IP=0X02;
TMOD=0X11;
TH0=0XF8;TL0=0X2F;
TH1=0X9E;TL0=0X58;
TR0=1;TR1=1;
P1=0Xff;
XBYTE[0x2003]=0xff;
XBYTE[0x2001]=0xff;
XBYTE[0x2002]=0xFc;
XBYTE[0x2003]=0x3;
SCON=0x50;
TL2=0;TH2=0;T2CON=0x34; //串行口设置(用T2作为波特率发生定时器)
RCAP2H=0xFF;RCAP2L=0xDC;RS485=1;
de=1;
RS485=1;
WordCode[0]=0xb4;//str[0];
WordCode[1]=0xb4;//str[1];
for(;;){
}
}
void TimeInt0(void) interrupt 1
{
TH0=0XF8;TL0=0X2F;
P1=0XFF;
XBYTE[0x2001]=Character[temp];//+tempi*32];
XBYTE[0x2003]=Character[temp+8];//+1+tempi*32];
XBYTE[0x2000]=Character[temp+16];//+16+tempi*32];
XBYTE[0x2002]=Character[temp+24];///+17+tempi*32];
temp++;
P1=~ledcs;
//WordLoad();
ledcs=ledcs<<1;
if(ledcs==0){ledcs=1;temp=0;}
}
void TimeInt1(void) interrupt 3
{
TH1=0X9E;TL0=0X58;
modbus0++;
if(modbus0 >= 200) {comml=0;} //5s内没有后续报文,清空前面的报文
COM();
timei++;
//if(timei>80){timei=0;tempi=!tempi;}
if(timei>40){
char i;
char tempword;
timei=0;
tempword=Character[15];
for(i=15;i>0;i--)Character[i]=Character[i-1];Character[15]=tempword;
tempword=Character[31];
for(i=31;i>16;i--)Character[i]=Character[i-1];Character[31]=tempword;
}
}
void WordLoad(void)
{
}
void serial(void) interrupt 4
{
unsigned char ch;
if(RI)
{ //RTU模式接收
ch=SBUF;RI=0;modbus0=0;
if((comml==0)&&(ch!=de)) {return;}
if(comml < 255)commd[comml++]=ch;// {commd[comml]=ch;comml++;}
}
else if(TI)
{TI=0;
if(yxfs)
{SBUF=ssbuf[yifslong++];
if(yifslong==(yafslong+1))
{
yifslong=0;yafslong=0;
yxfs=0;RS485=1;
}
}
}
}
void COM(void)
{
unsigned int chh,addr,ch1;
unsigned char leng1,ch10;
while(comml>6)
{
if(commd[0]==de && (commd[1]==0x03 || commd[1]==0x06) ) {if(comml>=8) leng1 = 8; else return;}
else if(commd[0]==de && commd[1]==0x10 && commd[6]<0x60 ) {if(comml>=commd[6]+9) leng1=commd[6]+9;else return;}
else { NAPCOMM(); continue;}
for(ch1=0,CRC2=0xFFFF;ch1<leng1-2;ch1++) ModbusCrc(commd[ch1]); //计算crc
if((commd[comml-1]!=CRC2/256)||(commd[comml-2]!=CRC2%256)) {NAPCOMM();}
else {break;}
}
if (comml<=6) {return;}
addr=((commd[2]*256+commd[3]))*2; //开始地址
switch(commd[1])
{case 0x03:RS485=0; //开始发送数据
crc=0; //开始冒号
WSBUF(de);crc+=de; //设备号
WSBUF(0x03);crc+=3; //功能码
chh=2*(commd[4]*256+commd[5]);crc+=chh;WSBUF(chh); //
for(ch1=0;ch1<chh;ch1++)
{
// if(addr>=0x0040&&addr<=0x00A0) //浮点数字节倒序
// {if(addr%2==0) {ch10=XBYTE[0x8000+addr+1];}
// else {ch10=XBYTE[0x8000+addr-1];}
// }
//else {
ch10=XBYTE[0x8000+addr];//}
crc+=ch10;WSBUF(ch10);
addr=addr+1;
} //数据
for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
ModbusCrc(ssbuf[ch1]);
WSBUF(CRC2%256);WSBUF(CRC2/256);
SBUF=ssbuf[0];yifslong=1;yxfs=1;
break;
case 0x06:
if(addr == 0x00)
{}
else
{XBYTE[0x8000+addr]=commd[4]; //数据
XBYTE[0x8000+addr+1]=commd[5];}
OUT(0,1);
RS485=0;
crc=0; //开始冒号
WSBUF(de);crc+=de; //设备号
WSBUF(0x06);crc+=6; //功能码
ch1=commd[2];crc+=ch1;WSBUF(ch1); //开始地址
ch1=commd[3];crc+=ch1;WSBUF(ch1);
ch1=commd[4];crc+=ch1;WSBUF(ch1); //开始地址
ch1=commd[5];crc+=ch1;WSBUF(ch1);
for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
ModbusCrc(ssbuf[ch1]);
WSBUF(CRC2%256);WSBUF(CRC2/256);
SBUF=ssbuf[0];yifslong=1;yxfs=1;
break;
case 0x10:
RS485=0; //开始发送数据
crc=0; //开始冒号
WSBUF(de);crc+=de; //设备号
WSBUF(0x10);crc+=0x10; //功能码
ch1=commd[2];crc+=ch1;WSBUF(ch1);
ch1=commd[3];crc+=ch1;WSBUF(ch1);
ch1=commd[4];crc+=ch1;WSBUF(ch1);
ch1=commd[5];crc+=ch1;WSBUF(ch1);
for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
ModbusCrc(ssbuf[ch1]);
WSBUF(CRC2%256);WSBUF(CRC2/256);
SBUF=ssbuf[0];yifslong=1;yxfs=1;
chh=commd[6];
for(ch1=0;ch1<chh;ch1++)
{
/* if(addr>=0x0040&&addr<=0x00A0) //浮点数字节倒序
{
tempaddr = addr + ch1;
if(tempaddr >= 0x0040 && tempaddr < 0x0060)
{ if(ch1%2==0) {XBYTE[tempaddr+1+0x8000]=commd[7+ch1];}
else {XBYTE[tempaddr-1+0x8000]=commd[7+ch1];} }
else if(tempaddr >= 0x0060 && tempaddr < 0x00A0)
{
}
}
else {*/
XBYTE[addr+ch1+0x8000]=commd[7+ch1];//}
}
break;
}
comml=0;
}
void NAPCOMM(void) //将现在的报文第一个字符除去,并且找出后面第一个为站号的字符并且修整数组
{
unsigned int i14,pos1;
pos1 = 0;
for(i14=1;i14<comml;i14++) {if(commd[i14]==de) {pos1=i14;break;} }
if(pos1>0) {
for(i14=pos1;i14<comml;i14++) commd[i14-pos1]=commd[i14]; comml-=pos1; }
else {comml=0;}
}
void WSBUF(unsigned char ch) //单字节发送
{if(yafslong<0xff)ssbuf[yafslong++]=ch;}
void ModbusCrc(unsigned char x)
// modbus协议CRC校验, R7为输入校验字节,CRC2为校验字
{
unsigned char k,v;
CRC2=CRC2^x;
for(k=0;k<8;k++)
{
v=CRC2 %2;
CRC2=CRC2>>1;
if(v==1) {CRC2=CRC2^0xa001;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -