?? zhu1126_96.c.bak
字號(hào):
//修改為各自的函數(shù)
//2003.7.24,9:56
//模擬數(shù)據(jù)上傳,上層通信良好;下層通信沒(méi)做
//修改串口波特率容錯(cuò)沒(méi)做,(辦法為5分鐘沒(méi)收到數(shù)據(jù)就重新設(shè)置波特率),
//修改波特率等待數(shù)據(jù)發(fā)完才開(kāi)鎖,才進(jìn)行修改
//完成與AIDI模塊的通信,能實(shí)時(shí)上AIDI模塊的數(shù)據(jù)2003.7.31;10:59
#include"zhu_ini.h"
#include"zhu1126.h"
void Feed_watchdog() //喂狗
{
FeedDogFlag=0;
_nop_();
FeedDogFlag=1;
}
void Delay_nop0(uchar n)//n個(gè)nop延時(shí)
{
uchar data i;
for(i=0;i<n;i++)
{
_nop_();
}
}
uchar Read_ID() //讀ID號(hào)
{
return(XBYTE[0x2000]);
}
void baud_select(uchar channel_s,uchar baud_s)//波特率選擇
{
uchar data baud00,setmodem;
uint data dptr00;
switch(channel_s)
{
case 1:
dptr00=0xA000;
setmodem=0x36;
break;
case 2:
dptr00=0xA001;
setmodem=0x76;
break;
case 3:
dptr00=0xA002;
setmodem=0xB6;
break;
default:return;
}
switch(baud_s)
{
case 1:
baud00=96;
break; //1200
case 2:
baud00=48;
break; //2400
case 3:
baud00=24;
break; //4800
case 4:
baud00=12;
break; //9600
case 5:
baud00=6;
break; //19200
case 6:
baud00=3;
break; //38400
default:return;
}
XBYTE[0xA003]=setmodem; //計(jì)數(shù)器方式設(shè)置
XBYTE[dptr00]=baud00; //設(shè)置波特率
XBYTE[dptr00]=0; //高八位
}
void hex2asc0(uchar * asc2char,uchar chChar)
{
uchar data hByte,lByte;
hByte=( chChar & 0xF0 )>>4;
lByte=( chChar & 0x0F );
if(hByte>=0 && hByte<10)
{
*asc2char++ = hByte + 48;
}
else if (hByte>9 && hByte<16)
{
*asc2char++ = hByte + 55;
}
if(lByte>=0 && lByte<10)
{
*asc2char++ = lByte + 48;
}
else if (lByte>9 && lByte<16)
{
*asc2char++ = lByte + 55;
}
}
void hex2asc1(uchar * asc2char,uint chInt)
{
uchar data hhByte,hlByte,lhByte,llByte;
hhByte=( chInt & 0xF000 )>>12;
hlByte=( chInt & 0x0F00 )>>8;
lhByte=( chInt & 0x00F0 )>>4;
llByte=( chInt & 0x000F );
if(hhByte>=0 && hhByte<10)
{
*asc2char++ = hhByte + 48;
}
else if (hhByte>9 && hhByte<16)
{
*asc2char++ = hhByte + 55;
}
if(hlByte>=0 && hlByte<10)
{
*asc2char++ = hlByte + 48;
}
else if (hlByte>9 && hlByte<16)
{
*asc2char++ = hlByte + 55;
}
if(lhByte>=0 && lhByte<10)
{
*asc2char++ = lhByte + 48;
}
else if (lhByte>9 && lhByte<16)
{
*asc2char++ = lhByte + 55;
}
if(llByte>=0 && llByte<10)
{
*asc2char++ = llByte + 48;
}
else if (llByte>9 && llByte<16)
{
*asc2char++ = llByte + 55;
}
}
void InterruptInt0() interrupt 0 using 1 //外部中斷0
{
uchar data state,ReceByte;
bit tempFlag0,tempFlag1;
tempFlag1 = RamRom_Convert;
tempFlag0 = RamIO_Convert; //保護(hù)地址狀態(tài)
RamRom_Convert=1; //128RAM
RamIO_Convert=1; //切換RAM與端口
state=XBYTE[0x4001]; //port1c;
if( state & 2 ) //接收狀態(tài)
{
ReceByte = XBYTE[0x4000];
if( ReceCount1 >= MaxRece1 )
{
ReceCount1 = 0; //接收計(jì)數(shù)器循環(huán)
}
else if( ReceByte != 13 ) //'\r'=13
{
ReceSbuf1[ReceCount1++]=ReceByte;
led2Flag=0; //正在接收點(diǎn)亮通信燈
}
else
{
ReceSbuf1[ReceCount1++]=ReceByte;
ReceEndFlag1=1; //收到一包數(shù)據(jù)
}
}
//數(shù)據(jù)接收
else if( (state & 1) && SendingFlag1 ) //發(fā)送狀態(tài)
{
NoReceFlag = 0; //沒(méi)有發(fā)送標(biāo)準(zhǔn)位置一(有發(fā)送)
bNeedSend1 = 0; //啟動(dòng)發(fā)送標(biāo)志位清零
if ( SendCount1 >= MaxSend1 ) //關(guān)閉發(fā)送,越界不發(fā)送
{
SendingFlag1 = 0; //發(fā)完一包數(shù)據(jù)
#ifdef OpenEn
SendEn&=0xFD; //模擬開(kāi)關(guān)不切換
#else
for(state=0;state<100;state++)
{
_nop_();
} //關(guān)閉發(fā)送中斷使能,關(guān)閉模擬開(kāi)關(guān)
SendEn&=0xF9; //D5:繼電器控制位,D3:發(fā)送進(jìn)外部中斷,D2:模擬開(kāi)關(guān),D1:發(fā)送進(jìn)外部中斷0
#endif
XBYTE[0xE000]=SendEn;
}
else if( SendSbuf1[SendCount1] != 10 ) //'\n'=10
{
XBYTE[0x4000]=SendSbuf1[SendCount1++];
SendingFlag1=1; //正在發(fā)送數(shù)據(jù)
led2Flag=0; //正在發(fā)送點(diǎn)亮通信燈
}
else //
{
SendingFlag1 = 0; //發(fā)完一包數(shù)據(jù)
#ifdef OpenEn
SendEn&=0xFD; //模擬開(kāi)關(guān)不切換
#else
for(state=0;state<100;state++)
{
_nop_();
} //關(guān)閉發(fā)送中斷使能,關(guān)閉模擬開(kāi)關(guān)
SendEn&=0xF9; //D5:繼電器控制位,D3:發(fā)送進(jìn)外部中斷,D2:模擬開(kāi)關(guān),D1:發(fā)送進(jìn)外部中斷0
#endif
XBYTE[0xE000]=SendEn;
}
}
ledled=AddLed; //更換指示燈
RamRom_Convert= tempFlag1;
RamIO_Convert = tempFlag0; //恢復(fù)地址狀態(tài)
}
void InterruptInt1() interrupt 2 using 1 //外部中斷1
{
uchar data state,ReceByte;
bit tempFlag0,tempFlag1;
tempFlag1 = RamRom_Convert;
tempFlag0 = RamIO_Convert; //保護(hù)地址狀態(tài)
RamRom_Convert=1; //128RAM
RamIO_Convert=1; //切換RAM與端口
state=XBYTE[0x6001]; //port1c;
if(state&2) //接收狀態(tài)
{
ReceByte=XBYTE[0x6000];
if( ReceCount2 >= MaxRece2 )
{
ReceCount2 = 0; //接收計(jì)數(shù)器循環(huán)
}
else if( ReceByte != 13 ) //'\r'=13
{
ReceSbuf2[ReceCount2++] = ReceByte;
led2Flag = 0; //正在接收點(diǎn)亮通信燈
}
else
{
ReceSbuf2[ReceCount2++]=ReceByte;
ReceEndFlag2=1; //收到一包數(shù)據(jù)
}
}
else if( state & 1 &&SendingFlag2 ) //發(fā)送狀態(tài)
{
NoReceFlag = 0; //沒(méi)有發(fā)送標(biāo)志位置一(有發(fā)送)
bNeedSend2 = 0; //啟動(dòng)發(fā)送標(biāo)志位清零
if ( SendCount2 >= MaxSend2 )
{
SendCount2 = 0;
SendingFlag2=0; //發(fā)完一包數(shù)據(jù)
#ifdef OpenEn
SendEn&=0xDF; //繼電器不切換
#else
for(state=0;state<100;state++)
{
_nop_();
_nop_();
} //關(guān)閉發(fā)送中斷使能,關(guān)閉模擬開(kāi)關(guān)
SendEn&=0xD7; //D5:繼電器控制位,D3:發(fā)送進(jìn)外部中斷,D2:模擬開(kāi)關(guān),D1:發(fā)送進(jìn)外部中斷0
#endif
XBYTE[0xE000]=SendEn;
}
else if( SendSbuf2[SendCount2] != 10 ) //'\n'=10
{
XBYTE[0x6000]=SendSbuf2[SendCount2++];
SendingFlag2=1; //正在發(fā)送數(shù)據(jù)
led2Flag=0; //正在發(fā)送點(diǎn)亮通信燈
}
else //
{
SendingFlag2=0; //發(fā)完一包數(shù)據(jù)
#ifdef OpenEn
SendEn&=0xDF; //繼電器不切換
#else
for(state=0;state<100;state++)
{
_nop_();
_nop_();
} //關(guān)閉發(fā)送中斷使能,關(guān)閉模擬開(kāi)關(guān)
SendEn&=0xD7; //D5:繼電器控制位,D3:發(fā)送進(jìn)外部中斷,D2:模擬開(kāi)關(guān),D1:發(fā)送進(jìn)外部中斷0
#endif
XBYTE[0xE000]=SendEn;
}
}
ledled=AddLed; //更換指示燈
RamRom_Convert= tempFlag1;
RamIO_Convert = tempFlag0; //恢復(fù)地址狀態(tài)
}
void InterruptT1() interrupt 3 using 2 //50ms定時(shí)1中斷
{
static uchar xdata ledcount0;
static uchar xdata ledcount1;
static uchar xdata ledcount2;
static uchar xdata ledcount3;
bit tempFlag0,tempFlag1;
tempFlag1 = RamRom_Convert;
tempFlag0 = RamIO_Convert; //保護(hù)地址狀態(tài)
RamRom_Convert=1; //128RAM
RamIO_Convert=1;//切換RAM與端口
TL1 = 0xFA;
TH1 = 0x3C;
if( lockFlagDn ) //要求延時(shí),枷鎖
{
if( DelayCount++>=DelayNms ) //延時(shí)N個(gè)50ms
{
DelayCount=0;
lockFlagDn=0;
} //延時(shí)時(shí)間解鎖
}
else DelayCount=0;
if( ReceConFlag ) //收到控制命令閃
{
if(ledcount2++>4) //控制燈閃
{
led3Flag=!led3Flag;
ledcount2=0;
}
if(ledcount3++>15) //閃燈八次
{
ledcount3=1;
ReceConFlag=0;
}
}
else ledcount2=0;
if(ledcount0++>4) //運(yùn)行燈閃
{
led1Flag=!led1Flag;
ledcount0=0;
}
if(ledcount1++>1) //通信燈滅
{
led2Flag=1;
ledcount1=0;
}
if(ZhengChCount++>1105*ZhengChJianGe) //曲線歷史記錄定時(shí)*20*60
{
ZhengChFlag = 1; //保存正常歷史記錄間隔為10分鐘)
ZhengChCount = 0; //,測(cè)試為1分鐘(768/6/24=5.3天
}
if( NoReceFlag == 1 ) //20分鐘沒(méi)收發(fā)送數(shù)據(jù),保存20*60*10=12000
{ //256/2/24=5.3天,測(cè)試為2分鐘
if ( ReBaudCount++ > 1105*DuanKaiJianGe )//56次就一分鐘了
{
ReBaudCount = 0;
ReBaudFlag = 1; //保存斷開(kāi)歷史記錄
}
}
else ReBaudCount=0;
if(KuaiShFlag) //測(cè)試512壞,控制燈快閃
{
led3Flag=!led3Flag;
if(led3Kuai++>150)
{
led3Kuai=0;
KuaiShFlag=0;
led3Flag=1; //閃燈后滅
}
}
if(ManShFlag) //測(cè)試512好,控制燈慢閃
{
led3Man++;
if(led3Man%10==0)
{
led3Flag=!led3Flag;
if(led3Man>150)
{
led3Man=0;
ManShFlag=0;
led3Flag=1; //閃燈后滅
}
}
}
NoReceFlag = 1; //在外部中斷函數(shù)里清零,定時(shí)器中斷函數(shù)置一;
//不進(jìn)外部中斷發(fā)送狀態(tài),不發(fā)標(biāo)準(zhǔn)位就一直為一
ledled=AddLed;
RamRom_Convert= tempFlag1;
RamIO_Convert = tempFlag0; //恢復(fù)地址狀態(tài)
}
void InterruptS() interrupt 4 using 3 //串口中斷
{
uchar data ReceByte; //不對(duì)端口操作,不用保護(hù)端口狀態(tài)
bit tempFlag0,tempFlag1;
tempFlag1 = RamRom_Convert;
tempFlag0 = RamIO_Convert; //保護(hù)地址狀態(tài)
RamRom_Convert=1; //128RAM
RamIO_Convert=1; //切換RAM與端口
if( RI ) //接收狀態(tài)
{
RI=0;
ReceByte=SBUF;
if ( ReceCount0 >= MaxRece0 ) //最大接收緩沖區(qū)
{
ReceCount0 = 0;
}
else if ( ReceByte != 0x0D )
{
ReceSbuf0[ReceCount0++]=ReceByte;
}
else
{
ReceSbuf0[ReceCount0++]=ReceByte;
ReceEndFlag0=1;
}
}
else //發(fā)送狀態(tài)
{
TI=0;
if ( SendCount0 >= MaxSend0 ) //發(fā)送緩沖區(qū)要越界,結(jié)束發(fā)送
{
SendCount0 = 0; //發(fā)完一包數(shù)據(jù)
TB8=1; //發(fā)送完,以便下次發(fā)送地址
}
else if ( SendSbuf0[SendCount0] != 0x0A )
{
_nop_();
SBUF=SendSbuf0[SendCount0++];
TB8=0;
}
else
{ //發(fā)完一包數(shù)據(jù)
TB8=1; //發(fā)送完,以便下次發(fā)送地址
}
}
RamRom_Convert= tempFlag1;
RamIO_Convert = tempFlag0; //恢復(fù)地址狀態(tài)
}
void Analyse0() //下行通信解析函數(shù)
{
uint i,ReceCheck,SumCheck;//,broadid;
uint length = 0;
ReceEndFlag0 = 0; //結(jié)束完標(biāo)志位清零
lockFlagDn = 0; //開(kāi)鎖
for( i = 0;i < MaxRece0;i++ ) //計(jì)算包長(zhǎng)度
{
if( ReceSbuf0[i] == '\r')
{
length = i + 1; //數(shù)據(jù)包長(zhǎng)度
break;
}
}
if( length < 10) //無(wú)效數(shù)據(jù)包
{
ReceCount0=0; //串口0接收計(jì)數(shù)器清零
return;
}
SumCheck=CrcCheck( ReceSbuf0,length-5 );//crc讀取
ReceCheck=4096 * toint(ReceSbuf0[length-5]) + 256*toint(ReceSbuf0[length-4]) + 16*toint(ReceSbuf0[length-3]) + toint(ReceSbuf0[length-2]);
if( SumCheck != ReceCheck) //crc校驗(yàn)
{
return;
}
ReceCheck = 4096*toint(ReceSbuf0[3]) + 256*toint(ReceSbuf0[4]) + 16*toint(ReceSbuf0[5]) + toint(ReceSbuf0[6]);
if(ReceCheck != length-12) //長(zhǎng)度校驗(yàn)
{
return;
}
ReceCheck = 16 * toint(ReceSbuf0[1]) + toint(ReceSbuf0[2]);
if(ReceCheck != RTdataAns)
{
return; //非實(shí)時(shí)數(shù)據(jù)響應(yīng)
}
switch( ReceSbuf0[0] ) //收到是那塊從模塊信息
{
case 0x1F://0: //AIDI有AIDI量
FalseTime0 = 0; //錯(cuò)誤次數(shù)清零
memcpy( RealTimeData+6, ReceSbuf0+11, 44 ); //AI量
memcpy( RealTimeData+12+AIsum, ReceSbuf0+59, B00DI/2 ); //DI量
break;
case 0x1E://1: //電池板只有AI量
FalseTime1 = 0; //錯(cuò)誤次數(shù)清零
memcpy( RealTimeData+50, ReceSbuf0+11, B11AI*4 ); //AI量
break;
case 0x1D://2: //電池板只有AI量
FalseTime2 = 0; //錯(cuò)誤次數(shù)清零
memcpy( RealTimeData+178, ReceSbuf0+11, B22AI*4 ); //AI量
break;
case 0x1C://3: //IP板
FalseTime3 = 0; //錯(cuò)誤次數(shù)清零
memcpy( RealTimeData+306, ReceSbuf0+11, B33AI*4 ); //AI量
memcpy( RealTimeData+12+AIsum+B00DI/2, ReceSbuf0+15+B33AI*4, B33DI/2 ); //DI量
break;
default :
break;
}
//2003.12.11;11:46 modify
RealTimeData[0]=0x38; //AI標(biāo)號(hào)
RealTimeData[1]=0x30;
hex2asc1(RealTimeData+2,75+B33AI); //AI通道數(shù)
RealTimeData[AIsum+6]=0x38; //DI標(biāo)號(hào)
RealTimeData[AIsum+7]=0x31;
hex2asc1(RealTimeData+AIsum+8,(8+B33DI)/4); //DI通道數(shù),壓縮
ReceCount0=0; //串口0接收計(jì)數(shù)器清零
}
void Analyse1()
{
uchar data j,i,data00;
uint data kk,TemLen,kk0;
uchar readID, state, length, ReceLen, typeCom,RTclock[6];
uint SumCheck, ReceCheck;
ReceEndFlag1 = 0;
if( ReceSbuf1[0] != 0x7E ) //沒(méi)有數(shù)據(jù)包頭
{
memset( ReceSbuf1, 0, 50 ); //串口1接收緩沖區(qū)清零
ReceCount1 = 0; //串口1接收計(jì)數(shù)器清零
return;
}
for( i = 0;i < MaxRece1;i++ ) //計(jì)算包長(zhǎng)度
{
if( ReceSbuf1[i] == '\r')
{
length = i+1;
break;
}
}
if( length < 10 && length > 60 ) //無(wú)效數(shù)據(jù)包
{
memset( ReceSbuf1, 0, 40 ); //串口1接收緩沖區(qū)清零
ReceCount1 = 0; //串口1接收計(jì)數(shù)器清零
return;
}
readID = toint( ReceSbuf1[5] ) * 16 + toint( ReceSbuf1[6] );
if( readID != Read_ID() ) //采集箱的ID號(hào)校驗(yàn)
{
memset( ReceSbuf1, 0, 50 ); //串口1接收緩沖區(qū)清零
ReceCount1 = 0; //串口1接收計(jì)數(shù)器清零
return;
}
SendSbuf1[SendCount1++] = '\r'; //結(jié)束上次發(fā)送(最好發(fā)送)
SendSbuf1[SendCount1] = '\n'; //結(jié)束上次發(fā)送(結(jié)束發(fā)送)
state = 0; //返回狀態(tài)
if( ReceSbuf1[0] != 0x7E ) state = 1; //起始符校驗(yàn)
if( ReceSbuf1[1] != VERh && ReceSbuf1[2] != VERl)
{ //版本號(hào)校驗(yàn)
state = 2;
}
/*
if( ReceSbuf2[18] >0x36 || ReceSbuf2[19] >0x36 || ReceSbuf2[21] >0x36 || ReceSbuf2[23] >0x36 || ReceSbuf2[25] >0x36)
{
state = 10; //日期時(shí)間錯(cuò)
return;
}*/
SumCheck=CrcCheck( ReceSbuf1+1,length-6 ); //計(jì)算CRC //接收CRC
ReceCheck=4096 * toint( ReceSbuf1[length-5] )+256 * toint( ReceSbuf1[length-4] )+16 * toint( ReceSbuf1[length-3] )+toint( ReceSbuf1[length-2] );
if( SumCheck != ReceCheck ) state=5; //crc校驗(yàn)
ReceLen = 0x10*toint( ReceSbuf1[13] ) + toint( ReceSbuf1[14] );
if(ReceLen != length-20) state=4; //數(shù)據(jù)塊長(zhǎng)度
typeCom = 16 * toint( ReceSbuf1[7] ) + toint( ReceSbuf1[8] );
TemLen = 0;
if(KaiJiShZhFlag) //開(kāi)機(jī)時(shí)鐘校正
{
for(i = 0;i < 12;) //更新時(shí)鐘
{
RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
i+=2;
}
setup_write(); //設(shè)置實(shí)時(shí)時(shí)鐘操作方式
clock_write(RTclock); //修改時(shí)鐘命令
KaiJiShZhFlag=0;
}
switch( typeCom )
{
case ResetCom: //系統(tǒng)復(fù)位命令
typeCom = ResetAns;
TemLen = 20 + 12;
ResetAnsFlag = 1; //復(fù)位標(biāo)志位置一
break;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -