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

求助:擎天柱写入程序以后,插在电脑USB口运行正常,插在+5V电源上不能运行

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-17 21:45:25

10

主题

36

回帖

262

积分

中级会员

积分
262
发表于 2025-4-8 18:32:00 | 显示全部楼层 |阅读模式
求助:擎天柱写入程序以后,插在电脑USB口运行正常,插在+5V电源上不能运行
一个手控板流水灯,按下P32按钮依次点亮灯,每次按下多一个灯点亮,代码如下:
C
#include "ai8051u.h"            //调用头文件
#include "stc32_stc8_usb.h"        //调用头文件
#include "intrins.h"            //d调用头文件

#define u8  unsigned char        //8位无符号变量(0-255)
#define u16 unsigned int        //16位无符号变量(0-65535)   
u8 buttonPressCount = 0;  // 定义一个变量来记录按钮按下的次数
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";


void main(void)

{
    u8 i;  // 提前声明循环变量

    WTST = 0;                                          //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                         //扩展寄存器(XFR)访问使能
    CKCON = 0;                                         //提高访问XRAM速度
   
    P_SW2 |= 0x80;
   
  
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
   
   
    usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                            //IE |= 0X80;
   
    P40 = 0;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
   
    while(1)

    {
        if (bUsbOutReady)    ;                        // 如果接收到了数据
        {
            USB_SendData(UsbOutBuffer,OutNumber);   // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            usb_OUT_done();                            // 标记接收完成
        }
        
        // 任务1:按下P32按钮依次点亮灯,每次按下多一个灯点亮
        if( P32 == 0 )                                // 判断P32按钮是否按下
        {
            buttonPressCount++;                        // 按钮按下次数加1
            while(P32 == 0);                        // 等待按钮松开,防止抖动
        }
        
        // 当X=4时,回到待机状态
        if(buttonPressCount == 4)
        {
            buttonPressCount = 0;                    // 重置按钮次数
            P2= 0xFF;                                // 熄灭所有灯(假设P0口低电平点亮)
        }
        else
        {
            // 根据按钮按下的次数点亮对应的灯
            for(i = 0; i < buttonPressCount; i++)   // 使用提前声明的变量 i
            {
                P2 = ~(1 << i);                        // 点亮从P00到P0X的灯
            }
        }
    }
}
在电脑USB口取电程序运行正常,但是在+5V供电的条件下,只亮POUER和VCC两个灯,按下P32没有任何反应,怀疑电源供电质量,分别用台式机电源,手机充电器,78M05、LM2596S-ADJ、AMS1117-5V稳压电路和教学电源(LM2596S-ADJ和教学电源调至5V)供电,还是不能运行程序,中间更换全新擎天柱板载源程序运行正常,更换我自己的程序以后就出现故障。也参考《擎天柱程序电源供电不能运行》擎天柱程序电源供电不能运行https://www.stcaimcu.com/thread-12845-1-1.html(出处: 国芯技术交流网站),注释掉了USB配置,虽然通过编译,但是在电脑USB电源也不能运行了,



qtz.jpg
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-8 18:33:00 | 显示全部楼层
问题分析与解决方案

问题描述
用户在将擎天柱(STC单片机)写入程序后,发现通过电脑USB口供电时程序运行正常,但使用外部+5V电源供电时无法正常运行。具体表现为手控板流水灯程序在按下P32按钮时,无法按预期依次点亮LED灯。

可能原因分析
1. 电源稳定性问题:
外部+5V电源可能存在电压波动或电流不足的情况,导致单片机无法稳定工作。
电源纹波过大,可能影响单片机的正常运行。

2. 电源滤波电容不足:
外部电源的滤波电容不足,导致电源噪声影响单片机的正常工作。

3. 电源极性接反:
外部电源的极性可能接反,导致单片机无法正常工作。

4. 电源电压不匹配:
外部电源的实际输出电压可能低于或高于+5V,导致单片机无法正常工作。

5. 程序初始化问题:
程序在初始化时可能依赖于USB供电的某些特性,导致在外部电源供电时无法正常初始化。

解决方案
1. 检查电源稳定性:
使用示波器或万用表检查外部+5V电源的电压和纹波,确保电源稳定且符合要求。
如果电源不稳定,建议更换为质量更好的电源。

2. 增加滤波电容:
在单片机的电源引脚附近增加一个100nF的陶瓷电容和一个10μF的电解电容,以滤除电源噪声。

3. 检查电源极性:
确保外部电源的极性正确,避免接反。

4. 验证电源电压:
使用万用表测量外部电源的实际输出电压,确保其接近+5V。

5. 检查程序初始化:
确保程序在初始化时没有依赖于USB供电的特定特性。例如,检查是否有与USB相关的初始化代码在外部电源供电时无法执行。

代码优化建议
在现有代码的基础上,可以增加一些调试信息,以便更好地定位问题。例如,可以在程序启动时通过串口输出调试信息,或者在LED灯点亮时输出状态信息。

```c
include "ai8051u.h"            //调用头文件
include "stc32stc8usb.h"        //调用头文件
include "intrins.h"            //调用头文件

define u8  unsigned char        //8位无符号变量(0-255)
define u16 unsigned int        //16位无符号变量(0-65535)   
u8 buttonPressCount = 0;  // 定义一个变量来记录按钮按下的次数
char USERDEVICEDESC = NULL;
char USERPRODUCTDESC = NULL;
char USERSTCISPCMD = "@STCISP#";

void main(void)
{
    u8 i;  // 提前声明循环变量

    WTST = 0;                                          //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                         //扩展寄存器(XFR)访问使能
    CKCON = 0;                                         //提高访问XRAM速度

    // 初始化串口,用于调试信息输出
    UARTInit();  // 假设UARTInit()是初始化串口的函数

    while (1) {
        if (P32 == 0) {  // 检测P32按钮是否按下
            buttonPressCount++;  // 按钮按下次数加1
            for (i = 0; i < buttonPressCount; i++) {
                P1 = ~(1

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-4-8 19:00:31 | 显示全部楼层
可以通过下载最新版本的USB库函数解决这个问题
最新的USB库中内置了部分判断逻辑,直接使用即可
https://www.stcai.com/khs
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-17 21:45:25

10

主题

36

回帖

262

积分

中级会员

积分
262
发表于 2025-4-8 19:20:45 | 显示全部楼层
谢谢各位大佬!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2025-4-8 20:18:42 | 显示全部楼层
while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
卡在这段语句了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-05-01 09:11:48
已绑定手机

5

主题

28

回帖

315

积分

中级会员

积分
315
发表于 2025-4-8 21:57:27 | 显示全部楼层
while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
屏蔽掉就可以了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:13 , Processed in 0.265182 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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