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.电路图
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行
乘风飞扬 发表于 2026-4-13 11:39
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行
哦,好的,我下来试试,感谢! 王凯_h0uzE 发表于 2026-4-13 14:22
哦,好的,我下来试试,感谢!
不但要改用定时器2做串口波特率发生器,P3.0、P3.1也不能设置推挽模式,要设置准双向模式。 wulin 发表于 2026-4-13 14:40
不但要改用定时器2做串口波特率发生器,P3.0、P3.1也不能设置推挽模式,要设置准双向模式。 ...
好的,谢谢,第一次用这个片子,被折磨了两天了 乘风飞扬 发表于 2026-4-13 11:39
这颗芯片没有定时器1,所以不能用定时器1作为串口波特率发生器,改成定时器2做串口波特率发生器就行
感谢,感谢,测试成功了
页:
[1]