A. 51单片机+NRF24L01发送接收问题!
检查一下波特率的设置。
主程序:
void main(void)
{
uchar zt,zy;
init_NRF24L01() ;
TxBuf[1] = 0 ;
Delay(6000);
while(1)
{
TxBuf[1]="a";
nRF24L01_TxPacket(TxBuf);
TxBuf[1]=0;
Delay(6000);
Delay(6000);
zt=0;
zt=SPI_Read(STATUS);
if(zt==0x2e)
{
LED=1;
Delay(6000);
Delay(6000);
}
Delay(6000);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
Delay(6000);
zy=0;
zy=SPI_Read(FIFO_STATUS);
if(zy==0x11)
{
LED=0;
Delay(6000);
Delay(6000);
}
Delay(6000);
Delay(6000);
}
}
主程序能发送成功
——————————————————————————————————
接收程序:
void main(void)
{
unsigned char RxBuf[20]={0}; //
init_NRF24L01() ;
//SetRX_Mode();
while(1)
{
SetRX_Mode();
if(nRF24L01_RxPacket(RxBuf)) // Transmit Tx buffer data
{
if( RxBuf[1]=="a")
{
LED=1;
}
RxBuf[1]==0x00;
}
}
B. 51单片机如何进行多字节串口接收!!!
看数据量和数据速度,如果数据量小,间隔大。那么完全可以单独接收和显示。如果是间隔时间小,可以在接收到开始标志之后,把需要的数据存在数组中,在收到结束标志之后慢慢解析数据包
C. 51单片机串口接收问题
串口接收是双缓存相互交换接收的,你只要在发送一个字节的时序内就取走上次的数据那不会出错的。所以在这最好用中断来完成最好。
D. 51单片机串口查询方式收发字符串,程序求解
编程目的,单片机把从PC发送的字符串,原样发送给PC。想用查询法,程序运行出错,求指正。#include #include #include#define uchar unsigned char #define uint unsigned int #define rxin 90uchar shebeihao[];uchar code OK[]="OK";uchar idata systembuf[rxin]; uchar rx,sx; void delay(uint z){ uint x,y; for(x=z;x0;x--) for(y=200;y0;y--); } void uart(){ TMOD=0x20;//设置定时器1为工作方式2 设置定时器0为工作方式1 TH1=0xfd; //波特率9600 TL1=0xfd; PCON=0x00; SCON=0x50; TR1=1; //EA=1; //ES=1; }void sendchar(uchar ch){SBUF=ch;while(TI==0);TI=0;}void sendstring(uchar *p){while(*p) { sendchar(*p); p++; } sendchar(0x0D); sendchar(0x0A);}void main(){ sx=0; uart(); if(RI) { delay(2000); if(sx0) { sendstring(shebeihao); } }
E. 51单片机串口收发问题
这个问题应该是软件处理不够好造成的,我使用115200波特率都没有问题。你可以换一个晶振比如最好用11.0592M这类波特率没有理论上误差的晶振
F. 51单片机通过串口实现数据的发送与接收程序
串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。
一般来说,过程如下:
1,配置串口参数、波特率等,开启串口中断;
void Init_UART()
{
}
2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;
程序一般为:
void UART_ISR() interrupt x using y
{
;串口中断处理函数
}
x - 单片机的C51中断号
y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)
3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//数据发送函数
}
}
G. 51单片机查询方式收发问题 汇编语言
这段程序本身没有啥大问题,不知道程序全貌,如果出现问题,可能在前面初始化部分吧,修改如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV SCON,#50H
SETB TR1
MOV A,#5AH
LOOP:
MOV SBUF,A
JNB TI,$
CLR TI
JNB RI,$
CLR RI
MOV A,SBUF
SJMP LOOP
END
H. 请问51单片机如何解决多字节串口接收问题
串口的收发可以用查询和中断两个办法来实现。
1、查询方法更适合于半双工机制,编写的思路简单,程序结构简单,在全双工通信中易出问题。
2、中断方法则更高效。你的程序把两种方法混搭使用,容易出错。
以你的程序为例,一旦收到首个23H字符,就停止在中断服务中for循环里面等待5个剩余字符。假设传感器只发了3个字符,你的程序就停止在for循环里面。
以你的程序为例改进,在中断服务接收中,每次接收中断只收1个字符,完成后退出。
void uart_interrupt(void) interrupt 4 using 0
{
static unsigned char i=0;
unsigned char buf;
if(RI==1)
{
buf=SBUF;
switch(i)
{
case 0:
if(buf==0x23)i=1;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
buffer[i-1]=buf;
i++;
if(buf==0x23)
i=1;
if(i==5)
{
do_something_here(buffer);
i=0;
}
break;
default: i=0;break;
}
RI = 0; //RI清零
}
if(TI==1) TI=0; //TI清零
}
这样改符合你的思维习惯吗?实际串口协议解析与协议密切相关,用状态机做比较好。程序中i把它变成状态机的状态,思考一下,改改程序更佳。
I. 简述c51单片机串行口数据发送和数据接收过程
参考吴鉴鹰吧里面的资料,我也学习单片机,有吴鉴鹰单片机开发板(评价不错的一款单片机开发板),这样实验+理论,然后看视频学习会更好。有兴趣可以看下
串行口初始化编程格式:
SIO: MOV TMOD,#20H ;T1作波特率发生器
MOV TH1,#X ;定时初值选定波特率
MOV TL1,#X MOV PCON,#00H ;SMOD=0,就是波特率不增倍CLR TI ;清除发送中断标志SETB TR1 ;打开定时器1 2、发送程序
查询方式: TRAM: MOV A,@R0 ;取数据
MOV SBUF,A ;发送一个字符
WAIT:JBC TI,NEXT ;等待发送结束
SJMP WAIT NEXT: INC R0 ;准备下一次发送
SJMP TRAM3、接收程序
WAIT: JBC RI,NEXT ;查询等待
SJMP WAIT NEXT: MOV A,SBUF ;读取接收数据
MOV @R0,A ;保存数据
INC R0 ;准备下一次接收
SJMP WAIT 这个是用软件查询方法做的,没有设定数据校验。
J. 51单片机串口收发数据莫名错误,该怎么处理
这没啥错误的,是按要求的发送的数据的。第一行中有\r\n,这是控制符,显示时就会换行的,没问题。