新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STC單片機IO管腳毀壞動態(tài)自檢程序

        STC單片機IO管腳毀壞動態(tài)自檢程序

        作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        #i nclude
        #i nclude
        #i nclude
        #i nclude
        #i nclude

        #pragma NOAREGS
        //STC ISP_V2.0 PCB的晶振為18.432MHz

        #define WdtTime_71_1mS0x30 //71.1mS
        #define WdtTime_141_2mS0x31 //141.2mS
        #define WdtTime_284_4mS0x32 //284.4mS
        #define WdtTime_568_8mS0x33 //568.8mS
        #define WdtTime_1_1377S0x34 //1.1377S
        #define WdtTime_2_755S0x35 //2.755S

        #define T2_5mS -1536*5//5ms 18.432MHz



        sfrAUXR= 0x8e;
        sfrWDTRST= 0xa6;
        sfr16 TIMEER2= 0xcc;
        sfr16 RCAP= 0xca;

        sfrWDT_CONTR = 0x0e1;

        //全局變量定義
        typedef struct Systemstruct{//系統(tǒng)數(shù)據(jù)結(jié)構(gòu)
        unsigned char TimeCount;
        unsigned intRamTest;
        unsigned char SioTxCount;
        unsigned char SioTxSum;
        unsigned char SioRxCount;
        unsigned char SioTxBuff[32];
        //unsigned char SioRxBuff[32];
        }SystemData;

        data SystemData SystemBuffers;//申請系統(tǒng)數(shù)據(jù)結(jié)構(gòu)






        void MainInit(void);//系統(tǒng)初始化
        void SystemInit(void);//系統(tǒng)初始化
        void SystemSetup(void);//系統(tǒng)設(shè)置
        void SystemIoInit(void);//系統(tǒng)接口初始化
        void TimeInit(void);//定時器定時參數(shù)設(shè)置
        void UserSetup(void);//用戶運行環(huán)境設(shè)置
        void ClrWdt(void);//喂狗
        void IoPinTest(void);
        unsigned char Port0Test(void);
        unsigned char Port1Test(void);
        unsigned char Port2Test(void);
        unsigned char Port3Test(void);



        void main(void)
        {
        MainInit();//系統(tǒng)初始化
        while (1) {//主循環(huán)
        IE|= 0xb2;//保證中斷可靠EA,ET2,ES,ET0
        TCON |= 0x55;//保證定時器開
        PCON |= SMOD_ + GF0_ + IDL_;//進入空閑狀態(tài)并喂軟件狗
        _nop_();
        _nop_();
        }
        }

        void MainInit(void) using 0//系統(tǒng)初始化
        {
        ClrWdt();//清除看門狗計數(shù)器
        SystemIoInit();//系統(tǒng)接口初始化
        SystemInit();//系統(tǒng)上電初始化
        SystemSetup();//系統(tǒng)運行環(huán)境設(shè)置
        UserSetup();//用戶運行環(huán)境設(shè)置
        }

        void SystemInit(void) using 0//系統(tǒng)初始化
        {
        if (SystemBuffers.RamTest != 0x55aa) {//內(nèi)存初始化
        SystemBuffers.RamTest = 0x55aa;
        }
        else {
        }
        }

        void SystemSetup(void) using 0//系統(tǒng)設(shè)置
        {
        TimeInit();
        }

        void SystemIoInit(void) using 0
        {
        IE = 0x00;//關(guān)閉中斷
        P2 = 0xff;//P2口初始化
        P0 = 0xff;//P0口初始化
        P1 = 0xff;//P1口初始化
        P3 = 0xff;//P3口初始化
        }


        void TimeInit() using 0
        {
        //TCON = 0x55;//啟動定時器

        TL0 = 0;
        TH0 = 0;
        TR0 = 1;//啟動定時器0

        TMOD = 0x20;
        TH1 =0xfb;//Fosc=18.432MHzth1=tl1=0xfb bps=9600
        TL1 =TH1;
        SCON = 0x58;
        PCON = 0x80;//2*bps=9600*2=19200
        TR1 = 1;//啟動定時器1

        TIMEER2 = T2_5mS;
        RCAP= T2_5mS;
        TR2= 1;//啟動定時器2
        }

        void UserSetup(void) using 0//用戶運行環(huán)境設(shè)置
        {
        SystemBuffers.SioTxCount = 0;
        }

        void ClrWdt(void)using 0//喂狗
        {
        WDT_CONTR = WdtTime_1_1377S;//1.1377S喂狗
        }



        unsigned char Port0Test(void)
        {
        unsigned char testval;
        P0 = 0x55;//奇數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval = P0 ^ 0x55;//比較發(fā)送及接收結(jié)果
        P0 = 0xaa;//偶數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval |= P0 ^ 0xaa;//比較發(fā)送及接收結(jié)果(2次的)
        P0 = 0xff;//釋放P0口,防止外部接入電源
        return testval;//測試成功返回0
        }



        unsigned char Port1Test(void)
        {
        unsigned char testval;
        P1 = 0x55;//奇數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval = P1 ^ 0x55;//比較發(fā)送及接收結(jié)果
        P1 = 0xaa;//偶數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval |= P1 ^ 0xaa;//比較發(fā)送及接收結(jié)果(2次的)
        P1 = 0xff;//釋放P1口,防止外部接入電源
        return testval;//測試成功返回0
        }


        unsigned char Port2Test(void)
        {
        unsigned char testval;
        P2 = 0x55;//奇數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval = P2 ^ 0x55;//比較發(fā)送及接收結(jié)果
        P2 = 0xaa;//偶數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval |= P1 ^ 0xaa;//比較發(fā)送及接收結(jié)果(2次的)
        P2 = 0xff;//釋放P2口,防止外部接入電源
        return testval;//測試成功返回0
        }



        unsigned char Port3Test(void)
        {
        unsigned char testval;
        P3 = 0x55;//奇數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval = P3 ^ 0x55;//比較發(fā)送及接收結(jié)果
        P3 = 0xaa;//偶數(shù)管腳發(fā)低電平
        _nop_();//延時
        testval |= P3 ^ 0xaa;//比較發(fā)送及接收結(jié)果(2次的)
        P3 = 0xff;//釋放P1口,防止外部接入電源
        return testval;//測試成功返回0
        }



        void IoPinTest(void)
        {
        unsigned char i, err = 0, pin = 0;
        //if (pin = Port0Test()) err = 1;//如果P0口上拉可開放此行
        if (pin = Port1Test()) err = 2;
        if (pin = Port2Test()) err = 3;
        if (pin = Port3Test()) err = 4;
        if (err) {
        if ((TI == 0) && (SystemBuffers.SioTxCount == 0)) {
        for (i = 0; i < 8; i++) {
        if (pin & 1) break;
        pin >>= 1;
        }
        strcpy(SystemBuffers.SioTxBuff, "P0_0 is Bad!!!");
        SystemBuffers.SioTxBuff[1] += err - 1;
        SystemBuffers.SioTxBuff[3] += pin;
        SystemBuffers.SioTxCount = strlen(SystemBuffers.SioTxBuff);
        SystemBuffers.SioTxSum = SystemBuffers.SioTxCount;
        TI = 1;
        }
        }
        }




        void t0proc() interrupt TF0_VECTOR using 1
        {
        }


        void t1proc() interrupt TF1_VECTOR using 1
        {
        }


        void t2proc() interrupt TF2_VECTOR using 0
        {
        TF2 = 0;
        if (PCON & GF0_) {//中斷是從主循環(huán)內(nèi)跳入的才能喂狗
        ClrWdt();//清除看門狗計數(shù)器
        PCON &= ~GF0_;//清除標志
        }
        IoPinTest();
        }


        void sioproc() interrupt SIO_VECTOR using 1
        {
        //unsigned char i;
        if (RI) {//接收中斷
        RI = 0;
        }
        if (TI) {//發(fā)送中斷
        TI = 0;
        if (SystemBuffers.SioTxCount) {//允許串口發(fā)送數(shù)據(jù)
        SBUF = SystemBuffers.SioTxBuff[SystemBuffers.SioTxSum - SystemBuffers.SioTxCount];//串口顯示
        SystemBuffers.SioTxCount --;
        }
        }
        }


        void int0proc() interrupt IE0_VECTOR using 0
        {
        }


        void int1proc() interrupt IE1_VECTOR using 0
        {
        }


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 射洪县| 霸州市| 普兰县| 沂水县| 航空| 合阳县| 温州市| 和平县| 南投市| 望谟县| 萨迦县| 广安市| 清新县| 习水县| 蕲春县| 成武县| 葫芦岛市| 韶山市| 当涂县| 库伦旗| 临洮县| 泸溪县| 鄂托克旗| 临西县| 鲁甸县| 象山县| 天柱县| 连云港市| 孟村| 巴东县| 商洛市| 瑞昌市| 沙田区| 得荣县| 中阳县| 盐城市| 焦作市| 安阳县| 炎陵县| 河源市| 永川市|