51单片机串口通讯写一个字符

51单片机与电脑串口通信写一个字符,为什么会无限输出同一个字符。无限输出2

51单片机串口通讯写一个字符。
你主程序这么写,发送一个字符后,单片机并不停止。应该加一行无限循环语句,
while(1);才能停,如下

追问

这个是写字符串的 为什么运行后只写了一个1?

追答

那个字符串是什么,没拍到。

追问

追答

发送函数 的指针类型错了,改成:unsigned char 型,见下图

追问

改了参数后只输出4

追答

把发送程序的while改成
while(*sj>0) 试一下,把延时语句去掉,别延时。延时子程序,好像是死循环,回不来了。串口发送也不用延时啊。

追问

我吧delay(5)去掉就可以了

为什么?

我的延时写错了🙈🙈

追答

你那延时子程序是死循环,调用就死了。

再说了,串口发送不用延时啊,谁告诉你要延时,有点杞人忧天

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-11-19
#include <reg51.h>
#include <string.h>
unsigned char ch;

bit read_flag= 0 ;

void init_serialcom( void ) //串口通信初始设定

{

SCON = 0x50 ; //UART为模式1,8位数据,允许接收

TMOD |= 0x20 ; //定时器1为模式2,8位自动重装

PCON |= 0x80 ; //SMOD=1;

TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz

IE |= 0x90 ; //Enable Serial Interrupt

TR1 = 1 ; // timer 1 run

TI=1;

}

//向串口发送一个字符

void send_char_com( unsigned char ch)

{

SBUF=ch;

while (TI== 0);

TI= 0 ;

}

//串口接收中断函数

void serial () interrupt 4 using 3

{

if (RI)

{

RI = 0 ;

ch=SBUF;

read_flag= 1 ; //就置位取数标志

}

}

main()

{

init_serialcom(); //初始化串口

while ( 1 )

{

if (read_flag) //如果取数标志已置位,就将读到的数从串口发出

{

read_flag= 0 ; //取数标志清0

send_char_com(ch);

}

}

}
第2个回答  2018-11-19
程序没有停止,执行一次后会自动从头开始
在程序末尾加while(1);即可
第3个回答  2018-11-19
主函数在 ZF(‘2’);后要加一条语句:
while(1);
相似回答