新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于串口通信中斷和查詢方式

        關于串口通信中斷和查詢方式

        作者: 時間:2016-11-21 來源:網絡 收藏
        網上找了不少串口方面的資料,國內的資料都沒有提到如何用中斷方式來實現串口數據發送。其實,采用中斷方式實現串口數據發送和采用中斷方式實現串口數據接收的過程差不多,都需要開放8259的IRQ3或IRQ級中斷,并需要設定modem控制寄存器使OUT2輸出低電平,設置中斷允許寄存器開放發送和接收中斷。

        這里有一點需要注意,《The Art of assembly language programming》中提到,發送寄存器為空時串口會產生中斷,但是只會產生一次,書中采用的解決辦法是通過IO端口直接寫入發送保持寄存器,此時發送完畢后串口便又會產生“發送保持寄存器為空”中斷。(就是每次發送前都設置中斷允許寄存器),從實際效果來看是可以的。

        本文引用地址:http://www.104case.com/article/201611/319243.htm


        51單片機串口通信(含代碼)


        串口調試

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

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

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

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

        程序如下:

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

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

        #i nclude

        #i nclude

        #i nclude

        #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;

        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)%6;

        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<6;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的時間,提高效率,




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丰城市| 太和县| 中西区| 呼伦贝尔市| 专栏| 海口市| 乌恰县| 天等县| 博野县| 富阳市| 宾阳县| 重庆市| 类乌齐县| 开封县| 水城县| 崇信县| 治多县| 华阴市| 崇州市| 绥德县| 富宁县| 三穗县| 綦江县| 上栗县| 锦州市| 措美县| 新兴县| 额尔古纳市| 分宜县| 中卫市| 得荣县| 天镇县| 增城市| 元朗区| 铁岭县| 大冶市| 仪陇县| 望谟县| 巴里| 海林市| 藁城市|