求助:擎天柱写入程序以后,插在电脑USB口运行正常,插在+5V电源上不能运行
求助:擎天柱写入程序以后,插在电脑USB口运行正常,插在+5V电源上不能运行一个手控板流水灯,按下P32按钮依次点亮灯,每次按下多一个灯点亮,代码如下:
C
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8unsigned 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电源也不能运行了,
问题分析与解决方案
问题描述
用户在将擎天柱(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 u8unsigned 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
[本文内容由国芯人工智能辅助生成,仅供参考] 可以通过下载最新版本的USB库函数解决这个问题
最新的USB库中内置了部分判断逻辑,直接使用即可
https://www.stcai.com/khs 谢谢各位大佬!! while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
卡在这段语句了 while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
屏蔽掉就可以了
页:
[1]