找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机多机通信proteus仿真原理图及源程序

[复制链接]
跳转到指定楼层
楼主
51单片机多机通信原理图:

单片机多机通信仿真工程文件及所有完整程序等资料下载地址:
http://www.51hei.com/bbs/dpj-56304-1.html

源程序:

  1. #include "PMPDataR.h"

  2. unsigned char zu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8d};
  3. /* 延时t毫秒 */
  4. void delay(uint t)
  5. {
  6.         uint i;
  7.         while(t--)
  8.         {
  9.                 /* 对于11.0592M时钟,约延时1ms */
  10.                 for (i=0;i<125;i++)
  11.                 {}
  12.         }
  13. }

  14. /* 发送数据函数 */
  15. uchar recvdata()
  16. {

  17.         /* 接收数据 */
  18.                 while(!RI);
  19.                 if (RB8==1)
  20.                         return 0xee;                // 若接收的为地址帧,则返回0xee
  21.                 buf = SBUF;        
  22.                 RI = 0;        
  23.         return 0;                                        // 返回0
  24. }

  25. /* 串口初始化函数 */
  26. void init_serial()
  27. {
  28.         TMOD = 0x20;                                // 定时器T1使用工作方式2
  29.         TH1 = 250;
  30.         TL1 = 250;
  31.         TR1 = 1;                                        // 开始计时
  32.         PCON = 0x80;                                // SMOD = 1
  33.         SCON = 0xd0;                                // 工作方式,9位数据位,波特率9600kbit/s,允许接收
  34. }

  35. /* 主程序 */
  36. void main()
  37. {
  38.         uchar i = 0;
  39.         uchar tmp = 0xff;
  40.         P1= 0xff;
  41.         addr = P1&0x0f;                                // 获取本机地址
  42.         P23 = 1;                                        // 发光管不亮
  43.         
  44.         init_serial();                                // 串口初始化

  45.         EA = 1;                                                // 关闭所有中断
  46.         
  47.         /* 进入设备应答 */
  48.         while(1)
  49.         {
  50.                 SM2 = 1;                                // 只接收地址帧
  51.                
  52.                 /* 如果接收到的地址帧不是本机地址,则继续等待 */
  53.                 while (tmp!=addr)
  54.                 {
  55.                         RI = 0;
  56.                         while(!RI)
  57.                         tmp = SBUF;
  58.                         RI = 0;
  59.                 }        
  60.                 SM2 = 0;                                // 允许接收数据

  61.                 /* 数据接收 */
  62.        tmp = recvdata();
  63.            //if(buf!=0x00)
  64.             
  65.                 if (tmp==0x00)        
  66.                 {                 
  67.                         P0=buf;
  68.                         /* 绿灯亮,持续500ms,表示接收数据成功 */
  69.                         P23 = 0;                        
  70.                         delay(30);
  71.                         P23 = 1;
  72.                         
  73.                 }            
  74.                 // 如果接收数据时发现地址帧,则重新开始整个接收过程
  75.         }
  76. }
复制代码

  1. /*****************************************/
  2. /* Copyright (c) 2005, 通信工程学院      */
  3. /* All rights reserved.                  */
  4. /* 作    者:戴 佳                                                 */
  5. /*****************************************/

  6. #include "PMPDataT.h"

  7. /* 延时t毫秒 */
  8. void delay(uint t)
  9. {
  10.         uint i;
  11.         while(t--)
  12.         {
  13.                 /* 对于11.0592M时钟,约延时1ms */
  14.                 for (i=0;i<125;i++)
  15.                 {}
  16.         }
  17. }
  18. uchar keyscan(void)
  19. {
  20.         uchar scancode,tmpcode;
  21.         P1 = 0xf0;                                                                 // 发全0行扫描码
  22.         if ((P1&0xf0)!=0xf0)                                        // 若有键按下
  23.         {
  24.                 delay(10);                                                        // 延时去抖动
  25.                 if ((P1&0xf0)!=0xf0)                                // 延时后再判断一次,去除抖动影响
  26.                 {
  27.                         scancode = 0xfe;
  28.                         while((scancode&0x10)!=0)                // 逐行扫描
  29.                         {
  30.                                 P1 = scancode;                                // 输出行扫描码
  31.                                 if ((P1&0xf0)!=0xf0)                // 本行有键按下
  32.                                 {
  33.                                         tmpcode = (P1&0xf0)|0x0f;

  34.                                         /* 返回特征字节码,为1的位即对应于行和列 */
  35.                                         return((~scancode)+(~tmpcode));
  36.                                 }
  37.                                 else scancode = (scancode<<1)|0x01;                // 行扫描码左移一位
  38.                         }
  39.                 }
  40.         }
  41.         return(0);                                                                // 无键按下,返回值为0         
  42. }

  43. /* 发送数据函数 */
  44. void senddata(uchar buf)
  45. {

  46.         /* 发送数据 */
  47.                 TI = 0;
  48.                 TB8 = 0;                                // 发送数据帧
  49.                 SBUF =buf;        
  50.                 while(!TI);
  51.                 TI = 0;
  52. }

  53. /* 串口初始化函数 */
  54. void init_serial()
  55. {
  56.         TMOD = 0x20;                                // 定时器T1使用工作方式2
  57.         TH1 = 250;
  58.         TL1 = 250;
  59.         TR1 = 1;                                        // 开始计时
  60.         PCON = 0x80;                                // SMOD = 1
  61.         SCON = 0xd0;                                // 工作方式,9位数据位,波特率9600kbit/s,允许接收
  62. }
  63. void Getkey()
  64. {
  65.     switch(get_key)
  66.                    {
  67.                       case 0x11:                                                // 1行1列,数字0
  68.                               key=0xc0;
  69.                                   break;
  70.                         case 0x21:                                                // 1行2列,数字1
  71.                  key=0xf9;
  72.                                 break;                        
  73.                         case 0x41:                                                // 1行3列,数字2
  74.                                 key=0xa4;
  75.                                 break;
  76.                      case 0x81:                                                // 1行4列,数字3
  77.                                 key=0xb0;
  78.                                 break;
  79.                         case 0x12:                                                // 2行1列,数字4
  80.                 key=0x99;
  81.                                 break;
  82.                         case 0x22:                                                // 2行2列,数字5
  83.                                   key=0x92;
  84.                                 break;
  85.                         case 0x42:                                                // 2行3列,数字6
  86.                                    key=0x82;
  87.                                 break;
  88.                         case 0x82:                                                // 2行4列,数字7
  89.                                    key=0xf8;
  90.                                 break;
  91.                         case 0x14:                                                // 3行1列,数字8
  92.                                    key=0x80;
  93.                                    break;
  94.                         case 0x24:                                                // 3行2列,数字9
  95.                                  key=0x90;
  96.                                 break;
  97.                         case 0x44:                                                // 3行3列,10
  98.                                   key=0x88;
  99.                                 break;
  100.                         case 0x84:                                                // 3行4列,11
  101.                                  key=0x83;
  102.                                 break;
  103.                         case 0x18:                                                // 4行1列,12
  104.                                  key=0xc6;
  105.                                 break;
  106.                         case 0x28:                                                // 4行2列,13
  107.                                  key=0xa1;
  108.                                 break;
  109.                         case 0x48:                                                // 4行3列,14
  110.                                  key=0x86;
  111.                                 break;
  112.                         case 0x88:                                                // 3行4列,15
  113.                                  key=0x8e;
  114.                                 break;
  115.                         default:break;
  116.                 }


  117. }
  118. /* 主程序 */
  119. void main()
  120. {
  121.         uchar i = 0;
  122.         key=0xc0;
  123.         while(1)
  124.     {
  125.                   get_key = keyscan();                                // 调用键盘扫描函数
  126.              Getkey();
  127.                  buf=key;

  128.             /* 通过P0口读要访问的从机地址 */
  129.           P0 = 0xff;
  130.           addr = P0&0x0f;
  131.           init_serial();                                // 串口初始化

  132.           EA = 1;                                                // 关闭所有中断
  133.         
  134.                      TI = 0;
  135.                     TB8 = 1;                                // 发送地址帧        
  136.                     SBUF = addr;
  137.                     while(!TI);
  138.                     TI = 0;
  139.                  senddata(buf);                        // 发送数据
  140.          
  141.         }
  142.         
  143. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:306025 发表于 2018-4-11 17:33 | 只看该作者
这代码不对呀
回复

使用道具 举报

板凳
ID:117850 发表于 2018-4-29 08:44 | 只看该作者
代码不对
回复

使用道具 举报

地板
ID:322999 发表于 2018-5-5 18:51 | 只看该作者
大佬们,我是基于单片机的无线点餐毕业设计,但是仿真是采用多机通信的方式,所以,求助各位大佬们,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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