打印

求两个51单片机双机串行通信的c语言程序

[复制链接]
11573|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
angler001|  楼主 | 2011-11-25 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两片AT89s52,双机串行通信程序,要发送字符串变量(一个数组)。
并且不能发乱了,因为接收机还有其他中断

相关帖子

沙发
linbei1988| | 2011-11-25 16:06 | 只看该作者
什么意思,哪个东西没有好几个中断要处理。。
还直接求程序了?

使用特权

评论回复
板凳
angler001|  楼主 | 2011-11-25 16:09 | 只看该作者
什么意思,哪个东西没有好几个中断要处理。。
还直接求程序了?
linbei1988 发表于 2011-11-25 16:06

就是要双机通信的程序啦。
但是不能要学习板带的视频里那种,没有握手什么的。只能做通信的程序。

使用特权

评论回复
地板
joyme| | 2011-11-25 17:20 | 只看该作者
模拟I2C或SPI,网上很多这种源码

使用特权

评论回复
5
liang7143| | 2011-11-25 18:01 | 只看该作者
两片AT89s52
直接用串口多好 中断实现

使用特权

评论回复
6
angler001|  楼主 | 2011-11-25 18:56 | 只看该作者
A给B发送数据,握手信号之后用不用清一下SBUF。如果不清楚是不是握手信号一直有效啊。

使用特权

评论回复
7
DownCloud| | 2011-11-25 22:32 | 只看该作者
哈哈, 好像挺简单的。

使用特权

评论回复
8
armmage| | 2011-11-26 10:45 | 只看该作者
伸手党

使用特权

评论回复
9
gzstway| | 2011-11-27 00:00 | 只看该作者
自己试试看

使用特权

评论回复
10
寅辰思瑜| | 2011-11-27 19:17 | 只看该作者
#include<reg52.h>
void main()
{
TMOD=0X02;
EA=1;
ET0=0;
ES=1;
REN=1;
PCON=1;
TH1=0Xe6;
TL1=0Xe6;
TR1=1;
while(1)
{
if(temp==1)
temp=0;
ES=0;
SBUF=a;
if(TI==1);
TI=0;
ES=1;
}
void ser () interrupt 4
{
RI=0;
SBUF=P0;
a=SBUF;
temp=1


}

使用特权

评论回复
11
LZR13179| | 2012-6-29 17:32 | 只看该作者
//**************************发送*************************
#include <reg51.h>
unsigned char a;   
unsigned char b[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void init(void)
{
    SCON = 0x50;            // 串行口工作方式1,允许接收
    PCON = 0x00;            // 波特率不倍增
    TMOD = 0x20;            // 定时器1工作于8位自动重载模式, 用于产生波特率
    TH1 =0xf4 ;
    TL1 =0xf4;             // T1赋初值,11.0592M晶振,波特率2400
    TR1 = 1;                // 启动定时器1
EA=1;
ES=1;
}
void main(void)
{
init();
P1=0xff;
a=P1&0x0f;
SBUF=a;
}
void zd() interrupt 4   //当进入中断,要么RI=1,要么TI=1
{
if(RI)
{
  RI=0;
  a=SBUF;
  P2=b[a];

}
else TI=0;
}
//*********************接收*******************
#include <reg51.h>
unsigned char a;   
unsigned char b[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void init(void)
{
    SCON = 0x50;            // 串行口工作方式1,允许接收
    PCON = 0x00;            // 波特率不倍增
    TMOD = 0x20;            // 定时器1工作于8位自动重载模式, 用于产生波特率
    TH1 =0xf4 ;
    TL1 =0xf4;              // T1赋初值,波特率2400
    TR1 = 1;                // 启动定时器1
EA=1;
ES=1;
}
void main(void)
{
init();
while(1)
{
P2=b[a];
}

}
void zd() interrupt 4
{
if(RI)
{
  RI=0;
  a=SBUF;
  SBUF=a+1;  //加1后,在返回到主机
}
else TI=0;
}

使用特权

评论回复
12
wukunshan| | 2012-6-30 09:22 | 只看该作者
楼主想得太复杂了,完全可以简单化的。你就让两块单片机的串口始终处于接收状态,发送数据时先发送握手数据,可以是一个字节或多个字节,收到握手数据之后,进行判断是不是握手信号,如果是就进入正式接收数据,如果不是就让串口继续等待接收。需要注意的是,发送方在发出握手数据之后要做一定的延时,让接收方有判断握手数据的时间,之后再发送正式数据。

使用特权

评论回复
13
努力的微笑| | 2015-8-23 20:54 | 只看该作者

小弟是一个学会计后转行学习单片机的新手 刚刚接触到单片机互相通信这一部分知识 有幸看到前辈分享的代码,十分感谢 祝前辈越做越好成为高级大神

使用特权

评论回复
14
西门扫雪| | 2015-8-24 09:09 | 只看该作者
这个应该好写吧,不太难,就是串口收发,用中断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

34

帖子

1

粉丝