找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2575|回复: 0
打印 上一主题 下一主题
收起左侧

单片机相互之间的串口通讯程序

[复制链接]
跳转到指定楼层
楼主
ID:107593 发表于 2016-3-11 01:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define SLAVE 0x00
  4. #define BN 16
  5. uchar idata tdata[16];
  6. uchar idata rdata[16];
  7. bit trdy;
  8. bit rrdy;
  9. void main(void)
  10. {
  11.   TMOD=0x20;                        //定时器T1为模式2
  12.   TL1=0xfd;                        //定时器初值
  13.   TH1=0xfd;
  14.   PCON=0x00;
  15.   TR1=1;
  16.   SCON=0xf0;                        //串行口方式3
  17.   ES=1;EA=1;                        //开串行口中断
  18.   while(1){trdy=1;rrdy=1;}                //准备好发送和接收
  19. }
  20. void slave(void) interrupt 4 using 1
  21. {
  22.   void str(void);
  23.   void sre(void);
  24.   uchar a;
  25.   RI=0;                            //关串行口中断
  26.   ES=0;
  27.   if(SBUF!=SLAVE){ES=1;goto reti;}        //非本机地址,继续监听
  28.   SM2=0;                            //取笑监听状态
  29. SBUF=SLAVE;                    //发回从机地址
  30. while(TI!=1);TI=0;
  31. while(RI!=1);RI=0;
  32. if(RB8==1){SM2=1;ES=1;goto reti;}        //确认地址不符,从机复位
  33. a=SBUF;                        //接收命令
  34. if(a==1){                        //从机接收主机的数据
  35. if(rrdy==1) SBUF=0x01;            //接收准备好,发回0x01
  36. else
  37. SBUF=0x00;
  38. while(TI!=1);TI=0;
  39. while(RI!=1);RI=0;
  40. if(RB8==1){SM2=1;ES=1;goto reti;}
  41. sre();                        //接收数据
  42. }
  43. else
  44. {
  45. if(a==0x02)                    //从机向主机发送数据
  46. {
  47. if(trdy==1) SBUF=0x02;        //发送准备好
  48. else
  49. SBUF=0x00;
  50. while(TI!=1);TI=0;
  51. while(RI!=1);RI=0;
  52. if(RB8==1){SM2=1;ES=1;goto reti;}
  53. str( );                    //发送数据
  54. }
  55. else
  56. {
  57. SBUF=0x80;                //命令非法
  58. while(TI!=1);TI=0;
  59. SM2=1;ES=1;                //恢复监听
  60. }
  61. }
  62. reti:;
  63. }
  64. void str(void)                        //发送数据函数
  65. {uchar p,i;
  66. trdy=0;
  67. do{p=0;                            //初始校验和为0
  68.     for(i=0;i<BN;i++)
  69.      {SBUF=tdata[i];                    //发送数据
  70.       p+=tdata[i];
  71.       while(TI!=1);TI=0;
  72.      }
  73.   SBUF=p;                        //发送校验和
  74. while(TI!=1);TI=0;
  75. while(RI!=1);RI=0;
  76. }while(SBUF!=0);                    //主机接收不正确,重新发送

  77. SM2=1;ES=1;
  78. }
  79. void sre(void)                        //接收数据函数
  80. {uchar p,i;
  81. rrdy=0;
  82. while(1)
  83. {p=0;                                //初始化校验和为0
  84.    for(i=0;i<BN;i++)
  85. {while(RI!=1);RI=0;
  86.    tdata[i]=SBUF;                    //接收数据
  87.    p+=rdata[i];
  88.   }
  89.   while(RI!=1);RI=0;
  90. if(SBUF==p){SBUF=0x00;break;}        //校验和相同,发00H
  91. else{
  92. SBUF=0xFF;while(TI!=1);TI=0;        //校验和不同,发FFH,重新接收
  93. }
  94. }
  95. SM2=1;ES=1;
  96. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表