王凯_h0uzE 发表于 2026-4-13 10:40:26

STC15W408AS单片机串口keil仿真调试正常但实测不正常

我用STC15W408AS单片机,实现了ADC采集,同时加了串口调试信息输出。遇到这样的问题,还望走过路过的大佬帮忙看下:
1.在keil中配合虚拟串口测试时,看起来逻辑和通讯都是正常
2.程序烧录到目标板上后,串口通讯不正常,上位机软件收不到任何数据,程序逻辑感觉也不对。
以下我的工程代码:
1.串口初始化

void Uart1Init(void)        //115200bps@22.1184MHz
{
    PCON &= 0x7F;
    SCON = 0x50;
    AUXR |= 0x40;
    AUXR &= 0xFE;
    TMOD &= 0x0F;
    TMOD |= 0x20;
    TL1 = 0xD0;
    TH1 = 0xD0;
    ET1 = 0;
    TR1 = 1;
    ES = 1;
    // 可选:设置P3.0/P3.1为推挽输出
    P3M1 &= ~0x03;
    P3M0 |= 0x03;
}
2.ADC初始化

void ADC_Init(void)
{
        P1ASF = 0x01;                        //P1.0作为ADC输入
        ADC_RES = 0;                        //清除ADC结果寄存器
        ADC_RESL = 0;
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Del1ms(10);                                //等待ADC电源稳定
}
3.初始化总程序

void Isr_Init(void)
{
        Uart1Init();
        //Timer0Init();
        ADC_Init();
        EA = 1;
}
4.主程序


void main(void)
{
        unsigned int battery_voltage;
       
        DC12VCtl(OFF);
        Del1ms(1000);       
        Isr_Init();
        printf("Batter voltate detect ... \r\n");
        while(1)
        {
                if(USBIN == Enable)
                {
                        DC12VCtl(ON);
                        printf("Use the USB Power1 ... \r\n");
                }
                else
                {
                        battery_voltage = Get_Battery_Voltage();
                       
                        SendString("Battery:");
                        Send_UInt(battery_voltage);
                        SendString("mV\r\n");
                       
                        if(battery_voltage >= VOLTAGE_11_0V)
                        {
                                DC12VCtl(ON);
                        }
                        else
                        {
                                DC12VCtl(OFF);
                               
                                while(1)
                                {
                                        battery_voltage = Get_Battery_Voltage();
                                       
                                        SendString("Battery:");
                                        Send_UInt(battery_voltage);
                                        SendString("mV\r\n");
                                       
                                        if(battery_voltage >= VOLTAGE_11_5V)
                                        {
                                                DC12VCtl(ON);
                                                break;
                                        }
                                        if(USBIN == Enable)
                                        {
                                                DC12VCtl(ON);
                                                printf("Use the USB Power2 ... \r\n");
                                                break;
                                        }                                       
                                        Del1ms(10000);
                                }
                        }
                }
                Del1ms(10000);
        }
}



5.其他相关参数

sfr ADC_LOW2    =   0xBE;         //ADC低2位结果

#define ADC_POWER   0x80            //ADC电源控制位
#define ADC_FLAG    0x10            //ADC完成标志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540个时钟
#define ADC_SPEEDL0x20            //360个时钟
#define ADC_SPEEDH0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟
6.电路图



乘风飞扬 发表于 2026-4-13 11:39:12

这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行


王凯_h0uzE 发表于 2026-4-13 14:22:55

乘风飞扬 发表于 2026-4-13 11:39
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行




哦,好的,我下来试试,感谢!

wulin 发表于 2026-4-13 14:40:41

王凯_h0uzE 发表于 2026-4-13 14:22
哦,好的,我下来试试,感谢!

不但要改用定时器2做串口波特率发生器,P3.0、P3.1也不能设置推挽模式,要设置准双向模式。

王凯_h0uzE 发表于 2026-4-13 16:08:11

wulin 发表于 2026-4-13 14:40
不但要改用定时器2做串口波特率发生器,P3.0、P3.1也不能设置推挽模式,要设置准双向模式。 ...

好的,谢谢,第一次用这个片子,被折磨了两天了

王凯_h0uzE 发表于 2026-4-13 19:09:18

乘风飞扬 发表于 2026-4-13 11:39
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行




感谢,感谢,测试成功了
页: [1]
查看完整版本: STC15W408AS单片机串口keil仿真调试正常但实测不正常