標(biāo)題: stc15f104w 8腳單片機(jī)支持串口通信功能嗎? [打印本頁]

作者: 為將來努力    時(shí)間: 2017-11-18 22:36
標(biāo)題: stc15f104w 8腳單片機(jī)支持串口通信功能嗎?
各位大師‘’stc15f104w‘’這款單片機(jī)有串口通信功能的嗎?

作者: wulin    時(shí)間: 2017-11-19 06:50
芯片型號(hào) : STC15F104W

關(guān)于此芯片的重要說明:
  無硬件串口,可用軟件模擬串口 (范例代碼中有參考代碼)
  有定時(shí)器0和定時(shí)器2 (注意:無定時(shí)器1)


作者: 月影寒光    時(shí)間: 2018-12-11 22:39
wulin 發(fā)表于 2017-11-19 06:50
芯片型號(hào) : STC15F104W

關(guān)于此芯片的重要說明:

范例你試過,是對(duì)的嗎??
作者: 80088a    時(shí)間: 2021-5-12 17:27
官方資料顯示沒有硬件串口
作者: imxuheng    時(shí)間: 2021-5-13 08:36
官方給出了軟件模擬串口的程序,單片機(jī)手冊(cè)上面有,親測(cè)可用,我用來控制ESP8266沒有問題
作者: man1234567    時(shí)間: 2021-5-13 09:45
肯定可以不用懷疑,硬的不行就來軟的。感覺這問題等同于人能吃飯么 ?
作者: cn_zhx    時(shí)間: 2021-5-13 11:19
本身是沒有串口的,就像樓上說的可以模擬串口。
作者: 6313    時(shí)間: 2022-1-6 16:58
imxuheng 發(fā)表于 2021-5-13 08:36
官方給出了軟件模擬串口的程序,單片機(jī)手冊(cè)上面有,親測(cè)可用,我用來控制ESP8266沒有問題

我想用15F104w做個(gè)藍(lán)牙遙控開關(guān),就是串口不能用,能借鑒一下你的程序嗎
作者: angmall    時(shí)間: 2022-1-6 18:12
6313 發(fā)表于 2022-1-6 16:58
我想用15F104w做個(gè)藍(lán)牙遙控開關(guān),就是串口不能用,能借鑒一下你的程序嗎

給你個(gè)程序。
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15Fxx 系列 軟件模擬串口舉例----------------------------------*/
  4. /* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
  5. /* 如果要在文章中應(yīng)用此代碼,請(qǐng)?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
  6. /*---------------------------------------------------------------------*/

  7. //本示例在Keil開發(fā)環(huán)境下請(qǐng)選擇Intel的8058芯片型號(hào)進(jìn)行編譯
  8. //若無特別說明,工作頻率一般為11.0592MHz


  9. #include "reg51.h"

  10. //-----------------------------------------
  11. //define baudrate const
  12. //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
  13. //NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)

  14. //#define BAUD  0xF400                  // 1200bps @ 11.0592MHz
  15. //#define BAUD  0xFA00                  // 2400bps @ 11.0592MHz
  16. //#define BAUD  0xFD00                  // 4800bps @ 11.0592MHz
  17. //#define BAUD  0xFE80                  // 9600bps @ 11.0592MHz
  18. //#define BAUD  0xFF40                  //19200bps @ 11.0592MHz
  19. #define BAUD  0xFFA0                    //38400bps @ 11.0592MHz

  20. //#define BAUD  0xEC00                  // 1200bps @ 18.432MHz
  21. //#define BAUD  0xF600                  // 2400bps @ 18.432MHz
  22. //#define BAUD  0xFB00                  // 4800bps @ 18.432MHz
  23. //#define BAUD  0xFD80                  // 9600bps @ 18.432MHz
  24. //#define BAUD  0xFEC0                  //19200bps @ 18.432MHz
  25. //#define BAUD    0xFF60                //38400bps @ 18.432MHz

  26. //#define BAUD  0xE800                  // 1200bps @ 22.1184MHz
  27. //#define BAUD  0xF400                  // 2400bps @ 22.1184MHz
  28. //#define BAUD  0xFA00                  // 4800bps @ 22.1184MHz
  29. //#define BAUD  0xFD00                  // 9600bps @ 22.1184MHz
  30. //#define BAUD  0xFE80                  //19200bps @ 22.1184MHz
  31. //#define BAUD  0xFF40                  //38400bps @ 22.1184MHz
  32. //#define BAUD  0xFF80                  //57600bps @ 22.1184MHz

  33. sfr AUXR = 0x8E;
  34. sbit RXB = P3^0;                        //define UART TX/RX port
  35. sbit TXB = P3^1;

  36. typedef bit BOOL;
  37. typedef unsigned char BYTE;
  38. typedef unsigned int WORD;

  39. BYTE TBUF,RBUF;
  40. BYTE TDAT,RDAT;
  41. BYTE TCNT,RCNT;
  42. BYTE TBIT,RBIT;
  43. BOOL TING,RING;
  44. BOOL TEND,REND;

  45. void UART_INIT();

  46. BYTE t, r;
  47. BYTE buf[16];

  48. void main()
  49. {
  50.     TMOD = 0x00;                        //timer0 in 16-bit auto reload mode
  51.     AUXR = 0x80;                        //timer0 working at 1T mode
  52.     TL0 = BAUD;
  53.     TH0 = BAUD>>8;                      //initial timer0 and set reload value
  54.     TR0 = 1;                            //tiemr0 start running
  55.     ET0 = 1;                            //enable timer0 interrupt
  56.     PT0 = 1;                            //improve timer0 interrupt priority
  57.     EA = 1;                             //open global interrupt switch

  58.     UART_INIT();

  59.     while (1)
  60.     {                                   //user's function
  61.         if (REND)
  62.         {
  63.             REND = 0;
  64.             buf[r++ & 0x0f] = RBUF;
  65.         }
  66.         if (TEND)
  67.         {
  68.             if (t != r)
  69.             {
  70.                 TEND = 0;
  71.                 TBUF = buf[t++ & 0x0f];
  72.                 TING = 1;
  73.             }
  74.         }
  75.     }
  76. }

  77. //-----------------------------------------
  78. //Timer interrupt routine for UART

  79. void tm0() interrupt 1
  80. {
  81.     if (RING)
  82.     {
  83.         if (--RCNT == 0)
  84.         {
  85.             RCNT = 3;                   //reset send baudrate counter
  86.             if (--RBIT == 0)
  87.             {
  88.                 RBUF = RDAT;            //save the data to RBUF
  89.                 RING = 0;               //stop receive
  90.                 REND = 1;               //set receive completed flag
  91.             }
  92.             else
  93.             {
  94.                 RDAT >>= 1;
  95.                 if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer
  96.             }
  97.         }
  98.     }
  99.     else if (!RXB)
  100.     {
  101.         RING = 1;                       //set start receive flag
  102.         RCNT = 4;                       //initial receive baudrate counter
  103.         RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  104.     }

  105.     if (--TCNT == 0)
  106.     {
  107.         TCNT = 3;                       //reset send baudrate counter
  108.         if (TING)                       //judge whether sending
  109.         {
  110.             if (TBIT == 0)
  111.             {
  112.                 TXB = 0;                //send start bit
  113.                 TDAT = TBUF;            //load data from TBUF to TDAT
  114.                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  115.             }
  116.             else
  117.             {
  118.                 TDAT >>= 1;             //shift data to CY
  119.                 if (--TBIT == 0)
  120.                 {
  121.                     TXB = 1;
  122.                     TING = 0;           //stop send
  123.                     TEND = 1;           //set send completed flag
  124.                 }
  125.                 else
  126.                 {
  127.                     TXB = CY;           //write CY to TX port
  128.                 }
  129.             }
  130.         }
  131.     }
  132. }

  133. //-----------------------------------------
  134. //initial UART module variable

  135. void UART_INIT()
  136. {
  137.     TING = 0;
  138.     RING = 0;
  139.     TEND = 1;
  140.     REND = 0;
  141.     TCNT = 0;
  142.     RCNT = 0;
  143. }

復(fù)制代碼

作者: 188610329    時(shí)間: 2022-1-6 19:32
6313 發(fā)表于 2022-1-6 16:58
我想用15F104w做個(gè)藍(lán)牙遙控開關(guān),就是串口不能用,能借鑒一下你的程序嗎

STC官方ISP 里面有 定時(shí)器+INT4 模擬半雙工 串口的 范例。絕對(duì)可用。
作者: pcbboy    時(shí)間: 2022-1-7 16:45
6313 發(fā)表于 2022-1-6 16:58
我想用15F104w做個(gè)藍(lán)牙遙控開關(guān),就是串口不能用,能借鑒一下你的程序嗎

為啥不用STC8G1K08 ,也是8腳,才6毛5一片,功能強(qiáng)大多了。
作者: wufa1986    時(shí)間: 2022-1-7 17:26
官方就是串口下載程序,沒有的話也可以軟件模擬




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