找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2622|回复: 1
收起左侧

以两片单片机为例简述单片机的串口通信的仿真与源码

[复制链接]
ID:268717 发表于 2018-7-27 07:21 | 显示全部楼层 |阅读模式
以两片单片机为例简述单片机的串口通信 程序+仿真+详细注释

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar i=1,ACK=1;

  5. void delay(uint i)                          //延时函数
  6. {
  7.    uchar j;
  8.    while(i--)
  9.    for(j=110;j>0;j--);
  10. }

  11. uchar kbscan()                //键盘扫描函数
  12. {
  13. uchar sccode,recode;         //定义行、列
  14. P1=0xf0;                     //高四位作为输入先写1
  15. if((P1&0xf0)!=0xf0)                  //判断是否按键按下
  16.    {                                                 
  17.         delay(10);                                  //延时消抖
  18.         if((P1&0xf0)!=0xf0)                  //再次判断判断有没有按键按下
  19.         {
  20.          sccode=0xfe;
  21.          while((sccode&0x10)!=0)
  22.          {
  23.           P1=sccode;
  24.           if((P1&0xf0)!=0xf0)     //判断当前行是否有按键按下
  25.           {
  26.            recode=P1&0xf0;        //保留高四位输入值
  27.            sccode=sccode&0x0f;    //保留第低四位的值
  28.            return(recode+sccode);
  29.           }
  30.                   else
  31.                   sccode=(sccode<<1)|0x01;
  32.          }
  33.         }
  34.    }
  35.           return 0;
  36. }

  37. send()interrupt 4        //串行口通信中断
  38. {
  39.   if(TI==1&&ACK==1)
  40.   {
  41.     TI=0;
  42.     if(i==0|i==0x22|i==0x44|i==0x66|i==0x88|i==0xaa|i==0xcc|i==0xdd|i==0xee)                        //有按键按下,需要修改波特率
  43.     {
  44.           ACK=0;
  45.           SBUF=i;           //修改波特率
  46.         }
  47.     else if(i==11)                //循环发送,发了十一个字符后重新发
  48.         {
  49.        i=1;
  50.            SBUF=1;
  51.         }
  52.         else
  53.         {
  54.       i++;
  55.       SBUF=i;               //正常发送数据
  56.     }
  57.   }
  58.   else if(RI==1)           //接收回应的信号
  59.     {
  60.            RI=0;
  61.            ACK=SBUF;           //接收回应信号 修改初值 触发串口通信中断
  62.            TI=1;
  63.            TH1=TL1=i;
  64.            i=1;
  65.         }
  66. }

  67. void main()
  68. {
  69.   TMOD=0x20;                   //定时器1 工作方式2
  70.   TH1=0x00;
  71.   TL1=0x00;            //置初值
  72.   TR1=1;
  73.   EA=1;
  74.   ES=1;                //使T1开始工作;开总中断、串行中断
  75.   SCON=0x50;           //计数器1 工作方式1
  76.   SBUF=i;  
  77.   while(1)
  78.   {
  79.     while(kbscan())
  80.            {
  81.             switch(kbscan())                        //不同的按键对应不同的波特率
  82.                 {
  83.             case 0xeb:i=0x00;break;                // 1
  84.                 case 0xdb:i=0x22;break;            // 2  
  85.                 case 0xbb:i=0x44;break;                // 3
  86.                 case 0xed:i=0x66;break;                // 4
  87.                 case 0xdd:i=0x88;break;                // 5
  88.                 case 0xbd:i=0xaa;break;                // 6
  89.                 case 0xee:i=0xcc;break;                // 7
  90.                 case 0xde:i=0xdd;break;                // 8
  91.                 case 0xbe:i=0xee;break;                // 9
  92.             }
  93.            }
  94.   }
  95. }
复制代码

所有资料51hei提供下载:
20161111144-李作鑫-串口通信.rar (100.45 KB, 下载次数: 45)
回复

使用道具 举报

ID:482614 发表于 2019-8-4 07:07 | 显示全部楼层
这个正是我在网上苦苦搜寻的关于单片机串口仿真的帖子,今天我必须把它拿走,楼主好人呐,谢谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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