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,這是控制符,顯示時就會換行的,沒問題。