⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receivemcu.c

📁 教鞭驱动程序的发送端、接收端、双机串口通信仿真
💻 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 + -