Processing 上位机代码

import processing.serial.*;
Serial port;

void setup(){
  port = new Serial(this, "COM3", 9600); //Arduino板的端口号
  size(200, 500);
  textSize(150);
}

void draw(){
  background(225);
  
  String floors = 'F9 F8 F7 F6 F5 F4 F3 F2 F1';
  textSize(24);
  fill(255, 0, 0);
  textLeading(50);
  text(floors, 20, 25, 40, 500);
  
  fill(100);
  rect(50, 0, 100, 50);
  
  fill(100);
  rect(50, 50, 100, 50);
  
  fill(100);
  rect(50, 100, 100, 50);  
  
  fill(100);
  rect(50, 150, 100, 50);
  
  fill(100);
  rect(50, 200, 100, 50);
  
  fill(100);
  rect(50, 250, 100, 50);
  
  fill(100);
  rect(50, 300, 100, 50);
  
  fill(100);
  rect(50, 350, 100, 50);
  
  fill(100);
  rect(50, 400, 100, 50);
}

void mouseClicked(){
  if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 0) & (mouseY <= 50)) {
    println('9floor');
    port.write(0x09);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 50) & (mouseY <= 100)) {
    println('8floor');
    port.write(0x08);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 100) & (mouseY <= 150)) {
    println('7floor');
    port.write(0x07);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 150) & (mouseY <= 200)) {
    println('6floor');
    port.write(0x06);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 200) & (mouseY <= 250)) {
    println('5floor');
    port.write(0x05);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 250) & (mouseY <= 300)) {
    println('4floor');
    port.write(0x04);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 300) & (mouseY <= 350)) {
    println('3floor');
    port.write(0x03);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 350) & (mouseY <= 400)) {
    println('2floor');
    port.write(0x02);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 400) & (mouseY <= 450)) {
    println('1floor');
    port.write(0x01);
  }
}

51 单片机代码

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table[] = 
{
  0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, // 0
  0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, // 1
  0x00, 0x7E, 0x02, 0x02, 0x7E, 0x40, 0x40, 0x7E, // 2
  0x00, 0x7E, 0x02, 0x02, 0x7E, 0x02, 0x02, 0x7E, // 3
  0x00, 0x48, 0x48, 0x48, 0x7E, 0x08, 0x08, 0x08, // 4
  0x00, 0x7E, 0x40, 0x40, 0x7E, 0x02, 0x02, 0x7E, // 5
  0x00, 0x7C, 0x40, 0x40, 0x7C, 0x44, 0x44, 0x7C, // 6
  0x00, 0x7C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // 7
  0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, // 8
  0x00, 0x7E, 0x42, 0x42, 0x7E, 0x02, 0x02, 0x7E, // 9
};
uint r = 0;
char offset = 0;
uchar Current_Level = 1, Dest_Level = 1, x = 0, t = 0;

void main(){
  P3 = 0x80;
  Current_Level = 1; //从1开始显示
  TMOD  = 0x01; //T0工作方式
  TH0 = -4000 / 256; //4ms //每个数字有8字节
  TL0 = -4000 % 256;
  TR0 = 1;
  IE = 0x82;
  EA = 1;
  while(1);
}

void Led_Dispaly() interrupt 1
{
  uchar i;
  // 接收 Processing 发送的楼层信息
  if (RI) {
    RI = 0;
    switch (SBUF) {
      case 0x09: Dest_Level = 9; break;
      case 0x08: Dest_Level = 8; break;
      case 0x07: Dest_Level = 7; break;
      case 0x06: Dest_Level = 6; break;
      case 0x05: Dest_Level = 5; break;
      case 0x04: Dest_Level = 4; break;
      case 0x03: Dest_Level = 3; break;
      case 0x02: Dest_Level = 2; break;
      case 0x01: Dest_Level = 1; break;
    }
  }
  
  TH0 = -4000 / 256; //4ms
  TL0 = -4000 % 256;
  P3 = _crol_(P3, 1);
  i = Current_Level * 8 + r + offset;
  P0 = ~Table[i];
  
  //上升显示
  if (Current_Level < Dest_Level )
  {
    if ( ++r == 8)
    {
      //每个数字有8字节
      r = 0;
      if( ++x == 4)
      {
        //每完成x次刷新后后偏
        x = 0;
        if(++offset == 8)
        {
          offset = 0;
          Current_Level++;
        }
      }
    }
  }
  //下降显示
  else if(Current_Level > Dest_Level )
  {
    if ( ++r == 8)
    {
      //每个数字有8字节
      r = 0;
      if( ++x == 4)
      {
        //每完成x次刷新后前偏
        x = 0;
        if(--offset == -8)
        {
          offset = 0;
          Current_Level--;
        }
      }
    }
  }
  //停止滚动,保持稳定的刷新显示
  else
  {
    if ( ++r == 8) r = 0;
  }
}

代码说明:

  1. Processing 代码:
  • 界面绘制了九层楼,并在每个楼层区域添加了点击事件。
  • 点击对应楼层时,发送相应的楼层数字(1-9)到单片机。
  1. 51 单片机代码:
  • 使用串口接收来自 Processing 发送的楼层数字。
  • 根据接收到的楼层数字,更新目标楼层 Dest_Level
  • 通过定时器中断,控制 LED 点阵滚动显示。
  • 实现了向上滚动(Current_Level < Dest_Level)、向下滚动(Current_Level > Dest_Level)和停止滚动(Current_Level == Dest_Level)三种状态。

运行步骤:

  1. 将 Processing 代码和 51 单片机代码分别上传到各自的开发环境。
  2. 使用虚拟串口配对软件将 Processing 和单片机串口连接起来。
  3. 运行 Processing 代码,点击界面上的楼层,即可观察单片机上的 LED 点阵模拟电梯数字滚动。

注意:

  • 确保 Processing 代码中 COM3 端口号与实际连接的串口端口号一致。
  • 确保 51 单片机代码中的串口配置(波特率、中断等)与 Processing 代码中设置一致。
  • 为了更平滑的滚动效果,可以调整定时器中断时间和 x 值。
  • 本代码仅供参考,可以根据实际情况进行修改和优化。

原文地址: https://www.cveoy.top/t/topic/k435 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录