標(biāo)題: 51單片機(jī)Timer2模擬半雙工串口的C語(yǔ)言和匯編代碼及注釋說(shuō)明 [打印本頁(yè)]

作者: wuaxiang    時(shí)間: 2018-11-22 11:16
標(biāo)題: 51單片機(jī)Timer2模擬半雙工串口的C語(yǔ)言和匯編代碼及注釋說(shuō)明
使用51單片機(jī)Timer2模擬一個(gè)半雙工串口的c語(yǔ)言代碼
  1. /*************        功能說(shuō)明        **************

  2. 使用STC15系列的Timer2做的模擬串口. P3.0接收, P3.1發(fā)送, 半雙工.
  3. 假定測(cè)試芯片的工作頻率為22118400Hz. 時(shí)鐘為5.5296MHZ ~ 35MHZ.
  4. 波特率高,則時(shí)鐘也要選高, 優(yōu)先使用 22.1184MHZ, 11.0592MHZ.
  5. 測(cè)試方法: 上位機(jī)發(fā)送數(shù)據(jù), MCU收到數(shù)據(jù)后原樣返回.
  6. 串口固定設(shè)置: 1位起始位, 8位數(shù)據(jù)位, 1位停止位,  波特率在范圍如下.

  7. 1200 ~ 115200 bps @ 33.1776MHZ
  8. 600 ~ 115200 bps @ 22.1184MHZ
  9. 600 ~  76800 bps @ 18.4320MHZ
  10. 300 ~  57600 bps @ 11.0592MHZ
  11. 150 ~  19200 bps @  5.5296MHZ

  12. ******************************************/

  13. #include        <reg52.h>

  14. #define MAIN_Fosc                22118400UL        //定義主時(shí)鐘
  15. #define        UART3_Baudrate        115200UL        //定義波特率
  16. #define        RX_Lenth                32                        //接收長(zhǎng)度

  17. #define        UART3_BitTime        (MAIN_Fosc / UART3_Baudrate)

  18. typedef         unsigned char        u8;
  19. typedef         unsigned int        u16;
  20. typedef         unsigned long        u32;

  21. sfr IE2  = 0xAF;
  22. sfr        AUXR = 0x8E;
  23. sfr INT_CLKO = 0x8F;
  24. sfr        T2H  = 0xD6;
  25. sfr        T2L  = 0xD7;

  26. u8        Tx3_read;                        //發(fā)送讀指針
  27. u8        Rx3_write;                        //接收寫(xiě)指針
  28. u8         idata        buf3[RX_Lenth];        //接收緩沖

  29. u16        RxTimeOut;
  30. bit        B_RxOk;                //接收結(jié)束標(biāo)志


  31. //===================== 模擬串口相關(guān)===========================
  32. sbit P_RX3 = P3^0;        //定義模擬串口接收IO
  33. sbit P_TX3 = P3^1;        //定義模擬串口發(fā)送IO

  34. u8  Tx3_DAT;                // 發(fā)送移位變量, 用戶(hù)不可見(jiàn)
  35. u8  Rx3_DAT;                // 接收移位變量, 用戶(hù)不可見(jiàn)
  36. u8  Tx3_BitCnt;                // 發(fā)送數(shù)據(jù)的位計(jì)數(shù)器, 用戶(hù)不可見(jiàn)
  37. u8  Rx3_BitCnt;                // 接收數(shù)據(jù)的位計(jì)數(shù)器, 用戶(hù)不可見(jiàn)
  38. u8        Rx3_BUF;                // 接收到的字節(jié), 用戶(hù)讀取
  39. u8        Tx3_BUF;                // 要發(fā)送的字節(jié), 用戶(hù)寫(xiě)入
  40. bit        Rx3_Ring;                // 正在接收標(biāo)志, 低層程序使用, 用戶(hù)程序不可見(jiàn)
  41. bit        Tx3_Ting;                // 正在發(fā)送標(biāo)志, 用戶(hù)置1請(qǐng)求發(fā)送, 底層發(fā)送完成清0
  42. bit        RX3_End;                // 接收到一個(gè)字節(jié), 用戶(hù)查詢(xún) 并清0
  43. //=============================================================

  44. void        UART_Init(void);


  45. /******************** 主函數(shù) **************************/
  46. void main(void)
  47. {
  48.        
  49.         UART_Init();        //PCA初始化
  50.         EA = 1;
  51.        
  52.         while (1)                //user's function
  53.         {
  54.                 if (RX3_End)                // 檢測(cè)是否收到一個(gè)字節(jié)
  55.                 {
  56.                         RX3_End = 0;        // 清除標(biāo)志
  57.                         buf3[Rx3_write] = Rx3_BUF;        // 寫(xiě)入緩沖
  58.                         if(++Rx3_write >= RX_Lenth)        Rx3_write = 0;        // 指向下一個(gè)位置,  溢出檢測(cè)
  59.                         RxTimeOut = 1000;        //裝載超時(shí)時(shí)間
  60.                 }
  61.                 if(RxTimeOut != 0)                // 超時(shí)時(shí)間是否非0?
  62.                 {
  63.                         if(--RxTimeOut == 0)        // (超時(shí)時(shí)間  - 1) == 0?
  64.                         {
  65.                                 B_RxOk = 1;
  66.                                 AUXR &=  ~(1<<4);        //Timer2 停止運(yùn)行
  67.                                 INT_CLKO &= ~(1 << 6);        //禁止INT4中斷
  68.                                 T2H = (65536 - UART3_BitTime) / 256;        //數(shù)據(jù)位
  69.                                 T2L = (65536 - UART3_BitTime) % 256;        //數(shù)據(jù)位
  70.                                 AUXR |=  (1<<4);        //Timer2 開(kāi)始運(yùn)行
  71.                         }
  72.                 }
  73.                
  74.                 if(B_RxOk)                // 檢測(cè)是否接收OK?
  75.                 {
  76.                         if (!Tx3_Ting)                // 檢測(cè)是否發(fā)送空閑
  77.                         {
  78.                                 if (Tx3_read != Rx3_write)        // 檢測(cè)是否收到過(guò)字符
  79.                                 {
  80.                                         Tx3_BUF = buf3[Tx3_read];        // 從緩沖讀一個(gè)字符發(fā)送
  81.                                         Tx3_Ting = 1;                                // 設(shè)置發(fā)送標(biāo)志
  82.                                         if(++Tx3_read >= RX_Lenth)        Tx3_read = 0;        // 指向下一個(gè)位置,  溢出檢測(cè)
  83.                                 }
  84.                                 else
  85.                                 {
  86.                                         B_RxOk = 0;
  87.                                         AUXR &=  ~(1<<4);                //Timer2 停止運(yùn)行
  88.                                         INT_CLKO |=  (1 << 6);        //允許INT4中斷
  89.                                 }
  90.                         }
  91.                 }
  92.         }
  93. }


  94. //========================================================================
  95. // 函數(shù): void        UART_Init(void)
  96. // 描述: UART初始化程序.
  97. // 參數(shù): none
  98. // 返回: none.
  99. // 版本: V1.0, 2013-11-22
  100. //========================================================================
  101. void        UART_Init(void)
  102. {
  103.         Tx3_read  = 0;
  104.         Rx3_write = 0;
  105.         Tx3_Ting  = 0;
  106.         Rx3_Ring  = 0;
  107.         RX3_End   = 0;
  108.         Tx3_BitCnt = 0;
  109.         RxTimeOut = 0;
  110.         B_RxOk = 0;

  111.         AUXR &=  ~(1<<4);                // Timer2 停止運(yùn)行
  112.         T2H = (65536 - UART3_BitTime) / 256;        // 數(shù)據(jù)位
  113.         T2L = (65536 - UART3_BitTime) % 256;        // 數(shù)據(jù)位
  114.         INT_CLKO |=  (1 << 6);        // 允許INT4中斷
  115.         IE2  |=  (1<<2);                // 允許Timer2中斷
  116.         AUXR |=  (1<<2);                // 1T
  117. }
  118. //======================================================================

  119. //========================================================================
  120. // 函數(shù): void        timer2_int (void) interrupt 12
  121. // 描述: Timer2中斷處理程序.
  122. // 參數(shù): None
  123. // 返回: none.
  124. // 版本: V1.0, 2012-11-22
  125. //========================================================================
  126. void        timer2_int (void) interrupt 12
  127. {
  128.         if(Rx3_Ring)                //已收到起始位
  129.         {
  130.                 if (--Rx3_BitCnt == 0)                //接收完一幀數(shù)據(jù)
  131.                 {
  132.                         Rx3_Ring = 0;                        //停止接收
  133.                         Rx3_BUF = Rx3_DAT;                //存儲(chǔ)數(shù)據(jù)到緩沖區(qū)
  134.                         RX3_End = 1;
  135.                         AUXR &=  ~(1<<4);        //Timer2 停止運(yùn)行
  136.                         INT_CLKO |=  (1 << 6);        //允許INT4中斷
  137.                 }
  138.                 else
  139.                 {
  140.                         Rx3_DAT >>= 1;                                          //把接收的單b數(shù)據(jù) 暫存到 RxShiftReg(接收緩沖)
  141.                         if(P_RX3) Rx3_DAT |= 0x80;          //shift RX data to RX buffer
  142.                 }
  143.         }

  144.         if(Tx3_Ting)                                        // 不發(fā)送, 退出
  145.         {
  146.                 if(Tx3_BitCnt == 0)                        //發(fā)送計(jì)數(shù)器為0 表明單字節(jié)發(fā)送還沒(méi)開(kāi)始
  147.                 {
  148.                         P_TX3 = 0;                                //發(fā)送開(kāi)始位
  149.                         Tx3_DAT = Tx3_BUF;                //把緩沖的數(shù)據(jù)放到發(fā)送的buff
  150.                         Tx3_BitCnt = 9;                        //發(fā)送數(shù)據(jù)位數(shù) (8數(shù)據(jù)位+1停止位)
  151.                 }
  152.                 else                                                //發(fā)送計(jì)數(shù)器為非0 正在發(fā)送數(shù)據(jù)
  153.                 {
  154.                         if (--Tx3_BitCnt == 0)        //發(fā)送計(jì)數(shù)器減為0 表明單字節(jié)發(fā)送結(jié)束
  155.                         {
  156.                                 P_TX3 = 1;                        //送停止位數(shù)據(jù)
  157.                                 Tx3_Ting = 0;                //發(fā)送停止
  158.                         }
  159.                         else
  160.                         {
  161.                                 Tx3_DAT >>= 1;                //把最低位送到 CY(益處標(biāo)志位)
  162.                                 P_TX3 = CY;                        //發(fā)送一個(gè)bit數(shù)據(jù)
  163.                         }
  164.                 }
  165.         }
  166. }


  167. /********************* INT4中斷函數(shù) *************************/
  168. void Ext_INT4 (void) interrupt 16
  169. {
  170.         AUXR &=  ~(1<<4);        //Timer2 停止運(yùn)行
  171.         T2H = (65536 - (UART3_BitTime / 2 + UART3_BitTime)) / 256;        //起始位 + 半個(gè)數(shù)據(jù)位
  172.         T2L = (65536 - (UART3_BitTime / 2 + UART3_BitTime)) % 256;        //起始位 + 半個(gè)數(shù)據(jù)位
  173.         AUXR |=  (1<<4);        //Timer2 開(kāi)始運(yùn)行
  174.         Rx3_Ring = 1;                //標(biāo)志已收到起始位
  175.         Rx3_BitCnt = 9;                //初始化接收的數(shù)據(jù)位數(shù)(8個(gè)數(shù)據(jù)位+1個(gè)停止位)
  176.        
  177.         INT_CLKO &= ~(1 << 6);        //禁止INT4中斷
  178.         T2H = (65536 - UART3_BitTime) / 256;        //數(shù)據(jù)位
  179.         T2L = (65536 - UART3_BitTime) % 256;        //數(shù)據(jù)位
  180. }
復(fù)制代碼

匯編語(yǔ)言:
  1. ;*************        功能說(shuō)明        **************

  2. ;使用STC15系列的Timer2做的模擬串口. P3.0接收, P3.1發(fā)送, 半雙工.

  3. ;假定測(cè)試芯片的工作頻率為22118400Hz. 時(shí)鐘為5.5296MHZ ~ 35MHZ.

  4. ;波特率高,則時(shí)鐘也要選高, 優(yōu)先使用 22.1184MHZ, 11.0592MHZ.

  5. ;測(cè)試方法: 上位機(jī)發(fā)送數(shù)據(jù), MCU收到數(shù)據(jù)后原樣返回.

  6. ;串口固定設(shè)置: 1位起始位, 8位數(shù)據(jù)位, 1位停止位,  波特率在范圍如下.

  7. ;******************************************

  8. ;UART3_BitTime        EQU                9216        ; 1200bps @ 11.0592MHz        UART3_BitTime = (MAIN_Fosc / Baudrate)
  9. ;UART3_BitTime        EQU                4608        ; 2400bps @ 11.0592MHz
  10. ;UART3_BitTime        EQU                2304        ; 4800bps @ 11.0592MHz
  11. ;UART3_BitTime        EQU                1152        ; 9600bps @ 11.0592MHz
  12. ;UART3_BitTime        EQU                 576        ;19200bps @ 11.0592MHz
  13. ;UART3_BitTime        EQU                 288        ;38400bps @ 11.0592MHz
  14. ;UART3_BitTime        EQU                 192        ;57600bps @ 11.0592MHz

  15. ;UART3_BitTime        EQU                15360        ; 1200bps @ 18.432MHz
  16. ;UART3_BitTime        EQU                7680        ; 2400bps @ 18.432MHz
  17. ;UART3_BitTime        EQU                3840        ; 4800bps @ 18.432MHz
  18. ;UART3_BitTime        EQU                1920        ; 9600bps @ 18.432MHz
  19. ;UART3_BitTime        EQU                960                ;19200bps @ 18.432MHz
  20. ;UART3_BitTime        EQU                480                ;38400bps @ 18.432MHz
  21. ;UART3_BitTime        EQU                320                ;57600bps @ 18.432MHz

  22. ;UART3_BitTime        EQU                18432        ; 1200bps @ 22.1184MHz
  23. ;UART3_BitTime        EQU                9216        ; 2400bps @ 22.1184MHz
  24. ;UART3_BitTime        EQU                4608        ; 4800bps @ 22.1184MHz
  25. ;UART3_BitTime        EQU                2304        ; 9600bps @ 22.1184MHz
  26. ;UART3_BitTime        EQU                1152        ;19200bps @ 22.1184MHz
  27. ;UART3_BitTime        EQU                576                ;38400bps @ 22.1184MHz
  28. ;UART3_BitTime        EQU                384                ;57600bps @ 22.1184MHz
  29. UART3_BitTime        EQU                192                ;115200bps @ 22.1184MHz

  30. ;UART3_BitTime        EQU                27648        ; 1200bps @ 33.1776MHz
  31. ;UART3_BitTime        EQU                13824        ; 2400bps @ 33.1776MHz
  32. ;UART3_BitTime        EQU                6912        ; 4800bps @ 33.1776MHz
  33. ;UART3_BitTime        EQU                3456        ; 9600bps @ 33.1776MHz
  34. ;UART3_BitTime        EQU                1728        ;19200bps @ 33.1776MHz
  35. ;UART3_BitTime        EQU                864                ;38400bps @ 33.1776MHz
  36. ;UART3_BitTime        EQU                576                ;57600bps @ 33.1776MHz
  37. ;UART3_BitTime        EQU                288                ;115200bps @ 33.1776MHz

  38. IE2                        DATA         0AFH
  39. AUXR                DATA         08EH
  40. INT_CLKO        DATA         08FH
  41. T2H                        DATA         0D6H
  42. T2L                        DATA         0D7H


  43. ;===================== 模擬串口相關(guān) ===========================
  44. P_RX3                 BIT         P3.0        ; 定義模擬串口接收IO
  45. P_TX3                 BIT         P3.1        ; 定義模擬串口發(fā)送IO

  46. Rx3_Ring        BIT                20H.0        ; 正在接收標(biāo)志, 低層程序使用, 用戶(hù)程序不可見(jiàn)
  47. Tx3_Ting        BIT                20H.1        ; 正在發(fā)送標(biāo)志, 用戶(hù)置1請(qǐng)求發(fā)送, 底層發(fā)送完成清0
  48. RX3_End                BIT                20H.2        ; 接收到一個(gè)字節(jié), 用戶(hù)查詢(xún) 并清0
  49. B_RxOk                BIT                20H.3        ; 接收結(jié)束標(biāo)志

  50. Tx3_DAT                DATA        30H                ; 發(fā)送移位變量, 用戶(hù)不可見(jiàn)
  51. Rx3_DAT                DATA        31H                ; 接收移位變量, 用戶(hù)不可見(jiàn)
  52. Tx3_BitCnt        DATA        32H                ; 發(fā)送數(shù)據(jù)的位計(jì)數(shù)器, 用戶(hù)不可見(jiàn)
  53. Rx3_BitCnt        DATA        33H                ; 接收數(shù)據(jù)的位計(jì)數(shù)器, 用戶(hù)不可見(jiàn)
  54. Rx3_BUF                DATA        34H                ; 接收到的字節(jié), 用戶(hù)讀取
  55. Tx3_BUF                DATA        35H                ; 要發(fā)送的字節(jié), 用戶(hù)寫(xiě)入

  56. ;=================================================================
  57. RxTimeOutH        DATA        36H                ;
  58. RxTimeOutL        DATA        37H                ;

  59. Tx3_read        DATA        38H                ; 發(fā)送讀指針
  60. Rx3_write        DATA        39H                ; 接收寫(xiě)指針

  61. RX_Lenth        EQU                32                ; 接收長(zhǎng)度
  62. buf3                EQU                40H                ; 40H ~ 5FH        接收緩沖

  63. STACK_POIRTER        EQU                0D0H        ;堆棧開(kāi)始地址

  64. ;*******************************************************************
  65. ;*******************************************************************
  66.                 ORG                00H                                ;reset
  67.                 LJMP        F_Main

  68.                 ORG                63H                                ;12  Timer2 interrupt
  69.                 LJMP        F_Timer2_Interrupt

  70.                 ORG                83H                                ;16  INT4 interrupt
  71.                 LJMP        F_INT4_Interrupt

  72. ;******************** 主程序 **************************/
  73. F_Main:
  74.        
  75.         MOV                SP, #STACK_POIRTER
  76.         MOV                PSW, #0
  77.         USING        0                ;選擇第0組R0~R7

  78. ;================= 用戶(hù)初始化程序 ====================================
  79.         LCALL        F_UART_Init                ;UART初始化
  80.         SETB        EA
  81.        
  82.                
  83. ;=================== 主循環(huán) ==================================
  84. L_MainLoop:
  85.         JNB                RX3_End, L_QuitRx3        ; 檢測(cè)是否收到一個(gè)字節(jié)
  86.         CLR                RX3_End                                ; 清除標(biāo)志
  87.         MOV                A, #buf3
  88.         ADD                A, Rx3_write
  89.         MOV                R0, A
  90.         MOV                @R0, Rx3_BUF                ; 寫(xiě)入緩沖
  91.         MOV                RxTimeOutH, #HIGH 1000        ; 裝載超時(shí)時(shí)間
  92.         MOV                RxTimeOutL, #LOW  1000        ;
  93.         INC                Rx3_write                        ; 指向下一個(gè)位置
  94.         MOV                A, Rx3_write
  95.         CLR                C
  96.         SUBB        A, #RX_Lenth                ; 溢出檢測(cè)
  97.         JC                L_QuitRx3
  98.         MOV                Rx3_write, #0
  99. L_QuitRx3:

  100.         MOV                A, RxTimeOutL
  101.         ORL                A, RxTimeOutH
  102.         JZ                L_QuitTimeOut        ; 超時(shí)時(shí)間是否非0?
  103.         MOV                A, RxTimeOutL
  104.         DEC                RxTimeOutL                ; (超時(shí)時(shí)間  - 1) == 0?
  105.         JNZ                $+4
  106.         DEC                RxTimeOutH
  107.         DEC                A
  108.         ORL                A, RxTimeOutH
  109.         JNZ                L_QuitTimeOut
  110.        
  111.         SETB        B_RxOk                                                ; 超時(shí), 標(biāo)志接收完成
  112.         ANL                AUXR, #NOT (1 SHL 4)                ; Timer2 停止運(yùn)行
  113.         ANL                INT_CLKO, #NOT (1 SHL 6)        ; 禁止INT4中斷
  114.         MOV                T2H, #HIGH (65536 - UART3_BitTime)        ;數(shù)據(jù)位
  115.         MOV                T2L, #LOW (65536 - UART3_BitTime)        ;
  116.         ORL                AUXR, #(1 SHL 4)                        ; Timer2 開(kāi)始運(yùn)行
  117. L_QuitTimeOut:       

  118.         JNB                B_RxOk, L_QuitTx3        ; 檢測(cè)是否接收OK?
  119.         JB                Tx3_Ting, L_QuitTx3        ; 檢測(cè)是否發(fā)送空閑
  120.         MOV                A, Tx3_read
  121.         XRL                A, Rx3_write
  122.         JZ                L_TxFinish                        ; 檢測(cè)是否發(fā)送完畢

  123.         MOV                A, #buf3
  124.         ADD                A, Tx3_read
  125.         MOV                R0, A
  126.         MOV                Tx3_BUF, @R0                ; 從緩沖讀一個(gè)字符發(fā)送
  127.         SETB        Tx3_Ting                        ; 設(shè)置發(fā)送標(biāo)志
  128.         INC                Tx3_read                        ; 指向下一個(gè)字符位置
  129.         MOV                A, Tx3_read
  130.         CLR                C
  131.         SUBB        A, #RX_Lenth
  132.         JC                L_QuitTx3                        ; 溢出檢測(cè)
  133.         MOV                Tx3_read, #0
  134.         SJMP        L_QuitTx3

  135. L_TxFinish:
  136.         CLR                B_RxOk
  137.         ANL                AUXR, #NOT (1 SHL 4)        ; Timer2 停止運(yùn)行
  138.         ORL                INT_CLKO, #(1 SHL 6)        ; 允許INT4中斷

  139. L_QuitTx3:

  140.         LJMP        L_MainLoop

  141. ;=================== 主程序結(jié)束 ==================================

  142. ;========================================================================
  143. ; 函數(shù): F_UART_Init
  144. ; 描述: UART初始化程序.
  145. ; 參數(shù): none
  146. ; 返回: none.
  147. ; 版本: V1.0, 2013-11-22
  148. ;========================================================================
  149. F_UART_Init:
  150.         MOV                Tx3_read,  #0
  151.         MOV                Rx3_write, #0
  152.         CLR                Tx3_Ting
  153.         CLR                RX3_End
  154.         CLR                Rx3_Ring
  155.         MOV                Tx3_BitCnt, #0

  156.         MOV                RxTimeOutH, #0
  157.         MOV                RxTimeOutL, #0
  158.         CLR                B_RxOk

  159.         ANL                AUXR, #NOT(1 SHL 4)                ; Timer2 停止運(yùn)行
  160.         MOV                T2H, #HIGH (65536 - UART3_BitTime)        ; 數(shù)據(jù)位
  161.         MOV                T2L, #LOW (65536 - UART3_BitTime)        ; 數(shù)據(jù)位
  162.         ORL                INT_CLKO, #(1 SHL 6)        ; 允許INT4中斷
  163.         ORL                IE2, #(1 SHL 2)                        ; 允許Timer2中斷
  164.         ORL                AUXR, #(1 SHL 2)                ; 1T模式
  165.         RET

  166. ;======================================================================

  167. ;========================================================================
  168. ; 函數(shù): void        F_Timer2_Interrupt
  169. ; 描述: Timer2中斷處理程序.
  170. ; 參數(shù): None
  171. ; 返回: none.
  172. ; 版本: V1.0, 2012-11-22
  173. ;========================================================================
  174. F_Timer2_Interrupt:
  175.         PUSH        PSW
  176.         PUSH        ACC

  177.         JNB                Rx3_Ring, L_QuitRx        ; 已收到起始位
  178.         DJNZ        Rx3_BitCnt, L_RxBit        ; 接收完一幀數(shù)據(jù)
  179.        
  180.         CLR                Rx3_Ring                        ; 停止接收
  181.         MOV                Rx3_BUF, Rx3_DAT        ; 存儲(chǔ)數(shù)據(jù)到緩沖區(qū)
  182.         SETB        RX3_End                                ;
  183.         ANL                AUXR, #NOT (1 SHL 4); Timer2 停止運(yùn)行
  184.         ORL                INT_CLKO, #(1 SHL 6); 允許INT4中斷
  185.         SJMP        L_QuitRx
  186.        
  187. L_RxBit:
  188.         MOV                A, Rx3_DAT                        ; 把接收的單b數(shù)據(jù) 暫存到 RxShiftReg(接收緩沖)
  189.         MOV                C, P_RX3
  190.         RRC                A
  191.         MOV                Rx3_DAT, A
  192. L_QuitRx:

  193.         JNB                Tx3_Ting, L_QuitTx        ; 不發(fā)送, 退出
  194.         MOV                A, Tx3_BitCnt
  195.         JNZ                L_TxData                        ; 發(fā)送計(jì)數(shù)器為0 表明單字節(jié)發(fā)送還沒(méi)開(kāi)始
  196.         CLR                P_TX3                                ; 發(fā)送開(kāi)始位
  197.         MOV                Tx3_DAT, Tx3_BUF        ; 把緩沖的數(shù)據(jù)放到發(fā)送的buff
  198.         MOV                Tx3_BitCnt, #9                ; 發(fā)送數(shù)據(jù)位數(shù) (8數(shù)據(jù)位+1停止位)
  199.         SJMP        L_QuitTx
  200. L_TxData:                                                ; 發(fā)送計(jì)數(shù)器為非0 正在發(fā)送數(shù)據(jù)
  201.         DJNZ        Tx3_BitCnt, L_TxBit        ; 發(fā)送計(jì)數(shù)器減為0 表明單字節(jié)發(fā)送結(jié)束
  202.         SETB        P_TX3                                ; 送停止位數(shù)據(jù)
  203.         CLR                Tx3_Ting                        ; 發(fā)送停止
  204.         SJMP        L_QuitTx
  205. L_TxBit:
  206.         MOV                A, Tx3_DAT                        ; 把最低位送到 CY(益處標(biāo)志位)
  207.         RRC                A
  208.         MOV                P_TX3, C                        ; 發(fā)送一個(gè)bit數(shù)據(jù)
  209.         MOV                Tx3_DAT, A
  210. L_QuitTx:

  211.         POP                ACC
  212.         POP                PSW

  213.         RETI
  214.        

  215. ;===================== INT4中斷函數(shù) ==================================
  216. F_INT4_Interrupt:
  217.         PUSH        PSW
  218.         PUSH        ACC

  219.         ANL                AUXR, #NOT(1 SHL 4)        ;Timer2 停止運(yùn)行
  220.         MOV                T2H, #HIGH (65536 - (UART3_BitTime / 2 + UART3_BitTime))        ; 起始位 + 半個(gè)數(shù)據(jù)位
  221.         MOV                T2L, #LOW (65536 - (UART3_BitTime / 2 + UART3_BitTime))                ; 起始位 + 半個(gè)數(shù)據(jù)位
  222.         ORL                AUXR, #(1 SHL 4)        ;Timer2 開(kāi)始運(yùn)行
  223.         SETB        Rx3_Ring                        ; 標(biāo)志已收到起始位
  224.         MOV                Rx3_BitCnt, #9                ; 初始化接收的數(shù)據(jù)位數(shù)(8個(gè)數(shù)據(jù)位+1個(gè)停止位)
  225.        
  226.         ANL                INT_CLKO,  #NOT(1 SHL 6);        //禁止INT4中斷
  227.         MOV                T2H, #HIGH (65536 - UART3_BitTime)        ; 數(shù)據(jù)位
  228.         MOV                T2L, #LOW (65536 - UART3_BitTime)        ; 數(shù)據(jù)位

  229.         POP                ACC
  230.         POP                PSW
  231.         RETI

  232.         END
復(fù)制代碼


所有資料51hei提供下載:
使用51單片機(jī)Timer2模擬一個(gè)半雙工串口.rar (18.4 KB, 下載次數(shù): 12)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1