⑴ 51单片机,通过串口助手向单片机发送字符串,单片机将字符串逆序发送回计算机,用C语言编程
像这种发送字符串的,需要有一个字符串结束标志,不能用0作为字符串结束标志了!这里以回车作0xd为结束标志!
#include <reg51.h>
typedef unsigned char uint8;
bit flag = 0;
uint8 idata buf[30];
uint8 ct;
void InitUART(void) //串口初始化 9600bps
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void Send(uint8 c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
char j;
InitUART();
while(1)
{
if(flag) //是否接收到回车 字符串发送完
{
flag = 0;
for(j = ct ; j > 0 ; j--)
{
Send(buf[j-1]);
}
}
}
}
void UARTInterrupt(void) interrupt 4
{
static uint8 i = 0;
if(RI)
{
RI = 0;
buf[i++] = SBUF;
if(SBUF == 0x0d) //接受到回车
{
ct = i-1 ;
flag = 1;
i = 0;
}
}
else
TI = 0;
}
仿真结果
程序作为参考 希望 你自己能理解程序!只有自己掌握了才能很好地用!
⑵ 51单片机通信问题,串口调试助手能接受单片机发送的数据,但是单片机却不能接受串口调试助手发送的数据。
不需要延时的。下面的程序可以正常接收。
ORG 0000H
SJMP START
ORG 0030H
START:
MOV P1, #0FBH ;给p1附初值
MOV SCON, #50H ;设置串口工作方式1
MOV PCON, #00H ;波特率不加倍
MOV TMOD, #20H ;设置定时器1工作方式2
MOV TL1, #0FDH
MOV TH1, #0FDH ;给定时器赋值,波特率为9600
SETB TR1 ;启动定时器
MAIN:
JBC RI, RCV ;若RI为1,则转到RCV,否则跳转MAIN
SJMP MAIN
RCV:
MOV A, SBUF ;将接受到的数据读到累加器中
MOV P1, A ;将累加器中的数据送到P1口显示
SJMP MAIN ;跳转主程序
END
⑶ 51单片机与计算机串口通信无法读出数据
答:
1 判断你的硬件有没有问题;方法是 用跳线讲串口的pin2 和pin3短接,用串口调试助手发送数据看调试助手能不 能自己收到,能就说明是单片机程序有问题
2 你检查你的波特率是生成程序是否正确, 中断和主程序用 1楼给你程序,我看了 没问题。
这样就可以实现串口通信了
⑷ 51单片机中串口通信在哪个端口,有没有固定的。。
51单片机中的串口通信是通过P3口的两个引脚(即P3.0和P3.1)实现的,其中P3.0口为串口接收引脚(RXD),P3.1口为串口发送引脚(TXD)。在51单片机中,串口通信的端口是固定的,即P3.0口和P3.1口。这两个引派差脚通过串口通信电路与串口通信芯片相连,实现串口通信功能。需要注意的是,在使用51单片机进行串口通信时,需要根据迟羡隐具体的通信协议和波特率等参数进行相关的配置,并在程码厅序中编写相应的串口通信代码,才能实现数据的发送和接收。