JT202211 2024-06-07 09:33 采纳率: 0%
浏览 42
已结题

AT89C51单片机代做

设计一控制系统并仿真:包括主从两个单片机,两个单片机通过串口通信,1号单片机上设置四个按键(A B C D键),2号单片机上设置二位七段数码管。一号单片机上四个按键组成四位二进制数,发送给2号单片机数码管显示。

  • 写回答

27条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-06-07 09:33
    关注
    获得0.45元问题酬金

    🕖上午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:惆怅东栏一株雪,人生看得几清明。

    AT89C51 单片机主从控制系统设计

    功能描述:

    • 主机 (AT89C51-1) 通过四个按键 (A, B, C, D) 组成四位二进制数。
    • 主机将该四位二进制数通过串口发送给从机 (AT89C51-2)。
    • 从机接收数据并将其显示在两位七段数码管上。

    硬件连接:

    • 主机:
      • P1.0 - P1.3 连接四个按键 (A, B, C, D)
      • P3.0 (RXD) 连接从机 TXD
      • P3.1 (TXD) 连接从机 RXD
    • 从机:
      • P2.0 - P2.6 连接数码管段选
      • P2.7 连接数码管位选
      • P3.0 (RXD) 连接主机 TXD
      • P3.1 (TXD) 连接主机 RXD

    软件设计:

    1. 主机程序 (Master.c):

    #include <reg51.h>
    
    // 定义按键端口
    sbit KEY_A = P1^0; 
    sbit KEY_B = P1^1;
    sbit KEY_C = P1^2;
    sbit KEY_D = P1^3;
    
    // 定义串口发送函数
    void SendData(unsigned char dat);
    
    void main(void)
    {
      unsigned char key_value;
    
      // 设置串口参数
      TMOD = 0x20;
      TH1  = 0xfd;
      TL1  = 0xfd;
      TR1  = 1;
      SCON = 0x50;
    
      while(1)
      {
        // 读取按键值
        key_value = 0;
        if(KEY_A == 0) key_value |= 0x01;
        if(KEY_B == 0) key_value |= 0x02;
        if(KEY_C == 0) key_value |= 0x04;
        if(KEY_D == 0) key_value |= 0x08;
    
        // 发送数据到从机
        SendData(key_value); 
      }
    }
    
    void SendData(unsigned char dat)
    {
      SBUF = dat;
      while(TI == 0);
      TI = 0;
    }
    

    2. 从机程序 (Slave.c):

    #include <reg51.h>
    
    // 定义数码管显示码表
    unsigned char code DispTab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
    
    // 定义串口接收函数
    unsigned char ReceiveData(void);
    
    void main(void)
    {
      unsigned char value;
    
      // 设置串口参数
      TMOD = 0x20;
      TH1  = 0xfd;
      TL1  = 0xfd;
      TR1  = 1;
      SCON = 0x50;
    
      while(1)
      {
        // 接收主机发送的数据
        value = ReceiveData(); 
    
        // 数码管显示
        P2 = DispTab[value / 10];
        P2_7 = 0;  // 点亮高位
        delay(5); 
        P2 = DispTab[value % 10];
        P2_7 = 1;  // 点亮低位
        delay(5); 
      }
    }
    
    unsigned char ReceiveData(void)
    {
      unsigned char dat;
      while(RI == 0);
      RI = 0;
      dat = SBUF;
      return dat;
    }
    

    程序说明:

    • 程序使用了中断方式进行串口通信。
    • 主机程序读取按键状态,并将按键值组合成一个字节数据,通过串口发送给从机。
    • 从机程序接收主机发送的数据,并根据数据的值控制数码管显示。
    • 需要根据实际硬件连接修改程序中的端口定义和延时函数。

    仿真调试:

    1. 使用 Keil uVision 等仿真软件创建工程,添加代码文件。
    2. 设置仿真环境,包括晶振频率、串口参数等。
    3. 编译程序并下载到虚拟单片机中。
    4. 在仿真环境中模拟按键按下,观察串口数据传输和数码管显示是否正常。

    注意:

    • 上述代码仅供参考,实际应用中需根据具体硬件环境进行修改。
    • 建议添加按键消抖处理和数据校验机制,提高系统稳定性。
    • 可以使用 Proteus 等软件进行电路仿真。

    希望以上信息对您有所帮助!

    评论

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 创建了问题 6月7日