宋 芳 張夢潔
摘要:工作在惡劣環(huán)境中的通訊設備,容易受到電磁干擾等因素的影響,出現(xiàn)程序跑飛、死機等現(xiàn)象,造成通訊中斷,且不能自行恢復正常工作,本文針對這一現(xiàn)象進行電路的硬件和軟件設計,通過監(jiān)聽串口數(shù)據(jù),對設備CPU進行斷電復位,從而使設備恢復正常工作,提高通訊可靠性。
關鍵詞:高可靠性通訊保護;串口監(jiān)聽;定時器;P89LPC915單片機
1概述:
在設計應用于工業(yè)現(xiàn)場的通訊設備時,例如無人值守的變電站抄表設備,應充分考慮設備的抗干擾性能,結合硬件和軟件兩方面進行優(yōu)化組合,在不可避免出現(xiàn)死機等嚴重故障時,設備應能夠可靠復位,重新開始工作。本設計中通過使用PHILIPS公司CPU芯片P89LPC915來監(jiān)控主CPU的對外通訊串行口,定期采集主CPU的發(fā)送腳TXD的狀態(tài),若在設定的時間內,TXD腳上的電平沒有變化,即可判定主CPU工作異常,此時控制主CPU完成掉電,然后上電
2系統(tǒng)硬件電路設計:
2.1電路原理圖

2.2電路分析
系統(tǒng)電源--在圖1中,U1和U2為電源管理芯片SPX3819M5-3.3,這是SIPEX公司的微功耗LDO,靜態(tài)電流為90uA,輸出電流為500mA,具有輸出使能和輸出短路保護功能,輸入電壓最大為20V,輸出電壓為3.3V,精度為1%. 在本應用中, SPX3819M5-3.3的3腳為輸出使能端,當該引腳上的電壓高于+2V,芯片輸出+3.3V; 當該引腳上的電壓低于+0.4V,芯片無輸出電壓。在圖中使用U1為U3供電,將U1的輸出使能端(U1的第3腳)連至+5V,使U1一直輸出+3.3V;使用U2為主CPU供電,U2的使能端受控于U3,在U3的控制下完成對主CPU的斷送電,實現(xiàn)主CPU的上電復位。
系統(tǒng)CPU——在圖1中,U3為PHLIPS公司的增強型51單片機P89LPC915,該芯片采用了高性能的處理器結構,指令執(zhí)行時間只需2到4個時鐘周期,速度是標準80C51芯片的6倍,具有2K可字節(jié)擦除的Flash存儲器和256字節(jié)的RAM數(shù)據(jù)存儲器,有可編程 I/O 口輸出模式-可配置為準雙向口,開漏輸出,推挽和僅為輸入功能。芯片內部還集成了許多系統(tǒng)級的功能,如片內的RC震蕩器、內部上電復位功能、內部看門狗、實時時鐘、波特率發(fā)生器、I2C接口、ICP接口等。芯片有DIP和TSSOP封裝,使用靈活方便,可靠性好,成本低。在本應用中CPU的P0.0、P0.1、P0.2、P0.3分別接主CPU的TXD0、TXD1、TXD2、TXD3四個發(fā)送端;P1.4用于控制電源管理芯片U2的輸出使能。CPU程序時刻采樣P0.0、P0.1、P0.2、P0.3的狀態(tài),如果在設定的時間內,P0.0、P0.1、P0.2、P0.3四個引腳的狀態(tài)一直為高電平,程序即認為主CPU通訊出現(xiàn)了異常,此時就在P1.4輸出低電平,將主CPU斷電,延時后重新上電,這就完成了主CPU的上電復位,主CPU恢復正常工作。
ICP接口——在圖1中,JP1為單片機P89LPC915的ICP接口,在電路板上設計有插座,將ICP編程器插在該插座上即可實現(xiàn)對單片機的在電路編程,可隨時升級程序。
工作指示-D1為紅色的發(fā)光二極管,它與CPU的P1.2口連接,可指示CPU的工作狀態(tài),方便調試。
開關機按鍵-S1為主CPU的復位上電按鍵,與CPU的P1.3口連接,程序判斷此引腳狀態(tài),完成主CPU的斷電和上電。
3系統(tǒng)軟件設計
系統(tǒng)的軟件設計分為CPU初始化、定時器設計、端口采樣函數(shù)、延時函數(shù)、看門狗定時器等幾部分,流程圖如下:

程序清單
#include "REG915.H"
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
staticint Count=0;
staticint Count1=0;
void init(void);
/**************初始**************/
void init(void)
{
DIVM=4;//相當于標準8051的晶振為12MHz的速度
P0M1=0x0F;//
P0M2=0x00;// p0.0--p0.3配置為僅為輸入口
P1M1=0x0C;//p1.2 p1.3 配置為開漏
P1M2=0x1C;// p1.4為推挽輸出
RTCH=0xFF;
RTCL=0xFF;//實時時鐘初值
RTCCON=0x00;//選擇CCLK為時鐘源
RTCCON=0x62;//0110 0011,時鐘中斷使能
TMOD=0x11;//定時器0和定時器1工作于16位模式
TAMOD=0x00;
TH0=0x00;//定時器初值
TL0=0x00;
TH1=0xfc;
TL1=0x18;
IP0H=0x48;
IP0=0x0A;//中斷優(yōu)先級
WDL=0xFF;//2.62s看門狗初值
WDCON=0xE5;//看門狗時鐘源為看門狗震蕩器,
WFEED1=0xA5;
WFEED2=0x5A;//清零序列
}
/*********看門狗清零序列*********/
void WatDog()
{
EA=0;
WFEED1=0xA5;
WFEED2=0x5A;
EA=1;
}
/*****************************/
/**********ms延時函數(shù)*********/
void Delay(unsigned int Time)
{
unsigned int j=0;
for(;Time>0;Time--)
{
for(j=0;j<256;j++)
{;}
}
}
/**************************/
/***實時時鐘中斷程序(定時復位)*****/
void RTC_int() interrupt 10
{
if(RTCCON==0xE3)//是實時時鐘中斷
{
Count++;
RTCCON = 0x63;
}
else
{
EA=0;
WFEED1=0xA5;
WFEED2=0x5A;
EA=1;
}
}
/***************************/
/***指示燈閃爍定時器*******/
void timer0() interrupt 1
{
TH0=0x00;
TL0=0x00;
Count1++;
if(Count1>=8)
{
P1_2=~P1_2;
Count1=0;
}
}
/***************************/
/****定時采集端口狀態(tài)*******/