单片机串口发送数据 SBUF不读

2025-03-04 00:36:22
推荐回答(1个)
回答1:

如下我编写的程序,调试成功,你试试看

#include
/*
外部中断0,(INT0) 中断号0
定时器/计数器0,(T0) 中断号1
外部中断1,(INT1) 中断号2
定时器/计数器1,(T1) 中断号3
串行口(RI,TI) 中断号4
定时器/计数器2,(T2) 中断号5

串口输入RX: P3.0
串口输出TX: P3.1
外部中断INT0: P3.2
外部中断INT1: P3.3
外部计数输入引脚T0: P3.4
外部计数输入引脚T1: P3.5
WR控制引脚: P3.6
RD控制引脚: P3.7

外部计数输入引脚T2: P1.0
外部触发信号输入引脚T2EX: P1.1
*/

/*
方式0 同步移位寄存器方式,TX脉冲,RX数据(入/出)
方式2,方式3 是9位的UART

通常用方式1的8位UART
方式1和3的波特率计算:(smod为1表示波特率两倍,为0表示不变)
波特率=(2^smod/32)*(Fosc/(12*(256-X)))

TL1和TH1=X=256-(Fosc*(smod+1))/(384*波特率)
用12MHz晶振会有小误差,用11.0592晶振无误差
*/

#define loopback 1 //为0不回送,开始的时候发送一些数据,为1接收到的数据回送#define tx_data_on_power 1 //0上电不发送数据,1上电发送数据
unsigned char table1[]="xpj007 is the best!",*p=table1;
unsigned char dat;
void init_serial_port()//初始化串口,用T1做波特率发生器
{
SCON=0x50;//串行方式1,允许串行接收
//或者如下代码
/*SM0=0;SM1=1;SM2=0;
REN=1;
TB8=0;RB8=0;
TI=0;RI=0;*/
ES=1;//允许串行通信中断
PCON=0X80;//0x80波特率加倍(加倍可以缩小误差)
TMOD=0x20;//计数器1工作方式2,自动填充
TH1=256-6;
//11.0592Mhz晶振256-6对应波特率9600, 256-12对应波特率4800,256-48对应波特率1200
//256-3对应波特率19200,256-4对应波特率14400
TL1=256-6;//
TR1=1;////启动T1,这里溢出信号不仅给中断,也给串口
EA=1;//使能总中断
}

void main()
{
init_serial_port();//初始化串口
#if tx_data_on_power==1
while(*p)
{
SBUF=*p++;
while(TI==0);
TI=0;//清除发送标志
}
#endif
while(1)
{
;
}
}

void serial_port_isr() interrupt 4
{
if(RI)//中断为接收中断
{
RI=0;
dat=SBUF;//接收到的数据保存
#if loopback==1//回送接收到的数据
SBUF=dat;//发送数据
#endif
}
}