📄 u1.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 + -