📄 receivemcu.c
字号:
/*******************************************************************************
* 描述: *
* 单片机从nrf401接收数据,只有当接收到正确的引导符后,再将后面一个协议包*
* 长度的数据经串口传输送到PC机; *
* 引导符:长度:两个字节,内容:1)0xFF,2)0x55 *
* 数据包:长度:3个字节 *
* 结束符:长度:1,内容:'E' *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
unsigned char tmp;
unsigned char sjb[7] ={0};
sbit led=P2^0;
void delayms(unsigned char ms);
void send_sjb();
void send_char(unsigned char txd);
void cleansjb();
char getbyte();
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断
cleansjb(); //初始化
tmp=10;
while(tmp)
{
led=1;
delayms(30);
led=0;
delayms(30);
led=1;
delayms(30);
led=0;
delayms(30);
led=1;
delayms(30);
led=0;
delayms(30);
led=1;
tmp--;
}
while(1)
{
//收到第一个引导符
tmp=getbyte();
if(tmp==0xFF)
{
//send_char('0');
//收到第二个引导符
tmp=getbyte();
if(tmp==0x55)
{
//收到正确引导符,读取一个完整数据包
sjb[2]=getbyte();
sjb[3]=getbyte();
sjb[4]=getbyte();
sjb[5]=getbyte();
//收到一个完整数据包
if (sjb[5]=='E')
{ send_sjb();
// else send_char(0x02);
}
}
// else send_char(0x01);
}
// else send_char(0x00);
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
char getbyte()
{
while(1)
{
if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
return(tmp);
}
}
}
void send_sjb()
// 传送字串
{
unsigned char i = 0;
while(sjb[i] != '\0')
{
SBUF = sjb[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
// delayms(2);
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void cleansjb(void)
{
sjb[0]=0xFF;sjb[1]=0x55;
sjb[2]=0; sjb[3]=0; sjb[4]=0;
sjb[5]='E';
sjb[6]='\0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -