久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10057|回復: 18
收起左側

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

  [復制鏈接]
ID:187220 發表于 2017-4-7 18:22 | 顯示全部樓層 |閱讀模式
雙串口中斷收發源代碼:
0.png

  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)
回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:94867 發表于 2017-12-27 11:00 | 顯示全部樓層
標記謝謝分享
回復

使用道具 舉報

ID:94867 發表于 2017-12-27 11:03 | 顯示全部樓層
我要測試下這個可不可以用
回復

使用道具 舉報

ID:225369 發表于 2017-12-28 15:31 | 顯示全部樓層
謝謝!謝謝!非常感謝!!
回復

使用道具 舉報

ID:225369 發表于 2017-12-28 15:31 | 顯示全部樓層
我正要找 這個,可不可以用?
回復

使用道具 舉報

ID:225369 發表于 2017-12-28 15:32 | 顯示全部樓層
謝謝謝謝!非常感謝!!
回復

使用道具 舉報

ID:323951 發表于 2018-5-7 16:29 | 顯示全部樓層
謝謝謝謝!非常感謝!!
回復

使用道具 舉報

ID:283906 發表于 2018-5-8 15:24 | 顯示全部樓層
謝謝分享,初學很懵逼
回復

使用道具 舉報

ID:189673 發表于 2018-5-29 19:50 來自觸屏版 | 顯示全部樓層
無常 發表于 2018-5-8 15:24
謝謝分享,初學很懵逼

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

使用道具 舉報

ID:65956 發表于 2018-7-12 08:51 | 顯示全部樓層
謝謝分享,幫助很大,謝謝
回復

使用道具 舉報

ID:381135 發表于 2018-7-31 09:52 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:66287 發表于 2018-8-1 10:40 | 顯示全部樓層
學習了,謝謝分享!
回復

使用道具 舉報

ID:120672 發表于 2018-9-29 18:19 | 顯示全部樓層
謝謝分享,正在找相關資料呢!
回復

使用道具 舉報

ID:434016 發表于 2018-11-27 10:44 | 顯示全部樓層
謝謝提供,測試看看...
回復

使用道具 舉報

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

使用道具 舉報

ID:535790 發表于 2019-5-26 16:24 | 顯示全部樓層
謝謝,學習了
回復

使用道具 舉報

ID:299740 發表于 2019-7-1 08:27 | 顯示全部樓層
非常感謝,正在被這個串口2收發問題困擾,趕緊下下來測試。
回復

使用道具 舉報

ID:596723 發表于 2019-8-7 11:39 | 顯示全部樓層
標記,下載測試下
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情一区二区三区 | 午夜激情影院 | 91亚洲精品在线 | 午夜视频大全 | 欧美成年网站 | 黄色一级免费 | 亚洲一区二区三区 | 国产精品一区二区无线 | 中文字幕在线免费 | 午夜激情国产 | 欧美视频在线看 | 福利网址 | 欧美精品久久久久 | 午夜男人天堂 | 日韩免费在线 | 欧美国产日韩在线观看 | 国产精品一区二区三区在线 | 正在播放国产精品 | 2021天天干夜夜爽 | 一区二区视频 | 日韩精品一区二区三区中文在线 | 狠狠躁躁夜夜躁波多野结依 | 色免费看 | 黄久久久| 亚洲视频国产视频 | 91传媒在线观看 | 国产yw851.c免费观看网站 | 欧美伊人久久久久久久久影院 | 欧美成人一级视频 | 午夜精品久久久久久久久久久久久 | 成人综合视频在线观看 | 黄a网站 | 狠狠狠干 | 欧美国产视频一区二区 | 色综合一区二区三区 | 午夜精品久久久 | 欧美久久一区二区三区 | 欧美区在线观看 | av网站在线播放 | 欧美激情在线播放 | 欧洲成人午夜免费大片 |