cjtdz 发表于 2026-5-10 22:19:57

STC15F104W串口接收问题

STC15F104W没有串口通信能力吧?把P3.0口改成模拟串口接收,怎么也不能接收数据?在5V供电情况下,怎么配置,电压3.3V以下,怎么回事?

wulin 发表于 2026-5-11 08:19:18

模拟串口

#include "reg51.h"
//-----------------------------------------
//define baudrate const
//BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)

//#define BAUD0xF400                  // 1200bps @ 11.0592MHz
//#define BAUD0xFA00                  // 2400bps @ 11.0592MHz
//#define BAUD0xFD00                  // 4800bps @ 11.0592MHz
//#define BAUD0xFE80                  // 9600bps @ 11.0592MHz
//#define BAUD0xFF40                  //19200bps @ 11.0592MHz
#define   BAUD0xFFA0                  //38400bps @ 11.0592MHz

typedef unsigned char uchar;
typedef unsigned int uint;
sfrAUXR = 0x8E;
sbit RXB = P3^0;         //define UART TX/RX port
sbit TXB = P3^1;
uchar TBUF,RBUF;
uchar TDAT,RDAT;
uchar TCNT,RCNT;
uchar TBIT,RBIT;
bit TING,RING;
bit TEND,REND;
uchar t, r;
uchar buf;

//初始UART模块
void UART_INIT()
{
        TING = 0;
        RING = 0;
        TEND = 1;
        REND = 0;
        TCNT = 0;
        RCNT = 0;
        TMOD = 0x00;   //timer0 in 16-bit auto reload mode
        AUXR = 0x80;   //timer0 working at 1T mode
        TL0 = BAUD;    //波特率38400
        TH0 = BAUD>>8; //initial timer0 and set reload value
        TR0 = 1;       //tiemr0 start running   
        ET0 = 1;       //enable timer0 interrupt
        PT0 = 1;       //improve timer0 interrupt priority
        EA = 1;      //open global interrupt switch
}
//
void main()
{
//        P0M0 = 0x00;
//        P0M1 = 0x00;
//        P1M0 = 0x00;
//        P1M1 = 0x00;
//        P2M0 = 0x00;
//        P2M1 = 0x00;
//        P3M0 = 0x00;
//        P3M1 = 0x00;

   UART_INIT();
        while (1)
        {               //user's function
                if (REND)       
                {
                        REND = 0;
                        buf = RBUF;
                }
                if (TEND)       
                {
                        if (t != r)
                        {
                                TEND = 0;
                                TBUF = buf;
                                TING = 1;
                        }
                }
        }
}

//-----------------------------------------
//Timer interrupt routine for UART
void tm0() interrupt 1 using 1
{
        if (RING)
        {
                if (--RCNT == 0)
                {
                        RCNT = 3;                   //reset send baudrate counter
                        if (--RBIT == 0)
                        {
                                RBUF = RDAT;            //save the data to RBUF
                                RING = 0;               //stop receive
                                REND = 1;               //set receive completed flag
                        }
                        else
                        {
                                RDAT >>= 1;
                                if (RXB) RDAT |= 0x80;//shift RX data to RX buffer
                        }
                }
        }
        else if (!RXB)
        {
                RING = 1;                     //set start receive flag
                RCNT = 4;                     //initial receive baudrate counter
                RBIT = 9;                     //initial receive bit number (8 data bits + 1 stop bit)
        }                                                                                       
        if (--TCNT == 0)
        {
                TCNT = 3;                     //reset send baudrate counter
                if (TING)                     //judge whether sending
                {
                        if (TBIT == 0)
                        {
                                TXB = 0;                //send start bit
                                TDAT = TBUF;            //load data from TBUF to TDAT
                                TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
                        }                                                                       
                        else
                        {
                                TDAT >>= 1;             //shift data to CY
                                if (--TBIT == 0)
                                {
                                        TXB = 1;
                                        TING = 0;         //stop send
                                        TEND = 1;         //set send completed flag
                                }
                                else
                                {
                                        TXB = CY;         //write CY to TX port
                                }
                        }
                }
        }
}

//-----------------------------------------


页: [1]
查看完整版本: STC15F104W串口接收问题