新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機學習筆記外部中斷,定時器,串口中斷

        單片機學習筆記外部中斷,定時器,串口中斷

        作者: 時間:2016-11-20 來源:網絡 收藏
        CPU收到中斷請求,停下正在處理的工作A,去處理事件B,處理完后繼續回到中斷的地方繼續執行事件A的過程,稱為中斷

        51有5個中斷源外部中斷0定時計數中斷0外部中斷1定時繼續中斷1串口中斷

        MCS-51單片機中斷系統的結構:

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

        5個中斷源的符號、名稱及產生的條件如下。

        INT0:外部中斷0,由P3.2端口線引入,低電平或下跳沿引起。

        INT1:外部中斷1,由P3.3端口線引入,低電平或下跳沿引起。

        T0:定時器/計數器0中斷,由T0計滿回零引起。

        T1:定時器/計數器l中斷,由T1計滿回零引起。

        TI/RI:串行I/O中斷,串行端口完成一幀字符發送/接收后引起。





        外部中斷 引腳P3.2 P3.3

        EA=1; //全局中斷開
        EX0=1; //外部中斷0開
        IT0=0; //0為低電平觸發 1為下降沿觸發

        void ISR_Key(void) interrupt 0 using 1
        {
        P1=~P1; //進入中斷程序執行程序,
        //此時可以通過 EA=0指令暫時關掉中斷
        }



        定時計數器 引腳P3.4 P3.5 引腳做計數功能

        void Init_Timer0(void)
        {
        TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
        TH0=0x00; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
        TL0=0x00;
        EA=1; //總中斷打開
        ET0=1; //定時器中斷打開
        TR0=1; //定時器開關打開
        }


        void Timer0_isr(void) interrupt 1
        {
        TH0=0x00; //重新賦值
        TL0=0x00;

        LED=~LED; //指示燈反相,可以看到閃爍

        }


        串口通訊
        并行通訊 控制簡單 8位數據線一個詢問線 一個應答線
        線多用于短距離速度快的通訊 對硬件要求高
        串口通訊線少用于長距離傳送成本低數據一位一位的發送

        異步通訊指發送與接收設備使用各自的時鐘控制數據的發送和接收的過程起始位0 + 8位數據位 + 結束位1
        數據以幀為單位,不要求雙方時鐘嚴格一致,實現容易,設備開銷小,傳輸效率不高

        單工:單方向傳送,例如遙控器
        半雙工:同一時間只能一方發一方收,例如對講機
        全雙工:可以同時數據雙向傳送。手發不影響。

        奇偶效驗:奇校驗:0000 0001 0偶校驗:0000 00011
        代碼和校驗:發送一塊數據,多產生一個字節的校驗字符,在代碼末尾,
        比特率:美妙傳送的二進制代碼的位數,單位是位/秒(bps)
        例如:每秒傳送240個字符, 0 1111 1111 1 10*240=2400bps

        RS232是EIA美國電子工業協會1969年修訂的標準,定義了數據終端設備DTE與數據通信設備DCE之間的物理結接口標準
        RS232 規定用25針連接器,
        一般有作用的是3跟線TXDRXDSGND


        串口通訊要轉換電壓,開發板用的是MAX232把TTL電平轉換成RS232電平















        方式1,3的波特率=1/32或1/16*計時器2的溢出率
        此處有一個公式:
        波特率=1/16或1/32*(晶振的頻率/12*(256-TH1))
        代入:
        9600=11059200/32*12*(256-TH1)
        TH1=TH0=FDH

        定時器為工作方式2可自動再裝載的8位波特率發生器

        void InitUART (void)
        {
        SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
        TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
        TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
        TR1 = 1; // TR1: timer 1 打開
        EA = 1; //打開總中斷
        //ES = 1; //打開串口中斷
        }

        void main (void)
        {
        InitUART();
        while (1)
        {
        SendStr("UART test,技術論壇: thank you!");
        DelayMs(240);//延時循環發送
        DelayMs(240);
        }
        }
        /*------------------------------------------------
        發送一個字節
        ------------------------------------------------*/
        void SendByte(unsigned char dat)
        {
        SBUF = dat;
        while(!TI);
        TI = 0;
        }
        /*------------------------------------------------
        發送一個字符串
        ------------------------------------------------*/
        void SendStr(unsigned char *s)
        {
        while(*s!= 主站蜘蛛池模板: 淄博市| 海丰县| 沙雅县| 肥乡县| 务川| 卓尼县| 绍兴市| 梁河县| 汾阳市| 鄂州市| 凭祥市| 巩义市| 隆安县| 承德县| 天津市| 锡林浩特市| 文昌市| 凌云县| 陆河县| 胶南市| 金坛市| 普兰店市| 祁东县| 额济纳旗| 普洱| 常德市| 闵行区| 若羌县| 登封市| 桃园县| 会昌县| 吐鲁番市| 阜南县| 古浪县| 罗定市| 清水县| 页游| 浦江县| 邹平县| 大新县| 碌曲县|