最近在做关于双机通信系统的课设,遇到了一些问题,查了好几个小时也没找到原因,郁闷了半天,老师要求主机在发送数据的时候显示数据,从机接受数据并对数据进行处理后显示数据。因为没有要求数据具体是什么,是几位的数据,所以刚开始搭建仿真时使用的是单位数码管。仿真如下图:

当按键K1按下,乙机向甲机发送数据并显示该数据,甲机接受数据后对数据加一显示。

效果如下:

代码如下:

发送端(乙机):

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P1^7;//按键口
uchar NumX = 5;//发送端数码管要显示的数
uchar code DSY_CODE[]=//显示数组(共阴)
{
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};

void Delay(uint x)//延时
{
     uchar i,j;
    for(i=x;i>0;i--)
         for(j=110;j>0;j--);
}
void main()
{
    P2 = 0x00; //初始化
    SCON = 0x50;//串口方式1
    TMOD = 0x20;//定时器工作方式2
    PCON = 0x00;//波特率正常
    TH1  = 0xfd;//T1定时器装初值
    TL1  = 0xfd;
    TR1 = 1;//启动T1定时器 
    EA=1;//开总中断
    ES=1;//开启串口中断
   
    while(1)
    {
        if(K1==0);//按键按下
        {
            Delay(3);//消抖
             if (K1==0)//按键按下
             {
                     SBUF = NumX;//发送出去
                      P2 = DSY_CODE[NumX];//显示
                      Delay(20);
                      P2 = 0x00;
                      while(!T1);//等待是否发送完毕
                       TI = 0;
                      while(!K1);//等待按键释放
              }
        }
    }
}

接收端(甲机):

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint num;
uchar code DSY_CODE[]=//显示数组(共阴)
{
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};

void Delay(uint x)//延时
{
     uchar i,j;
    for(i=x;i>0;i--)
         for(j=110;j>0;j--);
}

void main()
{
     P2 = 0x00; //初始化
    SCON = 0x50;//串口方式1
    TMOD = 0x20;//定时器工作方式2
    PCON = 0x00;//波特率正常
    TH1  = 0xfd;//T1定时器装初值
    TL1  = 0xfd;
    TR1 = 1;//启动T1定时器 
    EA=1;//开总中断
    ES=1;//开启串口中断

while(1)
    {

}
}

void Serial_INT() interrupt 4//中断显示
{
     if(RI)
    {
         RI = 0;
        num=SBUF+1;
        if(num>=0&&num<=9)
        {
            P2 = DSY_CODE[num];//显示
            Delay(60);
            P2 = 0x00;
        }
        else
            P2 = 0x00;//不显示
    }
}

注:中断里最好不要加延时,延时太长,你中断还没执行完,又被新的中断打断, 最终一层层嵌套,就出不来了(用是因为没有想到好的办法让接受端的数码管亮了又灭)

本来以为课设就到此为止了,只要到时候老师把器件一发,按照仿真搭好板子就结束了,没想到老师发的是四位共阳极数码管,四位数码管只显示一个数字确实有些浪费,所以就又开始改仿真图和代码。

仿真图如下:

效果如下:

发送端代码(乙机):

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P1^7;//按键
sbit W1 = P2^0;
sbit W2 = P2^1;
sbit W3 = P2^2;
sbit W4 = P2^3;
int ge,shi,bai,qian;
int NumX = 158;//发送端数码管要显示的数
uchar code DSY_CODE[]=//显示数组(共阳)
{
     0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};

void Delay(uint x)//延时
{
     uchar i,j;
    for(i=x;i>0;i--)
         for(j=110;j>0;j--);
}

void LED2_StaticDisplay(int number,int val)//位选,段选函数
{
     switch(number) 
      {    
       case(0):
       W1=1;W2=0;W3=0;W4=0;break;

case(1):
       W1=0;W2=1;W3=0;W4=0;break;

case(2):
       W1=0;W2=0;W3=1;W4=0;break;

case(3):
       W1=0;W2=0;W3=0;W4=1;break; 
      }
    P0 = DSY_CODE[val]; 
    }

void main()
{
    P0 = 0x00;//初始化
    P2 = 0x00; //初始化
    SCON = 0x50;//串口方式1
    TMOD = 0x20;//定时器工作方式2
    PCON = 0x00;//波特率正常
    TH1  = 0xfd;//T1定时器装初值
    TL1  = 0xfd;
    TR1 = 1;//启动T1定时器 
    EA=1;//开总中断
    ES=1;//开启串口中断
    while(1)
    {
        if(K1==0);//按键按下
        {
        Delay(3);//消抖
             if (K1==0)//按键按下
             {
                  SBUF = NumX;//发送出去
                  bai  = NumX/100;
                  shi  = NumX%100/10;
                  ge   = NumX%10;
                LED2_StaticDisplay(0,0);
                Delay(10);
                LED2_StaticDisplay(1,bai);
                Delay(10);
                LED2_StaticDisplay(2,shi);
                Delay(10);
                LED2_StaticDisplay(3,ge);
                Delay(10);
                P2 = 0x00;
                while(!T1);//等待是否发送完毕
                   TI = 0;
                while(!K1);//等待按键释放
       } 
        }
            
    }
}

接受端代码(甲机):

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P1^7;
sbit W1 = P2^0;
sbit W2 = P2^1;
sbit W3 = P2^2;
sbit W4 = P2^3;
int ge,shi,bai;
int num;
uchar code DSY_CODE[]=//显示数组(共阳)
{
     0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
void Delay(uint x)//延时函数
{
     uchar i,j;
    for(i=x;i>0;i--)
         for(j=110;j>0;j--);
}

void LED2_StaticDisplay(int number,int val)//位选,段选函数
{
     switch(number) 
      {    
      case(0):
       W1=1;W2=0;W3=0;W4=0;break;

case(1):
       W1=0;W2=1;W3=0;W4=0;break;

case(2):
       W1=0;W2=0;W3=1;W4=0;break;

case(3):
       W1=0;W2=0;W3=0;W4=1;break; 
    }
   P0 = DSY_CODE[val]; 
}

void main()
{

P0 = 0x00;//初始化
    P2 = 0x00; //初始化
    SCON = 0x50;//串口方式1
    TMOD = 0x20;//定时器工作方式2
    PCON = 0x00;//波特率正常
    TH1  = 0xfd;//T1定时器装初值
    TL1  = 0xfd;
    TR1 = 1;//启动T1定时器 
    EA=1;//开总中断
    ES=1;//开启串口中断
    while(1)
    {

}
}

void uart() interrupt 4//中断显示
{
     if(RI)
    {
         RI = 0;    
        num = SBUF+1;
        bai  = num/100;
        shi  = num%100/10;
        ge   = num%10;
        LED2_StaticDisplay(0,0);
        Delay(10);
        LED2_StaticDisplay(1,bai);
        Delay(10);
        LED2_StaticDisplay(2,shi);
        Delay(10);
        LED2_StaticDisplay(3,ge);
        Delay(10);
        P2 = 0x00;
    }
}

实物图:

实物出来后,数码管的亮度不够,特别暗,上图是在晚上拍的,所以看着还比较明显,查了一下原因,是因为单片机的驱动能力有限导致。可通过外接驱动或者加三极管放大器或者更换大驱动电流单片机实现亮度增加。

基于51的双机通信系统相关推荐

  1. 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计

    基于51单片机的双机串口通信排队叫号系统(LCD显示)设计 1 开发环境 视频讲解 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 设计要求及 ...

  2. 51单片机双机串口数码管显示排队叫号仿真设计( proteus仿真+程序+报告+讲解视频)

    51单片机双机串口数码管显示排队叫号仿真设计 1.主要功能: 2.仿真 3.程序 4.设计报告 1.1 设计背景与意义 1.2 设计目的 1.3 设计要求及内容 1.4 本文结构安排 2 总体设计方案 ...

  3. matlab模拟角度调制系统的仿真与设计,基于Matlab的模拟通信系统的仿真设计

    <基于Matlab的模拟通信系统的仿真设计>由会员分享,可在线阅读,更多相关<基于Matlab的模拟通信系统的仿真设计(25页珍藏版)>请在人人文库网上搜索. 1.目录摘要-第 ...

  4. 基于51单片机的DS18B20温度控制加热降温系统设计

    基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...

  5. 怎么用matlab建立双机系统,基于MATLAB的双机通信的实现

    第 卷第 期< 年 月 华 东 交 通 大 学 学 报 」 飞 朗 而 , 文章编号 一 以刀 能 一 以巧 一 基 于 的双机通信 的实现 曹青松 , 周继 惠 , 熊国 良 华东交通大学 机 ...

  6. 基于单片机的超市储物柜设计_基于51单片机对电子储物柜系统的设计

    电路描述: 安全是我们日常的生活中最关心的问题. 每个人都觉得安全问题是非常至关重要的,在家里的门和安全,可以尽可能多的安全. 为了对于门访问安全 因此,我们打算通过引进一个电子密码锁系统,该系统包括 ...

  7. C语言 | 基于51单片机实现MPU6050的卡尔曼滤波算法(代码类2)

    github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 之前写过一个博客(代码分享:单片机开发 | ...

  8. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

  9. 51单片机计算机实物焊接,基于51单片机的最小系统焊接图 浅谈单片机最小系统...

    本文主要是关于51单片机的相关介绍,并对基于51单片机的最小系统焊接进行了详尽的阐述. 单片机最小系统 单片机最小系统主要由电源.复位.振荡电路以及扩展部分等部分组成. 对于一个完整的电子设计来讲,首 ...

最新文章

  1. RxSwift技术路线与参考资料
  2. Echarts作图之柏拉图
  3. Quartz.net 定时调度CronTrigger时间配置格式说明
  4. matlab乘与点乘的区别 (*与.* ^与.^)
  5. ARC072/ABC059
  6. 第九届中国开源黑客松活动将于2019年4月18日-4月20日,在深圳举办
  7. 关键词组合工具_SEO学习:如何挖掘行业关键词?关键词挖掘策略和工具推荐
  8. 即刻搜索消失中:产品跳转关停 总部迁址
  9. SQL优化案例-自定义函数索引(五)
  10. STM32接收红外遥控数据
  11. yuv420p 详解_YUV格式详解,图文详解YUV420数据格式
  12. 基于AFD驱动的进程流量控制
  13. html5家谱制作模板,Word如何做家谱世系图?
  14. 怎么获取股票历史数据?获取股票历史数据Excel
  15. kali创建文件_在kali中使用ecryptfs创建加密文件夹-bin文件夹
  16. 宋体测试液晶屏测试小程序
  17. 办北京居住证,定制社保缴费记录,个人权益记录最近6个月的查询与打印,社保,北京市社会保险,北京市社会保险网上服务平台,北京市社会保险网上申报查询系统
  18. P3088 [USACO13NOV]Crowded Cows
  19. 中小企业怎样搭建软件安全开发流程和规范
  20. 闲鱼疯转 6800 份!大厂内部数据分析资料首公开!

热门文章

  1. PHPStorm 显示自动换行
  2. matlab三维曲线的绘制
  3. fatal: http://gitlab.xxxx.com/xxx/songjy-coocaa.git/info/refs not valid: is this a git repository
  4. Sql Server利器sql prompt
  5. 什么是面向对象、面向过程?
  6. 如何使用 Java Servlet 处理 HTML 表单数据
  7. android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
  8. 服务器显示器蓝屏怎么解决
  9. MATLAB 学习心得(3) 定积分和双重积分,三重积分的求法
  10. matlab 统计数组频数_matlab如何找出一个数在数组中出现次数