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

關於keil c for串列傳輸中斷的問題??

答題得分者是:
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-20 21:41:54 IP:61.70.xxx.xxx 未訂閱
如下是我試著寫一個8051串列傳輸的程式...其中我有用到串列傳輸中斷的副程式.... #include  main() { TMOD=0x20; //設定baud為9600bps TH1=0xfd; TL1=0xfd; TR1=1; SCON=0x50; //串列通訊於模式1 EA=1; //全部中斷源致能 ES=1; //串列中斷致能 while(1); } void seri() interrupt 4 { unsigned char tempsbuf; tempsbuf=SBUF; RI=0; } ============================================================ 但是當build為一個hex輸出檔時,會出現如下的錯誤!! Build target 'Target 1' linking... *** ERROR L121: IMPROPER FIXUP MODULE: main.obj (MAIN) SEGMENT: ABSOLUTE OFFSET: 0023H Program Size: data=10.0 xdata=0 code=43 Target not created ============================================================ 請問各位先進前輩??這是什麼原因呢??(我用相同的方式設計一個可以接收INT0中斷的程式就可以成功轉成HEX輸出檔....但是不知道為什麼改成串列中斷就不行!!!) 發表人 -

版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-20 22:08:08 IP:59.113.xxx.xxx 未訂閱
程式改成這樣就ok了:    
#include "io51.h"
void seri(void) interrupt 4
{
  unsigned char tempsbuf;
  tempsbuf=SBUF;
  RI=0;
}    main()
{
  TMOD=0x20; //設定baud為9600bps
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  SCON=0x50; //串列通訊於模式1
  EA=1; //全部中斷源致能
  ES=1; //串列中斷致能
  while(1);
}    P.S:(1)中斷宣告要擺前面
    (2)以後po程式請縮排,這樣大家比較好看,不知道如何做可以參考:
       http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48259    
------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-21 00:07:30 IP:61.70.xxx.xxx 未訂閱
謝謝先進的指導與批評.... 可是我加上"io51.h"的header後....還是錯誤,錯誤是說沒有定義像是SCON,TMOD的位址等....請問先進,io51.h在哪個目錄下呢??

版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-21 01:04:01 IP:59.113.xxx.xxx 未訂閱
嗯嗯~~忘了跟你說,你的所有暫存器都要定義. 我之前玩keil C有寫一個就是IO51.H,如下(這個檔案必須放在同一目錄):
#ifndef io51_HEADER_FILE
#define io51_HEADER_FILE 1    /*  BYTE Register  */
sfr P0   = 0x80;
sfr P1   = 0x90;
sfr P2   = 0xA0;
sfr P3   = 0xB0;
sfr PSW  = 0xD0;
sfr ACC  = 0xE0;
sfr B    = 0xF0;
sfr SP   = 0x81;
sfr DPL  = 0x82;
sfr DPH  = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0  = 0x8A;
sfr TL1  = 0x8B;
sfr TH0  = 0x8C;
sfr TH1  = 0x8D;
sfr IE   = 0xA8;
sfr IP   = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;    /*  BIT Register  *//*  PSW   */
sbit CY   = 0xD7;
sbit AC   = 0xD6;
sbit F0   = 0xD5;
sbit RS1  = 0xD4;
sbit RS0  = 0xD3;
sbit OV   = 0xD2;
sbit P    = 0xD0;    /*  TCON  */
sbit TF1  = 0x8F;
sbit TR1  = 0x8E;
sbit TF0  = 0x8D;
sbit TR0  = 0x8C;
sbit IE1  = 0x8B;
sbit IT1  = 0x8A;
sbit IE0  = 0x89;
sbit IT0  = 0x88;    /*  IE   */
sbit EA   = 0xAF;
sbit ES   = 0xAC;
sbit ET1  = 0xAB;
sbit EX1  = 0xAA;
sbit ET0  = 0xA9;
sbit EX0  = 0xA8;    /*  IP   */ 
sbit PS   = 0xBC;
sbit PT1  = 0xBB;
sbit PX1  = 0xBA;
sbit PT0  = 0xB9;
sbit PX0  = 0xB8;    sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;    sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;    /*  P3  */
sbit RD   = 0xB7;
sbit WR   = 0xB6;
sbit T1   = 0xB5;
sbit T0   = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD  = 0xB1;
sbit RXD  = 0xB0;    sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;    /*  SCON  */
sbit SM0  = 0x9F;
sbit SM1  = 0x9E;
sbit SM2  = 0x9D;
sbit REN  = 0x9C;
sbit TB8  = 0x9B;
sbit RB8  = 0x9A;
sbit TI   = 0x99;
sbit RI   = 0x98;    /*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8)   3
------------------------------------------------*/
#define IE0_VECTOR        0  /* 0x03 External Interrupt 0 */
#define TF0_VECTOR        1  /* 0x0B Timer 0 */
#define IE1_VECTOR        2  /* 0x13 External Interrupt 1 */
#define TF1_VECTOR        3  /* 0x1B Timer 1 */
#define SIO_VECTOR        4  /* 0x23 Serial port */    #define TF2_VECTOR        5  /* 0x2B Timer 2 */
#define EX2_VECTOR        5  /* 0x2B External Interrupt 2 */    #endif
 
這樣應該就ok了,寫這個有個好處,以後不用記位址,寫程式可以直接寫P1.P0.ACC...等等 當然這是我的寫法,你也可以依自己的習慣自己寫一個. ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-21 20:05:33 IP:61.70.xxx.xxx 未訂閱
請問先進....我加上IO51.H後還是如同之前一樣....出現相同的錯誤!!?? 是否請先進能夠說明ㄧ下從建立一個專案檔後....還有哪些設定是需要注意的??

版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-21 22:22:15 IP:59.113.xxx.xxx 未訂閱
1.New project-->選IC型號 2.開新檔案-->另存新檔,存成*.c 3.在左邊Souce group 按右鍵-->add files-->加入剛剛存的*.c 4.將上面的那一段程式定義貼到筆記本另存新檔成IO51.H,放到*.c同一目錄下 5.將下面的程式寫到*.c裡,compiler ok就可以開始寫你自己的code了    
#include "io51.h"
void main(void)
{
  P1=0x00;
  P2=0x00;
  IP=0x01;
  IE=0x87;
  while(1){};
}    void int1 (void) interrupt 2 using 1   /*int1中斷*/
{}    void timer0 (void) interrupt 1 using 1 /*計時器0中斷*/
{}    void int0 (void) interrupt 0 using 1  /*int0中斷*/
{}    void seril (void) interrupt 4 using 1 /*串列中斷*/
{}
------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-24 19:55:44 IP:61.70.xxx.xxx 未訂閱
謝謝前輩的指導....我已經試出來了!!!
系統時間:2024-04-20 23:13:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!