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

[复制链接]
12893|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,网上很多这种源码
liang7143 发表于 2011-11-25 18:01 | 显示全部楼层
两片AT89s52
直接用串口多好 中断实现
 楼主| angler001 发表于 2011-11-25 18:56 | 显示全部楼层
A给B发送数据,握手信号之后用不用清一下SBUF。如果不清楚是不是握手信号一直有效啊。
DownCloud 发表于 2011-11-25 22:32 | 显示全部楼层
哈哈, 好像挺简单的。
armmage 发表于 2011-11-26 10:45 | 显示全部楼层
伸手党
gzstway 发表于 2011-11-27 00:00 | 显示全部楼层
自己试试看
寅辰思瑜 发表于 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


}
LZR13179 发表于 2012-6-29 17:32 | 显示全部楼层
  1. //**************************发送*************************
  2. #include <reg51.h>
  3. unsigned char a;   
  4. unsigned char b[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  5. void init(void)
  6. {
  7.     SCON = 0x50;            // 串行口工作方式1,允许接收
  8.     PCON = 0x00;            // 波特率不倍增
  9.     TMOD = 0x20;            // 定时器1工作于8位自动重载模式, 用于产生波特率
  10.     TH1 =0xf4 ;
  11.     TL1 =0xf4;             // T1赋初值,11.0592M晶振,波特率2400
  12.     TR1 = 1;                // 启动定时器1
  13. EA=1;
  14. ES=1;
  15. }
  16. void main(void)
  17. {
  18. init();
  19. P1=0xff;
  20. a=P1&0x0f;
  21. SBUF=a;
  22. }
  23. void zd() interrupt 4   //当进入中断,要么RI=1,要么TI=1
  24. {
  25. if(RI)
  26. {
  27.   RI=0;
  28.   a=SBUF;
  29.   P2=b[a];

  30. }
  31. else TI=0;
  32. }
  33. //*********************接收*******************
  34. #include <reg51.h>
  35. unsigned char a;   
  36. unsigned char b[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  37. void init(void)
  38. {
  39.     SCON = 0x50;            // 串行口工作方式1,允许接收
  40.     PCON = 0x00;            // 波特率不倍增
  41.     TMOD = 0x20;            // 定时器1工作于8位自动重载模式, 用于产生波特率
  42.     TH1 =0xf4 ;
  43.     TL1 =0xf4;              // T1赋初值,波特率2400
  44.     TR1 = 1;                // 启动定时器1
  45. EA=1;
  46. ES=1;
  47. }
  48. void main(void)
  49. {
  50. init();
  51. while(1)
  52. {
  53. P2=b[a];
  54. }

  55. }
  56. void zd() interrupt 4
  57. {
  58. if(RI)
  59. {
  60.   RI=0;
  61.   a=SBUF;
  62.   SBUF=a+1;  //加1后,在返回到主机
  63. }
  64. else TI=0;
  65. }
wukunshan 发表于 2012-6-30 09:22 | 显示全部楼层
楼主想得太复杂了,完全可以简单化的。你就让两块单片机的串口始终处于接收状态,发送数据时先发送握手数据,可以是一个字节或多个字节,收到握手数据之后,进行判断是不是握手信号,如果是就进入正式接收数据,如果不是就让串口继续等待接收。需要注意的是,发送方在发出握手数据之后要做一定的延时,让接收方有判断握手数据的时间,之后再发送正式数据。
努力的微笑 发表于 2015-8-23 20:54 | 显示全部楼层

小弟是一个学会计后转行学习单片机的新手 刚刚接触到单片机互相通信这一部分知识 有幸看到前辈分享的代码,十分感谢 祝前辈越做越好成为高级大神
西门扫雪 发表于 2015-8-24 09:09 | 显示全部楼层
这个应该好写吧,不太难,就是串口收发,用中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部