历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2021年02月07日 | 51单片机双机通信硬件电路图及C程序

2021-02-07 来源:eefocus

双机通信的硬件电路

需要注意的是,两单片机要保证正确通信,主机的RXD连接从机的TXD,从机的RXD连接主机的TXD。


双机通信C语言程序

(1)主机程序

#include

#include

#define _READY_ 0x06//主机握手信号

#define _BUSY_ 0x15//从机忙应答

#define_OK_ 0x00//从机准备好

#define _SUCC_ 0x0f//数据传送成功

#define _ERR_ 0xf0//数据传送失败

unsigned charTable[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

unsigned char Buff[20]; //数据缓冲区

unsigned char temp=_BUSY_;

sbit KEY=P1^6;

//延时1ms函数

void delay_1ms(unsigned int t)

{

unsigned int x,y;

for(x=t;x>0;x--)

for(y=110;y>0;y--);

}

//缓冲区初始化

void Buff_init()

{

unsigned chari; //将Table里的数据放到缓冲区里

for(i=0;i

{

Buff= Table;

delay_1ms(100);

}

}

//串口初始化函数

void serial_init()

{

TMOD=0x20; //定时器1工作于方式2

TH1=0xfd;

TL1=0xfd; //波特率为9600

PCON=0;

SCON=0x50; //串口工作于方式1

TR1=1; //开启定时器

TI=0;

RI=0;

}

//发送数据函数

void SEND_data(unsigned char *Buff)

{

unsigned char i;

unsigned char lenth;

unsigned char check;

lenth=strlen(Buff); //计算数据长度

check=lenth;

TI=0; //发送数据长度

SBUF=lenth;

while(!TI);

TI=0;

for(i=0;i

{

check=check^Buff;

SBUF=Buff;

while(!TI);

TI=0;

}

SBUF=check; //发送校验字节

while(!TI);

TI=0;

}

void main()

{

Buff_init();

serial_init();

while(1)

{

if(KEY==0)

{

delay_1ms(5);

if(KEY==0)

{

while(!KEY);

TI=0; //主机发送握手信号

SBUF=_READY_;

while(!TI);

TI=0;

while(temp!=_OK_) //主机等待从机应答信号

{

RI=0;

while(!RI);

temp=SBUF;

RI=0;

}

temp=_ERR_; //主机等待从机数据接收成功信号

while(temp!=_SUCC_)

{

SEND_data(Buff);

RI=0;

while(!RI);

temp=SBUF;

RI=0;

}

}

}

}

}

(2)从机程序

#include

#include

#define _READY_ 0x06//主机握手信号

#define _BUSY_ 0x15//从机忙应答

#define_OK_ 0x00//从机准备好

#define _SUCC_ 0x0f//数据传送成功

#define _ERR_ 0xf0//数据传送失败

unsigned char aa=_BUSY_;//主机与从机之间通信标志

unsigned char Buff[20];//数据缓冲区

//串口初始化函数

void serial_init()

{

TMOD=0x20; //定时器1工作于方式2

TH1=0xfd;

TL1=0xfd; //波特率为9600

PCON=0;

SCON=0x50; //串口工作于方式1

TR1=1; //开启定时器

TI=0;

RI=0;

}

//接收数据函数 www.dgzj.com

unsigned char RECE_data(unsigned char *Buff)

{

unsigned char i,temp;

unsigned char lenth;

unsigned char check;

RI=0; //接收数据长度

while(!RI);

lenth=SBUF;

RI=0;

check=lenth;

for(i=0;i

{

while(!RI);

Buff=SBUF;

check=check^(Buff);

RI=0;

}

while(!RI); //接收校验字节

temp=SBUF;

RI=0;

check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对

if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff

{

TI=0;

SBUF=_ERR_;

while(!TI);

TI=0;

return 0xff;

}

TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00

SBUF=_SUCC_;

while(!TI);

TI=0;

return 0;

}

void main()

{

serial_init();

while(1)

{

while(aa!=_READY_) //从机等待主机发送的握手信号

{

RI=0;

while(!RI);

aa=SBUF;

RI=0;

}

TI=0; //一旦接收到握手信号,从机返回OK,等待接收数据

SBUF=_OK_;

while(!TI);

TI=0;

aa=0xff; //从机接收数据,并将数据保存到数据缓冲区

while(aa==0xff)

{

aa=RECE_data(Buff);

}

P1=Buff[0]; //查看接收到的数据

}

}


推荐阅读

史海拾趣

淩志比高公司的发展小趣事

为了进一步提升公司的知名度和影响力,淩志比高开始注重品牌建设和市场推广。公司积极参与行业展会、举办产品发布会等活动,与客户和合作伙伴建立了紧密的联系。同时,淩志比高还通过广告宣传、社交媒体营销等方式,提升了品牌知名度和美誉度。

FUJIKURA公司的发展小趣事

在电子行业的浪潮中,淩志比高公司由几位充满激情的创业者创立。创业初期,公司面临着资金短缺、市场竞争激烈等挑战。然而,凭借对技术的深刻理解和敏锐的市场洞察力,淩志比高成功开发出一款具有创新性的电子产品,迅速在市场上获得了一席之地。

Amphion Semiconductor Ltd公司的发展小趣事

随着市场的不断变化和客户需求的日益多样化,淩志比高公司意识到技术创新的重要性。公司投入大量研发资源,不断推陈出新,成功研发出一系列具有竞争力的新产品。这些产品的推出不仅提升了公司的市场份额,也进一步巩固了公司在电子行业中的地位。

ELECTRONIC ASSEMBLY公司的发展小趣事

在环保日益受到重视的今天,一家名为“绿源电子组装”的公司积极响应国家号召,致力于推动绿色环保的产业发展。公司引进了一系列环保设备和材料,采用了低碳、节能的生产工艺和管理方式,实现了生产过程中的减排降耗。同时,绿源电子组装还积极参与社会公益活动,倡导绿色消费理念,为行业的可持续发展贡献了自己的力量。

CINTERION公司的发展小趣事

2010年,电子支付与身份识别技术领域的领军企业金雅拓,全资收购了CINTERION。这一资本动作不仅为CINTERION带来了更多的资金支持,更使其在金雅拓的物联网事业部中获得了更广阔的发展空间。收购完成后,CINTERION继续保持其技术领先地位,并在金雅拓的推动下,进一步拓宽了产品线和应用领域。

ENERGIZER公司的发展小趣事

ENERGIZER公司,作为全球领先的电池制造商,自1896年以来就以其技术革新引领着电池能源行业的发展。1896年,ENERGIZER发明了全球第一粒电池,这一创新性的产品为电子行业的发展奠定了基石。随着科技的不断进步,ENERGIZER的电池技术也在不断革新,以满足日益增长的电子设备需求。如今,ENERGIZER的电池已经广泛应用于各种电子设备中,从遥控器、手电筒到高端电子设备,其优良的品质和耐用的性能受到了全球消费者的广泛认可。

问答坊 | AI 解惑

电感设计软件

电感设计软件,从别处下载的.…

查看全部问答>

一篇关于SDRAM不错的文章

一篇关于SDRAM不错的文章…

查看全部问答>

紧急求助:DM9000网卡程序异常?

我在2440上移植了DM9000A的网卡,系统运行后能够被PING通。可是一运行IE就报如下错误: Data Abort: Thread=97d9aab4 Proc=81d96340 \'device.exe\' AKY=ffffffff PC=02b52178(dm9isa.dll+0x00002178) RA=02b52174(dm9isa.dll+0x00002174) BVA=06 ...…

查看全部问答>

高分! 在51里的串口接收中如何加入超时处理?

我现在需要用到2051接收来自PC的数据(长度不定,但长度信息是在接收的第一个字节里),打算用方式1,定时器2,串口超时了就表示接收已经完成,现在问题是:如何实现串口的超时处理? 是用另外一个定时器?还是在等待RI的过程中DJNZ某数以实现计时 ...…

查看全部问答>

arm-linux平台上摄像头 quick capture interface的中断问题

我需要在pxa271平台上通过quick capture interface来获取摄像头图像,程序是从别的操作系统移植过来的,所以CIF寄存器初始化设置的逻辑应该没有问题,现在的问题是只要我设置了Start of Frame的中断,即 CICR0置位 ~(CICR0_SOFM), 再enable CIF接 ...…

查看全部问答>

怎么设置IP呀 ?

我是菜鸟, 我想知道怎么在WinCE里面设置IP. 察了半天都说修改注册表. 可我连注册表都打不开呀. 我是用 VS2003做得开发.我想在程序里面进行修改. 高手能否提供一个修改注册表得函数, 或者API之类得, 感激不尽啊!!!!…

查看全部问答>

用8962的GPIO采集单总线数据不成功

  源例程,寻求帮助!!!谢谢     GPIO管脚能否配置采样速率? [ 本帖最后由 bjmonsoon 于 2011-1-13 19:35 编辑 ]…

查看全部问答>

关于PB5.0查看函数源码的问题

       我在PB5.0下要修改代码,但是有的函数在其他文件里(例如在根目录下),我想看一下某个函数的实现体,我在函数上点击右键选择Go To Definition of \"函数名\", 但是出现对话框说要去project中的setting中设置, 我 ...…

查看全部问答>