基于51的双机通信系统

这篇具有很好参考价值的文章主要介绍了基于51的双机通信系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

基于51的双机通信系统

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

效果如下:

基于51的双机通信系统

 代码如下:

发送端(乙机):

#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;//不显示
    }
}

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

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

仿真图如下:

基于51的双机通信系统

 效果如下:

基于51的双机通信系统

 发送端代码(乙机):

#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的双机通信系统

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

到了这里,关于基于51的双机通信系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于485总线的评分系统双机实验报告

    本来还想着做多机的,但老师已经打分了就算了。为了压缩到6页删减了很多内容,将就看吧 通过本案例加深理解RS485通信方式,实现上位机的主控制器与所有的下位机进行通信。 实验要求: 使用两块STC板分别下载上一节所提供的.hex文件,搭建485双机通信电路,在linux中编程

    2024年02月09日
    浏览(31)
  • ESP32串口通信 双机串口通信

    环顾论坛居然无使用uart进行双击通信的案例或者讲解!!! 还是自己摸索吧!环境依旧是arduino(熟练使用ESP32后必得用vs code,这个IDE居然有时候函数不能跳转!!!) 双向通信代码 先贴代码(使用串口2,GPIO16、17): esp32发送端 esp32接收端 注意 :接收端不采用循环,目的当

    2024年02月10日
    浏览(30)
  • Proteus8仿真:51单片机使用串口进行双机通讯

    元器件 名称 电阻 RES 51单片机 AT89C51 电容 CAP 晶振 CRYSTAL BCD数码管 7SEG-BCD 串口初始化: 首先根据相关的串口寄存器编写对应的初始化代码: STC89C51单片机设有两个定时器/计数器,因定时器1有4种工作方式,而常选用定时器1的工作方式2(8位自动重装)作为波特率的溢出率。 串口

    2024年02月04日
    浏览(29)
  • Socket实现双机通信

    使用软件:Visual Studio 2022 步骤: 1,新建一个空项目,项目名称为Server,解决方案名称为Socket; 2,软件右方解决方案资源管理器中-右击\\\"解决方案\\\"Socket\\\"-添加\\\"新建项目\\\"添加空项目,项目名称为Client; 3,右击\\\"Server\\\"-添加“现有项”,\\\"Server\\\"有一个头文件,一个源文件,多选并添

    2024年02月11日
    浏览(29)
  • STM32 通过HAL库实现双机SPI程序烧录之一SPI双机通信

    主要功能:STM32F407VET6作为主机,STM32F103ZET6作为从机实现F4通过SPI接口发送数据给F1进行串口打印功能 主要是使用STM32cubemx进行相关配置(使用这个软件不能只用于生成代码,要学会读懂生成的每一句代码这样才方便后期调试,不然出现问题根本找不到) 选择Serial Waire进行调试

    2024年02月08日
    浏览(28)
  • STM32 HAL库 SPI主从双机通信

    最近因为项目需求,需要在一块板子内实现一个主机和五个从机的通信; 主机平台选用的是STM32F407VGT6,从机平台选用的是STM32F103C8T6;通信总线选用的是SPI总线。在构想是觉得采用SPI进行主从通信会很简单,但在实际开发的过程中,各种坑,通信时而正常时而混乱。不过在不

    2024年01月17日
    浏览(29)
  • stm32 GPIO模拟SPI接口实现双机通信

    一、SPI协议简介     一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(主机输入从机输出)、MOSI(主机输出,针对主机来说)、SCLK(时钟,主机产生)、CS(片选,一般由主机发送或者直接使能,通常为低电平有效) ●

    2023年04月08日
    浏览(32)
  • Proteus基于51单片机利用虚拟串口实现主从机的通信

    最近在学校做单片机课程实验时,需要在Proteus上实现串口的通信,具体要求如下: 在此记录一下本人的解题方案,首先Proteus中的原理图绘制如下 其中虚拟串口可在元件库中搜索COMPIM获得。 将原件按上图连接完毕后,将各个虚拟串口的收发波特率设置为19200,并分别赋予CO

    2024年02月08日
    浏览(26)
  • 单片机原理及应用 实验六 双机通信与PCB设计

    单片机原理及应用(C51版) 实验目的及要求: 1.掌握串口通信工作原理及程序开发方法,熟悉ARES软件PCB设计过程; 2.按照P241图A.72绘制电路原理图1,将第6章实例2中2#机的查询法收发程序改为中断法(1#机发送过程不变)并实现原有功能; 3.采用ARES软件完成电路原理图2的PCB设计

    2024年02月06日
    浏览(37)
  • 51单片机:中断系统(外部中断,定时器中断,串口通信)

    目录 中断系统简介: 中断的优先级和嵌套: 8个中断请求源及其优先级: 中断的分别介绍: 1、外部中断0:INT0   2、外部中断1  3、T0和 T1:定时计数器的功能 4、串口中断(串口为什么使用定时器后面讲) 中断寄存器 (1)中断允许控制(IE) (2)中断请求标志(TCON) (

    2024年01月25日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包