- 打卡等级:以坛为家I
- 打卡总天数:276
- 最近打卡:2026-03-23 09:32:26
已绑定手机
金牌会员
- 积分
- 1246
|
串口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);
}
|
|