全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1443
推到 Plurk!
推到 Facebook!

請教一個有關89C51重置(RESET)的問題

缺席
nevertheless
一般會員


發表:4
回覆:7
積分:2
註冊:2005-06-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-02 12:03:11 IP:60.248.xxx.xxx 未訂閱
當89C51的RESET腳位被拉為HIGH時,產生重置, 程式從0000H位址開始執行! 但小弟用的是C語言, COMPILER過後,查看編譯後的組合語言, 小弟發現它的0000H位址跑了一個 "LJMP 0140H"的指令! 但小弟並未在C程式中加入此類的指令! 請問一下各位大大,小弟該如用用程式去改掉"LJMP"後面的位址??讓它指到我所希望的位址去??

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-02 12:25:44 IP:211.22.xxx.xxx 未訂閱
為何要改?它只是跳到放code的位址去而已. 一切 c compiler已經幫你規劃好了. 要改就要改compiler. 那這樣你用組語寫就好啦..幹麻還用C??
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
nevertheless
一般會員


發表:4
回覆:7
積分:2
註冊:2005-06-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-02 13:02:18 IP:60.248.xxx.xxx 未訂閱
上面的那一位大大... 因為它跳到不對的地方去了... 它沒有跳回到MAIN去執行... 而是跳到其中一個副函式去了... 造成我所執行的結果錯誤了... 因此才需要改變它...使它跳到正確的位址去執行...^^"

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-02 13:14:10 IP:211.22.xxx.xxx 未訂閱
方便的話, 請把你的程式碼po 上來. 這樣大家比較清楚問題所在, 謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-02 13:36:04 IP:59.104.xxx.xxx 未訂閱
如果這樣。這一題就不該叫 89C51重置的問題。 而是你對 c compiler & liner 不清楚。 要把問題寫清楚。。。。。 再來我們把畫面交給棚內主播。阿正。

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-02 14:15:30 IP:211.22.xxx.xxx 未訂閱
nevertheless兄: PO程式碼請縮排. 不知如何做請參考版規. 煩請修改配合, 謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
nevertheless
一般會員


發表:4
回覆:7
積分:2
註冊:2005-06-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-02 15:03:33 IP:60.248.xxx.xxx 未訂閱
抱歉...^^" 我在貼一次我的程式碼了... http://www.wretch.cc/album/show.php?i=nochange&b=3&f=1125640012&p=0  
#include 
sbit M_CLOCK = P1^6;
sbit M_DATA = P1^7;
unsigned char bank[70];                                
unsigned int Tptr = 0,Rptr = 0;                
unsigned char transflag = 0;                
unsigned char recflag = 0;                
void UART();                                        
void Microsoft();
unsigned char Micro_MSData();                
unsigned char Micro_HostData();                    void main()
{
        IE = 0x92;
        UART();
        //M_TEST = 0;
        Microsoft();
}    //==================   RS232 UART    ==================//
void UART()
{
        SM0=0;
        SM1=1;                                
        TMOD = 0x20;                 
        TH1 = 0xFD;             
        TL1 = 0xFD;
        TR1=1 ;                 
        REN=1 ;                                
}                     //====================  Microfoft ==========================//
void Microsoft()
{
        while(!transflag)
        {
                while(M_DATA){}
                if(!M_DATA)
                {
                        if(M_CLOCK)
                        {
                                bank[Rptr] = Micro_MSData();
                                Rptr = (Rptr 1)p;        
                        }
                        else if(!M_CLOCK)
                        {
                                bank[Rptr] = 0xBB;
                                Rptr = (Rptr 1)p;        
                                bank[Rptr] = Micro_HostData();
                                Rptr = (Rptr 1)p;        
                        }
                }
                TI = 1;                                                
        }
        while(1)
        {
                if(transflag == 1)                                        
                {
                        if(Tptr != Rptr)                
                        {
                                transflag = 0;                
                                SBUF = bank[Tptr];                
                                Tptr = (Tptr 1)p;        
                        }
                }
                while(M_DATA)
                {
                        if(transflag == 1)                                        
                        {
                                if(Tptr != Rptr)                
                                {
                                        transflag = 0;                
                                        SBUF = bank[Tptr];                
                                        Tptr = (Tptr 1)p;        
                                }
                        }
                }
                while(!M_DATA)
                {
                        if(M_CLOCK)
                        {
                                bank[Rptr] = Micro_MSData();
                                Rptr = (Rptr 1)p;                 
                        }
                        else if(!M_CLOCK)
                        {        
                                bank[Rptr] = 0xBB;
                                Rptr = (Rptr 1)p;        
                                bank[Rptr] = Micro_HostData();
                                Rptr = (Rptr 1)p;                
                                if(transflag == 1)                                        
                                {
                                        if(Tptr != Rptr)                
                                        {
                                                transflag = 0;                
                                                SBUF = bank[Tptr];                
                                                Tptr = (Tptr 1)p;        
                                        }
                                }        
                                while(M_DATA){}
                                bank[Rptr] = Micro_MSData();
                                Rptr = (Rptr 1)p;                 
                        }
                }
        }
}    //==============   Microsoft Mouse Data   ==================//
unsigned char Micro_MSData()
{        
        int i = 0;        
        unsigned char tmp = 0x00,tmp1 = 0x00;
        while(M_CLOCK){}                                        
        while(!M_CLOCK){}                                        
        while(M_CLOCK){}                                        
        while(M_CLOCK == 0 && i < 8)
        {
                tmp = tmp >> 1;                                                
                tmp1 = (M_DATA==1)?0x80:0x00;        
                tmp = tmp | tmp1;                                
                while(!M_CLOCK){}                                
                while(M_CLOCK){}                                
                  i;
        }
        while(!M_CLOCK){}                                        
        while(M_CLOCK){}                                        
        return tmp;
}    //==============   Microsoft Host Data   ==================//
unsigned char Micro_HostData()
{
        int i = 0;        
        unsigned char tmp;
        unsigned char tmp1;
        while(!M_CLOCK){}                                        
        while(M_CLOCK){}                                        
        while(!M_CLOCK){}                                        
        while(M_CLOCK && i<8)
        {        
                tmp = tmp >> 1;                                        
                tmp1 = (M_DATA==1)?0x80:0x00;        
                tmp = tmp | tmp1;                                                        
                while(M_CLOCK){}                                
                while(!M_CLOCK){}                                
                  i;
        }
        while(M_CLOCK){}                                        
        while(!M_CLOCK){}                                        
        while(M_CLOCK){}                                        
        while(!M_CLOCK){}                                        
        return tmp;
}    //==================  通訊中斷  ================//
void UART_ISR(void) interrupt 4
{
        TI = 0;
        transflag = 1;                // 傳送完畢,將flag設為1!
}    
發表人 - nevertheless 於 2005/09/02 15:19:13 發表人 - nevertheless 於 2005/09/02 15:26:19 發表人 - nevertheless 於 2005/09/02 15:31:15

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-02 17:48:17 IP:211.22.xxx.xxx 未訂閱
C:0140 裡面的code是??
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
nevertheless
一般會員


發表:4
回覆:7
積分:2
註冊:2005-06-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-02 17:54:50 IP:60.248.xxx.xxx 未訂閱
C:0410 程式碼的圖: http://www.wretch.cc/album/show.php?i=nochange&b=3&f=1125640013&p=1
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-02 18:01:56 IP:210.64.xxx.xxx 未訂閱
沒錯呀。 在 main 之前要先初始化資料。 ex. stack point.... 等等呀。 51 的初始化比較簡單啊。 你那幾行就是做這個事呀。 然後才會把控制權交到你寫的 main 啊。

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-02 18:50:01 IP:211.22.xxx.xxx 未訂閱
如同暗黑大仔說的..它在做初始化的動作.... 還有什麼問題嗎?
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
frederick
中階會員


發表:101
回覆:108
積分:66
註冊:2002-08-01

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-02 22:44:35 IP:59.104.xxx.xxx 未訂閱
有興趣可以去研究組譯器、編譯器怎麼寫。 有的compiler作法,除了前面版大所說stack point以外, 它還會把你所call的副程式的程式碼插在main()前面喔。 所以你看到的main()大概是很長位置以後了吧。
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-03 10:45:02 IP:59.114.xxx.xxx 未訂閱
您有void UART_ISR(void) interrupt 4 這函式所以必須要用到中斷向量表 reset 0h ... uart 23h 所以0h Ljmp xxxx 是很正常
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-09-03 11:17:18 IP:218.171.xxx.xxx 未訂閱
像我用組合語言寫,也習慣在00h 放jump指令跳到XXX的位址去 這樣有一個好處,可以避免覆蓋中斷位址

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-09-03 11:49:06 IP:203.203.xxx.xxx 未訂閱
另外,看了一下圖片. 您是用Keil C 寫的吧?稍微模擬一下就知道程式結果對不對了. 試試看吧!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-09-03 22:33:30 IP:59.114.xxx.xxx 未訂閱
http://www.spjsystems.com/sim51.htm 也可從上列網址下載wsim51 demo版2k限制模擬一下您的程式
系統時間:2024-05-17 12:51:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!