• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機與串口通信代碼

    51單片機與串口通信代碼

    作者: 時間:2011-08-13 來源:網絡 收藏

    串口調試

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

    2. 接收:從總線接收命令,并分析是地址還是數據。

    3. 定時發送:從內存中取數并向主機發送.

    經過調試,以上功能基本實現,目前可以通過上位機對單片機進行實時控制。

    程序如下:

    //這是一個單片機C51串口接收(中斷)和發送例程,可以用來測試的中斷接收

    //和查詢發送,另外我覺得發送沒有必要用中斷,因為程序的開銷是一樣的

    #i nclude reg51.h>

    #i ncludestdio.h>

    #i nclude string.h>

    #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;i6;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(“akjdfaklfj”);函數直接發送即可。

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



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 久治县| 承德县| 金山区| 聂拉木县| 吉首市| 蛟河市| 垫江县| 安顺市| 柳江县| 保亭| 巫溪县| 句容市| 康平县| 青龙| 涪陵区| 吴桥县| 邯郸县| 南华县| 东辽县| 武宣县| 淳化县| 梓潼县| 东乡族自治县| 施秉县| 板桥市| 额敏县| 突泉县| 渝中区| 金阳县| 桑植县| 浑源县| 土默特左旗| 家居| 略阳县| 汶上县| 武冈市| 女性| 景谷| 东丰县| 句容市| 柳州市|