回覆列表
  • 1 # 使用者5395983585097

    彙編編寫的模擬串列埠通訊程式

    T2作為波特率控制

    UART_RXD 是硬中斷0或1口,如果能進入中斷,說明該線有一個起始位產生,進入中斷後調

    用下面的接收程式。退出硬中斷之前還需要將硬中斷標誌重新復位。

    UART_TXD 是任何其它IO即可。

    UART_SEND:

    PUSH IE

    PUSH DPH

    PUSH DPL

    PUSH PSW

    PUSH 00H

    PUSH ACC

    CLR EA

    SETB UART_TXD ;START BIT

    MOV R0,A

    CLR TR2 ;TR2置1,計數器2啟動,時間計數啟動。

    MOV A,RCAP2L;計數器2重新裝載值

    MOV TL2,A ;置計數器2初值 ;T2需要重新裝載

    MOV A,DPH

    MOV A,RCAP2H

    MOV TH2,A

    MOV A,R0

    SETB TR2 ;TR2置1,計數器

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2

    CLR UART_TXD ;START BIT

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2

    MOV R0,#08H

    UART_SEND_LOOP:

    RRC A

    MOV UART_TXD,C ;8 BIT

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2

    DJNZ R0,UART_SEND_LOOP

    SETB UART_TXD ;END BIT

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2

    POP ACC

    POP 00H

    POP PSW

    POP DPL

    POP DPH

    POP IE

    RET

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    UART_REC:

    PUSH IE

    PUSH DPH

    PUSH DPL

    CLR EA

    CLR TR2 ;TR2置1,計數器2啟動,時間計數啟動。

    MOV A,RCAP2L;計數器2重新裝載值

    MOV TL2,A ;置計數器2初值 ;T2需要重新裝載

    MOV A,DPH

    MOV A,RCAP2H

    MOV TH2,A

    JB UART_RXD,$ ;REC

    SETB TR2 ;TR2置1,計數器2啟動,時間計數啟動。

    JNB TF2,$

    CLR TF2 ;0.5 BIT

    JNB TF2,$

    CLR TF2 ;1 BIT

    JNB TF2,$

    CLR TF2 ;1.5 BIT

    MOV C,UART_RXD

    MOV ACC.0,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;2.5

    MOV C,UART_RXD

    MOV ACC.1,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;3.5

    MOV C,UART_RXD

    MOV ACC.2,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;4.5

    MOV C,UART_RXD

    MOV ACC.3,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;5.5

    MOV C,UART_RXD

    MOV ACC.4,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;6.5

    MOV C,UART_RXD

    MOV ACC.5,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;7.5

    MOV C,UART_RXD

    MOV ACC.6,C

    JNB TF2,$

    CLR TF2

    JNB TF2,$

    CLR TF2 ;8.5

    MOV C,UART_RXD

    MOV ACC.7,C

    JNB TF2,$

    CLR TF2 ;9.5

    JNB UART_RXD,$ ;等待停止位,並重新復位計數器

    SETB UART_RXD

    POP DPL

    POP DPH

    POP IE

    RET

    補充回答:

    串列埠除錯

    1. 傳送:向總線上發命令

    2. 接收:從匯流排接收命令,並分析是地址還是資料。

    3. 定時傳送:從記憶體中取數並向主機發送.

    經過除錯,以上功能基本實現,可以透過上位機對微控制器進行實時控制。

    程式如下:

    //這是一個微控制器C51串列埠接收(中斷)和傳送例程,可以用來測試51微控制器的中斷接收

    //和查詢傳送,傳送沒有必要用中斷,因為程式的開銷是一樣的

    #include

    #include

    #include

    #define INBUF_LEN 4 //資料長度

    unsigned char inbuf1[INBUF_LEN];

    unsigned char checksum,count3 , flag,temp,ch;

    bit read_flag=0;

    sbit cp=P1^1;

    sbit DIR=P1^2;

    int i;

    unsigned int xdata *RAMDATA; /*定義RAM地址指標*/

    unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;

    void init_serialcomm(void)

    {

    SCON=0x50; //在11.0592MHz下,設定序列口波特率為9600,方式1,並允許接收

    PCON=0x00;

    ES=1;

    TMOD=0x21; //定時器工作於方式2,自動裝載方式

    TH0=(65536-1000)%256;

    TL0=(65536-1000)/256;

    TL1=0xfd;

    TH1=0xfd;

    ET0=1;

    TR0=1;

    TR1=1;

    // TI=0;

    EA=1;

    // TI=1;

    RAMDATA=0x1F45;

    }

    void serial () interrupt 4 using 3

    {

    if(RI)

    { RI=0;

    ch=SBUF;

    TI=1; //置SBUF空

    switch(ch)

    {

    case 0x01 :printf("A"); TI=0;break;

    case 0x02 :printf("B"); TI=0;break;

    case 0x03 :printf("C"); TI=0;break;

    case 0x04 :printf("D"); TI=0;break;

    default :printf("fg"); TI=0;break;

    }

    }

    }

    //向串列埠傳送一個字元

    void timer0() interrupt 1 using 3{

    // char i;

    flag++;

    TH0=0x00;

    TL0=0x00;

    if(flag==10)

    {// cp=!cp;

    // for(i=0;i

    P2=0x25;

    TI=1;

    temp=*RAMDATA;

    printf("%c",temp);

    TI=0;

    // RAMDATA--;

    flag=0;

    }

    }

    //主程式

    main()

    {

    init_serialcomm(); //初始化串列埠

    //向6264中送資料

    {

    *RAMDATA=0x33;

    }

    while(1)

    {

    *RAMDATA=0x33;;

    }

    }

    除錯需要注意的問題:

    1. 傳送過程:在傳送時必須保證TI=1:即傳送緩衝器為空,否則將導致資料發不出去,如果想強制傳送可以用:TI=1.具體傳送資料:利用printf(“abcd”);函式直接傳送即可。

    2. 接收過程:在接收時多選用中斷方式,這樣可以節約CPU的時間,提高效率,

  • 中秋節和大豐收的關聯?
  • 童話,電腦,鋼琴譜完整版?