欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10049|回復: 18
打印 上一主題 下一主題
收起左側

stc單片機雙串口中斷收發源程序

  [復制鏈接]
跳轉到指定樓層
樓主
雙串口中斷收發源代碼:


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- QQ:  800003751 -------------------------------------------------*/
  8. /* 如果要在程序中使用此代碼,請在程序中注明使用了宏晶科技的資料及程序   */
  9. /*---------------------------------------------------------------------*/


  10. #define MAIN_Fosc                22118400L        //定義主時鐘

  11. #include        "STC15Fxxxx.H"

  12. #define                Baudrate1        115200UL
  13. #define                Baudrate2        115200UL



  14. /*************        功能說明        **************

  15. 雙串口全雙工中斷方式收發通訊程序。

  16. 通過PC向MCU發送數據, MCU收到后通過串口把收到的數據原樣返回.

  17. ******************************************/


  18. #define        UART1_BUF_LENGTH        32
  19. #define        UART2_BUF_LENGTH        32



  20. u8        TX1_Cnt;        //發送計數
  21. u8        RX1_Cnt;        //接收計數
  22. u8        TX2_Cnt;        //發送計數
  23. u8        RX2_Cnt;        //接收計數
  24. bit        B_TX1_Busy;        //發送忙標志
  25. bit        B_TX2_Busy;        //發送忙標志

  26. u8         idata RX1_Buffer[UART1_BUF_LENGTH];        //接收緩沖
  27. u8         idata RX2_Buffer[UART2_BUF_LENGTH];        //接收緩沖


  28. void        UART1_config(u8 brt);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  29. void        UART2_config(u8 brt);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  30. void         PrintString1(u8 *puts);
  31. void         PrintString2(u8 *puts);



  32. //========================================================================
  33. // 函數: void main(void)
  34. // 描述: 主函數。
  35. // 參數: none.
  36. // 返回: none.
  37. // 版本: VER1.0
  38. // 日期: 2014-11-28
  39. // 備注:
  40. //========================================================================
  41. void main(void)
  42. {
  43.         P0M1 = 0;        P0M0 = 0;        //設置為準雙向口
  44.         P1M1 = 0;        P1M0 = 0;        //設置為準雙向口
  45.         P2M1 = 0;        P2M0 = 0;        //設置為準雙向口
  46.         P3M1 = 0;        P3M0 = 0;        //設置為準雙向口
  47.         P4M1 = 0;        P4M0 = 0;        //設置為準雙向口
  48.         P5M1 = 0;        P5M0 = 0;        //設置為準雙向口
  49.         P6M1 = 0;        P6M0 = 0;        //設置為準雙向口
  50.         P7M1 = 0;        P7M0 = 0;        //設置為準雙向口

  51.         UART1_config(1);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  52.         UART2_config(2);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  53.         EA = 1;                                //允許全局中斷

  54.         
  55.         PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n");        //SUART1發送一個字符串
  56.         PrintString2("STC15F2K60S2 UART2 Test Prgramme!\r\n");        //SUART2發送一個字符串

  57.         while (1)
  58.         {
  59.                 if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))        //收到數據, 發送空閑
  60.                 {
  61.                         SBUF = RX1_Buffer[TX1_Cnt];
  62.                         B_TX1_Busy = 1;
  63.                         if(++TX1_Cnt >= UART1_BUF_LENGTH)        TX1_Cnt = 0;
  64.                 }

  65.                 if((TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy))        //收到數據, 發送空閑
  66.                 {
  67.                         S2BUF = RX2_Buffer[TX2_Cnt];
  68.                         B_TX2_Busy = 1;
  69.                         if(++TX2_Cnt >= UART2_BUF_LENGTH)        TX2_Cnt = 0;
  70.                 }
  71.         }
  72. }


  73. //========================================================================
  74. // 函數: void PrintString1(u8 *puts)
  75. // 描述: 串口1發送字符串函數。
  76. // 參數: puts:  字符串指針.
  77. // 返回: none.
  78. // 版本: VER1.0
  79. // 日期: 2014-11-28
  80. // 備注:
  81. //========================================================================
  82. void PrintString1(u8 *puts)
  83. {
  84.     for (; *puts != 0;        puts++)           //遇到停止符0結束
  85.         {
  86.                 SBUF = *puts;
  87.                 B_TX1_Busy = 1;
  88.                 while(B_TX1_Busy);
  89.         }
  90. }

  91. //========================================================================
  92. // 函數: void PrintString2(u8 *puts)
  93. // 描述: 串口2發送字符串函數。
  94. // 參數: puts:  字符串指針.
  95. // 返回: none.
  96. // 版本: VER1.0
  97. // 日期: 2014-11-28
  98. // 備注:
  99. //========================================================================
  100. void PrintString2(u8 *puts)
  101. {
  102.     for (; *puts != 0;        puts++)           //遇到停止符0結束
  103.         {
  104.                 S2BUF = *puts;
  105.                 B_TX2_Busy = 1;
  106.                 while(B_TX2_Busy);
  107.         }
  108. }

  109. //========================================================================
  110. // 函數: SetTimer2Baudraye(u16 dat)
  111. // 描述: 設置Timer2做波特率發生器。
  112. // 參數: dat: Timer2的重裝值.
  113. // 返回: none.
  114. // 版本: VER1.0
  115. // 日期: 2014-11-28
  116. // 備注:
  117. //========================================================================
  118. void        SetTimer2Baudraye(u16 dat)
  119. {
  120.         AUXR &= ~(1<<4);        //Timer stop
  121.         AUXR &= ~(1<<3);        //Timer2 set As Timer
  122.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  123.         TH2 = dat / 256;
  124.         TL2 = dat % 256;
  125.         IE2  &= ~(1<<2);        //禁止中斷
  126.         AUXR |=  (1<<4);        //Timer run enable
  127. }

  128. //========================================================================
  129. // 函數: void        UART1_config(u8 brt)
  130. // 描述: UART1初始化函數。
  131. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  132. // 返回: none.
  133. // 版本: VER1.0
  134. // 日期: 2014-11-28
  135. // 備注:
  136. //========================================================================
  137. void        UART1_config(u8 brt)
  138. {
  139.         /*********** 波特率使用定時器2 *****************/
  140.         if(brt == 2)
  141.         {
  142.                 AUXR |= 0x01;                //S1 BRT Use Timer2;
  143.                 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
  144.         }

  145.         /*********** 波特率使用定時器1 *****************/
  146.         else
  147.         {
  148.                 TR1 = 0;
  149.                 AUXR &= ~0x01;                //S1 BRT Use Timer1;
  150.                 AUXR |=  (1<<6);        //Timer1 set as 1T mode
  151.                 TMOD &= ~(1<<6);        //Timer1 set As Timer
  152.                 TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  153.                 TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
  154.                 TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
  155.                 ET1 = 0;        //禁止中斷
  156.                 INT_CLKO &= ~0x02;        //不輸出時鐘
  157.                 TR1  = 1;
  158.         }
  159.         /*************************************************/

  160.         SCON = (SCON & 0x3f) | 0x40;        //UART1模式, 0x00: 同步移位輸出, 0x40: 8位數據,可變波特率, 0x80: 9位數據,固定波特率, 0xc0: 9位數據,可變波特率
  161. //        PS  = 1;        //高優先級中斷
  162.         ES  = 1;        //允許中斷
  163.         REN = 1;        //允許接收
  164.         P_SW1 &= 0x3f;
  165.         P_SW1 |= 0x80;                //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必須使用內部時鐘)
  166. //        PCON2 |=  (1<<4);        //內部短路RXD與TXD, 做中繼, ENABLE,DISABLE

  167.         B_TX1_Busy = 0;
  168.         TX1_Cnt = 0;
  169.         RX1_Cnt = 0;
  170. }


  171. //========================================================================
  172. // 函數: void        UART2_config(u8 brt)
  173. // 描述: UART2初始化函數。
  174. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  175. // 返回: none.
  176. // 版本: VER1.0
  177. // 日期: 2014-11-28
  178. // 備注:
  179. //========================================================================
  180. void        UART2_config(u8 brt)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  181. {
  182.         if(brt == 2)
  183.         {
  184.                 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate2);

  185.                 S2CON &= ~(1<<7);        // 8位數據, 1位起始位, 1位停止位, 無校驗
  186.                 IE2   |= 1;                        //允許中斷
  187.                 S2CON |= (1<<4);        //允許接收
  188.                 P_SW2 &= ~0x01;        
  189.                 P_SW2 |= 1;                        //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7

  190.                 B_TX2_Busy = 0;
  191.                 TX2_Cnt = 0;
  192.                 RX2_Cnt = 0;
  193.         }
  194. }


  195. //========================================================================
  196. // 函數: void UART1_int (void) interrupt UART1_VECTOR
  197. // 描述: UART1中斷函數。
  198. // 參數: nine.
  199. // 返回: none.
  200. // 版本: VER1.0
  201. // 日期: 2014-11-28
  202. // 備注:
  203. //========================================================================
  204. void UART1_int (void) interrupt UART1_VECTOR
  205. {
  206.         if(RI)
  207.         {
  208.                 RI = 0;
  209.                 RX1_Buffer[RX1_Cnt] = SBUF;
  210.                 if(++RX1_Cnt >= UART1_BUF_LENGTH)        RX1_Cnt = 0;
  211.         }

  212.         if(TI)
  213.         {
  214.                 TI = 0;
  215.                 B_TX1_Busy = 0;
  216.         }
  217. }

  218. //========================================================================
  219. // 函數: void UART2_int (void) interrupt UART2_VECTOR
  220. // 描述: UART2中斷函數。
  221. // 參數: nine.
  222. // 返回: none.
  223. // 版本: VER1.0
  224. // 日期: 2014-11-28
  225. // 備注:
  226. //========================================================================
  227. void UART2_int (void) interrupt UART2_VECTOR
  228. {
  229.         if((S2CON & 1) != 0)
  230.         {
  231.                 S2CON &= ~1;        //Clear Rx flag
  232.                 RX2_Buffer[RX2_Cnt] = S2BUF;
  233.                 if(++RX2_Cnt >= UART2_BUF_LENGTH)        RX2_Cnt = 0;
  234.         }


  235. …………限于本文篇幅 余下代碼請從51黑下載附件…………

復制代碼

下載:
C語言.rar (20.45 KB, 下載次數: 117)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:94867 發表于 2017-12-27 11:00 | 只看該作者
標記謝謝分享
回復

使用道具 舉報

地板
ID:94867 發表于 2017-12-27 11:03 | 只看該作者
我要測試下這個可不可以用
回復

使用道具 舉報

5#
ID:225369 發表于 2017-12-28 15:31 | 只看該作者
謝謝!謝謝!非常感謝!!
回復

使用道具 舉報

6#
ID:225369 發表于 2017-12-28 15:31 | 只看該作者
我正要找 這個,可不可以用?
回復

使用道具 舉報

7#
ID:225369 發表于 2017-12-28 15:32 | 只看該作者
謝謝謝謝!非常感謝!
回復

使用道具 舉報

8#
ID:323951 發表于 2018-5-7 16:29 | 只看該作者
謝謝謝謝!非常感謝!!
回復

使用道具 舉報

9#
ID:283906 發表于 2018-5-8 15:24 | 只看該作者
謝謝分享,初學很懵逼
回復

使用道具 舉報

10#
ID:189673 發表于 2018-5-29 19:50 來自觸屏版 | 只看該作者
無常 發表于 2018-5-8 15:24
謝謝分享,初學很懵逼

要測試下這個可不可以用
回復

使用道具 舉報

11#
ID:65956 發表于 2018-7-12 08:51 | 只看該作者
謝謝分享,幫助很大,謝謝
回復

使用道具 舉報

12#
ID:381135 發表于 2018-7-31 09:52 | 只看該作者
謝謝分享
回復

使用道具 舉報

13#
ID:66287 發表于 2018-8-1 10:40 | 只看該作者
學習了,謝謝分享!
回復

使用道具 舉報

14#
ID:120672 發表于 2018-9-29 18:19 | 只看該作者
謝謝分享,正在找相關資料呢!
回復

使用道具 舉報

15#
ID:434016 發表于 2018-11-27 10:44 | 只看該作者
謝謝提供,測試看看...
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
17#
ID:43121 發表于 2019-5-24 09:38 | 只看該作者
謝謝分享,收獲很大
回復

使用道具 舉報

18#
ID:535790 發表于 2019-5-26 16:24 | 只看該作者
謝謝,學習了
回復

使用道具 舉報

19#
ID:299740 發表于 2019-7-1 08:27 | 只看該作者
非常感謝,正在被這個串口2收發問題困擾,趕緊下下來測試。
回復

使用道具 舉報

20#
ID:596723 發表于 2019-8-7 11:39 | 只看該作者
標記,下載測試下
回復

使用道具 舉報

21#
ID:1044540 發表于 2022-9-12 14:47 | 只看該作者
#include "UART.h"
#include "Key.h"
#include "Record.h"

uint8_t Rcv_Buf[RCV_LENGTH];
uint8_t Snd_Buf[SND_LENGTH];

volatile uint8_t        recvbyte=0;
uint8_t RcvFlag = 0;

volatile uint16_t         ScanTimeMs;
volatile uint16_t SysOverTime;
uint8_t InitStartEnable;

uint8_t SendAdd;

uint16_t SysCallStatus1=0;
uint16_t SysCallStatus2=0;

uint16_t SysCallStatus1Bak=0;
uint16_t SysCallStatus2Bak=0;
uint16_t alarm = 0;

bit MyAddStart;
bit Over1min;

bit OverTimeFlag;

bit OtherMaster;
bit OtherMasterChecked;

volatile uint16_t DisableSendTimeMs;

volatile uint16_t u16_OverTimeMs;

void UART1_ISR() interrupt 4 using 1
{
        if(RI)
        {
                RI = 0;
                SysOverTime = 0;
                UartErr = 0;
                Rcv_Buf[recvbyte] = SBUF;                        //接收數據
                if(Rcv_Buf[0] == 0x53)
                {
                        recvbyte++;
                }
               
                if((Rcv_Buf[recvbyte-1]==0x0a) && (Rcv_Buf[recvbyte-2]==0x0d))                 //接收到幀尾
                {
                        RcvFlag = 1;                        //置位接收標志
                        recvbyte = 0;                        //接收下標清零
                }
        }
}

void Uart1_Init(void)
{
//        SCON = 0x50;
//        TMOD &= 0x0f;
//       
//        TH1 = BAUD>>8;
//        TL1 = BAUD;
//       
//        TR1 = 1;
//        AUXR |= 0x40;
//         ES = 1;
//        EA = 1;
//       
//       
//        RS485_RcevEnable();
                        TR1 = 0;
                AUXR &= ~0x01;                //S1 BRT Use Timer1;
                AUXR |=  (1<<6);        //Timer1 set as 1T mode
                TMOD &= ~(1<<6);        //Timer1 set As Timer
                TMOD &= ~0x30;                //Timer1_16bitAutoReload;
                TH1 = (uint8_t)(BAUD >> 8);
                TL1 = (uint8_t)BAUD;
                ET1 = 0;                                                // 禁止Timer1中斷
//                INT_CLKO &= ~0x02;        // Timer1不輸出高速時鐘
        //        INT_CLKO |=  0x02;        // Timer1輸出高速時鐘
                TR1  = 1;                        // 運行Timer1
       
        SCON = (SCON & 0x3f) | (1<<6);        // 8位數據, 1位起始位, 1位停止位, 無校驗
//        PS  = 1;        //高優先級中斷
        ES  = 1;        //允許中斷
        REN = 1;        //允許接收       
       
//        if(MasterAdd !=0)
//        {
//                        MyAddStart = 0;
//        }
       
       
       
        OtherMaster = 1;
        OtherMasterChecked = 0;
        DisableSendTimeMs = 0;
       
        SysOverTime = 0;
        Over1min = 0;
       
        RS485_RcevEnable();
}
void UART1_Send_Char(unsigned char c)
{
        RS485_SendEnable();
        _nop_();
        _nop_();
        _nop_();
        SBUF = c;
        while(!TI);       
        TI = 0;
       
        _nop_();
        _nop_();
        _nop_();
        RS485_RcevEnable();
}
void UART1_Send_String(unsigned char *s)
{
        while(*s)
        {
                UART1_Send_Char(*s++);
        }
}
void UART1_Send_Int(unsigned int c)
{
        UART1_Send_Char(c/10000+0x30);
        UART1_Send_Char(c%10000/1000+0x30);
        UART1_Send_Char(c%1000/100+0x30);
        UART1_Send_Char(c%100/10+0x30);
        UART1_Send_Char(c%10+0x30);
        UART1_Send_Char(0x0d);
        UART1_Send_Char(0x0a);
}
void UART1_Send_Buf(unsigned char *s,unsigned char len)
{
        unsigned char i;
       
        for(i=0;i<len;i++)
        {
                UART1_Send_Char(s[i]);
        }
}

void UART_Timer_Ms(void)
{
        SysOverTime++;
        if(SysOverTime > 10000)
        {
                UartErr = 1;
                MyAddStart = InitStartEnable;
                ScanTimeMs = 0;
        }
        if(MyAddStart)
        {
                ScanTimeMs++;
請教一下,這個程序中初始波特率是多少呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表