找回密码
 立即注册
查看: 278|回复: 1

STC15F104W串口接收问题

[复制链接]

196

主题

259

回帖

639

积分

高级会员

积分
639
发表于 2026-5-10 22:19:57 | 显示全部楼层 |阅读模式
STC15F104W没有串口通信能力吧?把P3.0口改成模拟串口接收,怎么也不能接收数据?在5V供电情况下,怎么配置,电压3.3V以下,怎么回事?
回复

使用道具 举报 送花

已绑定手机

11

主题

486

回帖

1368

积分

金牌会员

积分
1368
发表于 2026-5-11 08:19:18 | 显示全部楼层
模拟串口

  1. #include "reg51.h"
  2. //-----------------------------------------
  3. //define baudrate const
  4. //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
  5. //NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)
  6. //#define BAUD  0xF400                  // 1200bps @ 11.0592MHz
  7. //#define BAUD  0xFA00                  // 2400bps @ 11.0592MHz
  8. //#define BAUD  0xFD00                  // 4800bps @ 11.0592MHz
  9. //#define BAUD  0xFE80                  // 9600bps @ 11.0592MHz
  10. //#define BAUD  0xFF40                  //19200bps @ 11.0592MHz
  11. #define   BAUD  0xFFA0                  //38400bps @ 11.0592MHz
  12. typedef unsigned char uchar;
  13. typedef unsigned int uint;
  14. sfr  AUXR = 0x8E;
  15. sbit RXB = P3^0;         //define UART TX/RX port
  16. sbit TXB = P3^1;
  17. uchar TBUF,RBUF;
  18. uchar TDAT,RDAT;
  19. uchar TCNT,RCNT;
  20. uchar TBIT,RBIT;
  21. bit TING,RING;
  22. bit TEND,REND;
  23. uchar t, r;
  24. uchar buf[16];
  25. //初始UART模块
  26. void UART_INIT()
  27. {
  28.         TING = 0;
  29.         RING = 0;
  30.         TEND = 1;
  31.         REND = 0;
  32.         TCNT = 0;
  33.         RCNT = 0;
  34.         TMOD = 0x00;   //timer0 in 16-bit auto reload mode
  35.         AUXR = 0x80;   //timer0 working at 1T mode
  36.         TL0 = BAUD;    //波特率38400
  37.         TH0 = BAUD>>8; //initial timer0 and set reload value
  38.         TR0 = 1;       //tiemr0 start running   
  39.         ET0 = 1;       //enable timer0 interrupt  
  40.         PT0 = 1;       //improve timer0 interrupt priority
  41.         EA = 1;        //open global interrupt switch  
  42. }
  43. //
  44. void main()
  45. {
  46. //        P0M0 = 0x00;
  47. //        P0M1 = 0x00;
  48. //        P1M0 = 0x00;
  49. //        P1M1 = 0x00;
  50. //        P2M0 = 0x00;
  51. //        P2M1 = 0x00;
  52. //        P3M0 = 0x00;
  53. //        P3M1 = 0x00;
  54.    UART_INIT();
  55.         while (1)
  56.         {               //user's function
  57.                 if (REND)       
  58.                 {
  59.                         REND = 0;
  60.                         buf[r++ & 0x0f] = RBUF;
  61.                 }
  62.                 if (TEND)       
  63.                 {
  64.                         if (t != r)
  65.                         {
  66.                                 TEND = 0;
  67.                                 TBUF = buf[t++ & 0x0f];
  68.                                 TING = 1;
  69.                         }
  70.                 }
  71.         }
  72. }
  73. //-----------------------------------------
  74. //Timer interrupt routine for UART  
  75. void tm0() interrupt 1 using 1
  76. {
  77.         if (RING)
  78.         {
  79.                 if (--RCNT == 0)
  80.                 {
  81.                         RCNT = 3;                   //reset send baudrate counter
  82.                         if (--RBIT == 0)
  83.                         {
  84.                                 RBUF = RDAT;            //save the data to RBUF
  85.                                 RING = 0;               //stop receive
  86.                                 REND = 1;               //set receive completed flag
  87.                         }
  88.                         else
  89.                         {
  90.                                 RDAT >>= 1;
  91.                                 if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer
  92.                         }
  93.                 }
  94.         }
  95.         else if (!RXB)
  96.         {
  97.                 RING = 1;                       //set start receive flag
  98.                 RCNT = 4;                       //initial receive baudrate counter
  99.                 RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  100.         }                                                                                         
  101.         if (--TCNT == 0)
  102.         {
  103.                 TCNT = 3;                       //reset send baudrate counter
  104.                 if (TING)                       //judge whether sending
  105.                 {
  106.                         if (TBIT == 0)
  107.                         {
  108.                                 TXB = 0;                //send start bit
  109.                                 TDAT = TBUF;            //load data from TBUF to TDAT
  110.                                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  111.                         }                                                                       
  112.                         else
  113.                         {
  114.                                 TDAT >>= 1;             //shift data to CY
  115.                                 if (--TBIT == 0)
  116.                                 {
  117.                                         TXB = 1;
  118.                                         TING = 0;           //stop send
  119.                                         TEND = 1;           //set send completed flag
  120.                                 }
  121.                                 else
  122.                                 {
  123.                                         TXB = CY;           //write CY to TX port
  124.                                 }
  125.                         }
  126.                 }
  127.         }
  128. }
  129. //-----------------------------------------
复制代码


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-8 20:45 , Processed in 0.066261 second(s), 42 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表