串口通信出现问题,请大家教我一下

问题遇到的现象和发生背景

串口通信不行,没办法通过串口发送字符控制流水灯和蜂鸣器

问题相关代码,请勿粘贴截图

#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit beep = P3^7;

u8 transmit[] = "I am a teacher.";
u8 j,i,temp,mid,beep_time;
u16 cnt;
bit flag,beep_flag,start_flag;
u8 n = 15;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void UartInit(void) //4800bps@12.000MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率

TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
}
void Timer0Init(void) //100微秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0x9C; //设置定时初值
TH0 = 0x9C; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}

//void delay(u16 time)
//{
// while(time--);
//}

void transmit_data(unsigned char * addr)
{
i=0;
while(addr[i] != '\0')
{
SBUF = addr[i];
while(TI == 0);
TI = 0;
i++;
}
}

void main()
{
UartInit();
Timer0Init();
EA=1;
// transmit_data(transmit);
beep_flag = 0;
P0 = 0x01;
while(1)
{
if(start_flag == 0)
{
P0=
(0x01<<cnt);
if(cnt>= 8)
{
cnt = 0;
}
}
if(start_flag == 1)
{
P0=(0x01<<cnt);
if(cnt>= 8)
{
cnt = 0;
}

}

}
}
void t0_isr()interrupt 1 //每隔100us进中断一次
{
TF0 = 0;
if(beep_flag == 1)beep = ~beep;
cnt ++;
if(cnt >= 10000)
{
cnt = 0;
n--;
if(n == 0)n=15;
}

if(beep_time != 0)
{
beep_time--;
}
else
beep_flag = 0;

}
void usart_isr() interrupt 4
{
if(RI == 1)
{
RI = 0;
mid = SBUF;
if(mid == 'Q')
{
start_flag = 1;
beep_flag = 1;
beep_time = 500;
}

if(mid == 'T')
{
start_flag = 0;
beep_flag = 1;
beep_time = 500;
}
SBUF = mid;
}
// if(TI == 1)
// {
// TI = 0;
// }
}

运行结果及报错内容

有一处警告,没有错误

我的解答思路和尝试过的方法

改了很多次,看了别人很多代码,改了又改,还是不行

我想要达到的结果

串口助手发送字符,蜂鸣器,流水灯工作