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

📄 u1.c

📁 基于51单片机的自定通信协议设计源代码加仿真
💻 C
字号:
#include <at89x51.h>
sbit clk=P3^2;
sbit dat=P3^4;
unsigned char receive[4]={0,0,0,0},j=0;  //receive[3]为接收成功标志,1为成功
void read_8bit(void)
{
	unsigned char i=0;
	receive[3]=0;
	while(!clk);
	for(i=0;i<8;i++)
	{
		receive[j]=receive[j]<<1;
		if(dat)	receive[j]=receive[j]|0x01;
		if(i==7)
		{
			if(receive[0]==0x38) 		   //receive[0]定义数据类型
			{
				j++;
				if(j==3)
				{
					receive[3]=1;
					receive[0]=0;
					j=0;
				}
			}
			else
				receive[3]=1;
			break;
		}
		else
		{	
			while(clk);
			while(!clk);
	
		}			
	}
}
void delay_50us(unsigned int t)
{
	 unsigned char j;
	 for(;t>0;t--)
	 for(j=19;j>0;j--);
}
void send_8bit(unsigned char temp)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
		if((temp&0x80)==0x80) dat=1;			//先发高位,再发低位
		else dat=0;
		delay_50us(1);							//clk高电平发出去
		clk=1;								    
		delay_50us(1);
		if(i==7)
			clk=1;
		else
			clk=0;
		temp=temp<<1;
	}
	dat=1;
	IE0=0;
	

}		
void INT0_stop(void) interrupt IE0_VECTOR using 1
{
	EA=0;
	read_8bit();
	EA=1;
	while(!dat);
	

}
void send(unsigned char cmd,data1,data2)
{
	EX0=0;				//	 关闭接收中断
	clk=0;				//   开启发送,引起接收方中断
	send_8bit(cmd);	//	 开头第一个字节为0x38,则在其后发送两个数据字节
	delay_50us(1);		//	 开头不是0x38,则当独立字节接收
	clk=0;
	send_8bit(data1);
	delay_50us(1);
	clk=0;
	send_8bit(data2);
	delay_50us(1);
	EX0=1;				//   开启接收中断	
}
void send_one(unsigned char one)
{
	EX0=0;				//	 关闭接收中断
	clk=0;				//   开启发送,引起接收方中断
	send_8bit(one);	//	 开头第一个字节为0x38,则在其后发送两个数据字节
	delay_50us(1);		//	 开头不是0x38,则当独立字节接收
	EX0=1;				//   开启接收中断	
}
void main(void)
{
	EA=1;
	IT0=1;
	EX0=1;

	//以下为函数的使用方法
//	send(0x38,0x80,0x50);  //开头发送0x38表明后接两字节数据	,接收方将收到receive[0]=0,receive[1]=0x80;receive[2]=0x50;
//	delay_50us(10);
	send_one(0x40);		   //开头不是0x38表明只发当前字节,接收方receive[0]=0x40,其他不变
	delay_50us(10);
	send_one(0x80);
	while(1)
	{
		if(receive[3]==1) P1=receive[2];	  //判断接收成功标志,读出接收位即可
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -