wanli 发表于 2026-1-2 15:08:17

串口1P31 P31 奇校验1位停止位在STC8H8K64U-LQFP64运行正常改到STC8H8K64U -TSSOP20

串口1P31 P31 奇校验1位停止位在STC8H8K64U-LQFP64运行正常改到STC8H8K64U -TSSOP20就不正常运行下面是串口1的配置奇校验1位停止位
/**
* 串口1初始化函数 (用于与电脑通信,P3.0/P3.1)
* 配置: 波特率9600, 奇校验, 1位停止位
*/
void UART1_Init(u32 brt)
{   
    SCON = 0xD0;      // 模式3:9位数据, 可变波特率, 包含校验位
    PCON |= 0x80;       // SMOD=1, 波特率倍频

    AUXR |= 0x40;       // 定时器时钟1T模式
    AUXR &= 0xFE;       // 串口1选择定时器1为波特率发生器

    TMOD &= 0x0F;       // 设置定时器模式
    TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / brt) >> 8);
    TL1 = (u8)(65536UL - (MAIN_Fosc / 4) / brt);

    ET1 = 0;            // 禁止Timer1中断
    TR1 = 1;            // 运行Timer1

    ES = 1;             // 允许串口中断
    EA = 1;             // 开启总中断

    P_SW1 &= ~0xc0;   // UART1/USART1: RxD(P3.0), TxD(P3.1)

}

/**
* 计算奇校验位
*/
unsigned char calculate_odd_parity(unsigned char dat)
{
    unsigned char parity = 0;
    unsigned char temp = dat;// 使用临时变量避免修改原数据
    while(temp) {
      parity ^= temp & 1;
      temp >>= 1;
    }
    return !parity;// 奇校验:使数据位中1的总数为奇数
}

/**
* 串口1发送一个字节(带奇校验)
*/
void UART1_SendByte(unsigned char dat)
{
    // 计算奇校验位并设置TB8
    TB8 = calculate_odd_parity(dat);

    SBUF = dat;               // 写入发送数据
    while(!TI);               // 等待发送完成(TI=1)
    TI = 0;                     // 清除TI标志位
}

/**
* 发送字符串
*/
void SendString(u8 *s, u8 num)
{
    u8 i;
    for(i = 0; i < num; i++) {
      UART1_SendByte(s);
    }
}


/**
* 发送11个0x55字节(同步命令)
*/
void SendSyncCommand()
{
    SendString((char*)SYNC_CMD, 11);
}
/**
* 发送11个0x00字节(查询命令)
*/
void SendQueryCommand()
{
    SendString((char*)QUERY_CMD, 11);
}

wanli 发表于 2026-1-2 19:36:02

已经解决又是把芯片搞烧了{:tu:}
页: [1]
查看完整版本: 串口1P31 P31 奇校验1位停止位在STC8H8K64U-LQFP64运行正常改到STC8H8K64U -TSSOP20