新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stc單片機不斷電下載程序

        stc單片機不斷電下載程序

        作者: 時間:2012-08-04 來源:網絡 收藏

        支持串口isp程序下載,不必使用專用下載器,僅使用串口就能。但每次都要斷電再上電,比較麻煩。
        下面介紹一種不需斷電就能的方法,在程序調試時比較方便。
        基本原理:
        有專用的復位寄存器,通過對該寄存器寫入不同的數值可以實現單片機熱啟動復位。
        寄存器功能如下圖所示:

        點擊瀏覽下一頁

        由上圖可以看出只要滿足某個條件,向ISP_CONTR寫入0x60,就可以實現從ISP監控區軟啟動啟動
        某個條件設置為:當串口接收到0xaa數據時,單片機執行ISP_CONTR=0x60; 指令,從ISP監控區軟啟動啟動。
        演示程序如下:

        //*************************STC12C5410AD軟啟動演示**************************
        //
        //收到0xaa,從ISP監控區軟啟動,利用該特性,可以實現下載
        //收到0x55,從用戶程序區啟動
        //2010年3月13日21:58:49
        //************************************************************

        *************
        #include STC12C5410AD.H>
        uint c;
        //*************** 函數定義 ******************
        void delay1ms(unsigned int j);
        void senddata(uchar dc);
        //*************** 主程序 ********************
        void main(void)
        {
        ///******************
        TMOD|=0x20;
        SCON=0x50;
        TH1=0xfd; //12T時鐘9600bps
        TL1=0xfd;
        TR1=1;
        ES=1;
        EA=1;
        AUXR=AUXR|0x40; //定時器1使用1T時鐘 9600*12=115200bps
        ///******************
        delay1ms(30000);
        for(c=0;c256;c++)
        {
        senddata(c);
        delay1ms(200);
        }
        while(1)
        {

        }
        }
        //***************************發送數據**************************
        void senddata(uchar dc)
        {
        SBUF=dc;
        while(!TI); //當TI=0時,發送未結束,循環等待
        TI=0; //當TI=1時,發送結束,用軟件將TI清零
        }
        void uart(void) interrupt 4
        {
        uchar cdd;
        if(RI)
        {
        RI=0;
        cdd=SBUF;
        if(cdd==0xaa)
        {
        ISP_CONTR=0x60; //軟復位,從ISP監控區啟動
        }
        else if(cdd==0x55)
        {
        ISP_CONTR=0x20; //軟復位,從用戶程序區啟動
        }
        else
        {
        senddata(cdd);
        }
        }
        else
        {
        TI=0;
        }
        }
        //*************************延時 n*1ms********************
        void delay1ms(unsigned int j)
        {
        unsigned int i;
        for(;j>0;j--)
        { for(i=0;i124;i++)
        {;}
        }
        }

        單片機相關文章:單片機教程


        c++相關文章:c++教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理



        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 望奎县| 遂平县| 台北市| 余姚市| 微博| 海阳市| 上犹县| 潜江市| 馆陶县| 梅河口市| 阜南县| 遂宁市| 错那县| 武定县| 弥勒县| 永川市| 阿合奇县| 芜湖县| 介休市| 且末县| 宣汉县| 郎溪县| 东阳市| 长顺县| 洪泽县| 隆尧县| 原阳县| 宝坻区| 镇江市| 平远县| 扎鲁特旗| 德州市| 岢岚县| 玉环县| 兰考县| 兴义市| 房产| 三明市| 临清市| 宜春市| 临海市|