找回密码
 立即注册
查看: 31|回复: 5

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-04-13 10:40:26

1

主题

3

回帖

11

积分

新手上路

积分
11
发表于 前天 10:40 | 显示全部楼层 |阅读模式
我用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_SPEEDL  0x20            //360个时钟
#define ADC_SPEEDH  0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟
6.电路图



ScreenShot_2026-04-13_103935_869.png

STC15W408ASV1.rar

43.86 KB, 下载次数: 2

工程代码

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:660
  • 最近打卡:2026-04-14 08:56:09
已绑定手机

52

主题

2573

回帖

8998

积分

论坛元老

积分
8998
发表于 前天 11:39 | 显示全部楼层
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行

截图202604131138422313.jpg
截图202604131139072474.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-04-13 10:40:26

1

主题

3

回帖

11

积分

新手上路

积分
11
发表于 前天 14:22 | 显示全部楼层
乘风*** 发表于 2026-4-13 11:39
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2026-04-14 06:56:11
已绑定手机

2

主题

49

回帖

248

积分

中级会员

积分
248
发表于 前天 14:40 | 显示全部楼层
王凯_*** 发表于 2026-4-13 14:22
哦,好的,我下来试试,感谢!

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-04-13 10:40:26

1

主题

3

回帖

11

积分

新手上路

积分
11
发表于 前天 16:08 | 显示全部楼层
wul*** 发表于 2026-4-13 14:40
不但要改用定时器2做串口波特率发生器,P3.0、P3.1也不能设置推挽模式,要设置准双向模式。 ...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-04-13 10:40:26

1

主题

3

回帖

11

积分

新手上路

积分
11
发表于 前天 19:09 | 显示全部楼层
乘风*** 发表于 2026-4-13 11:39
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行

感谢,感谢,测试成功了
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-15 06:06 , Processed in 0.109901 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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