51单片机仿电梯数字滚动显示代码解析及Processing交互实现

本文将详细解析一个51单片机模拟电梯数字滚动显示的代码示例,并提供使用Processing实现与单片机交互的图形界面。用户可以通过点击楼层按钮控制单片机上的数字滚动显示。

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 currentLevel = 1, destLevel = 1, x = 0, t = 0;

void main() {
  P3 = 0x80;
  currentLevel = 1;
  TMOD = 0x01;  //T0工作方式
  TH0 = -4000 / 256;  //4ms//每个数字有8字节
  TL0 = -4000 % 256;
  TR0 = 1;
  IE = 0x92;  //开启串口中断
  EA = 1;
  while (1);
}

void Led_Dispaly() interrupt 1 {
  uchar i;
  TH0 = -4000 / 256;  //4ms
  TL0 = -4000 % 256;
  P3 = _crol_(P3, 1);
  i = currentLevel * 8 + r + offset;
  P0 = ~Table[i];

  //上升显示
  if (currentLevel < destLevel) {
    if (++r == 8) {  //每个数字有8字节
      r = 0;
      if (++x == 4) {  //每完成x次刷新后后偏
        x = 0;
        if (++offset == 8) {
          offset = 0;
          currentLevel++;
        }
      }
    }
  }
  //下降显示
  else if (currentLevel > destLevel) {
    if (++r == 8) {  //每个数字有8字节
      r = 0;
      if (++x == 4) {  //每完成x次刷新后前偏
        x = 0;
        if (--offset == -8) {
          offset = 0;
          currentLevel--;
        }
      }
    }
  }
  //停止滚动,保持稳定的刷新显示
  else {
    if (++r == 8) r = 0;
  }
}

void UART() interrupt 4 {
  if (RI) {
    destLevel = SBUF;
    RI = 0;
  }
}

Processing代码

import processing.serial.*;

Serial myPort;  //创建串口对象
int level = 1;  //当前楼层
int destLevel = 1;  //目标楼层

void setup() {
  size(400, 400);
  background(255);
  textAlign(CENTER, CENTER);

  //打开串口
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  background(255);

  //绘制楼房
  for (int i = 0; i < 9; i++) {
    fill(200);
    rect(100, 360 - i * 30, 200, 30);
    fill(0);
    textSize(20);
    text(i + 1, 200, 375 - i * 30);
  }

  //绘制当前楼层
  fill(0, 255, 0);
  rect(150, 360 - (level - 1) * 30, 100, 30);
}

void mousePressed() {
  //检测点击的楼层
  if (mouseY >= 60 && mouseY <= 390) {
    int clickedLevel = 10 - (mouseY - 60) / 30;
    if (clickedLevel != level) {
      destLevel = clickedLevel;
      myPort.write(destLevel);
    }
  }
}

代码说明

  • 51单片机代码

    • 定义了数字显示的字符表Table,用于存储每个数字的点阵数据。
    • 使用定时器0产生4ms的定时中断,用于控制数字显示的刷新频率。
    • 使用串口中断接收来自Processing的指令,更新目标楼层destLevel
    • 在中断函数Led_Dispaly中实现数字滚动的逻辑,根据当前楼层和目标楼层进行上升或下降滚动。
  • Processing代码

    • 使用Serial类与单片机进行串口通信。
    • 使用鼠标点击事件检测用户选择的楼层。
    • 将用户选择的楼层信息通过串口发送给单片机。

运行效果

运行Processing代码后,会显示一个九层楼房的图形界面。用户可以点击不同的楼层按钮,单片机上的数字会相应地滚动显示到对应的楼层数字。

总结

本文通过一个简单的例子演示了如何使用51单片机模拟电梯数字滚动显示,并使用Processing实现与单片机交互的图形界面,让用户可以更加直观地体验和控制数字滚动的效果。

注意:

  • 实际应用中,还需要根据具体情况进行代码的修改和完善。
  • 确保Processing程序和51单片机程序的串口配置一致。
  • 为了能够在Processing和51单片机之间进行串口通信,需要将Processing的串口与51单片机的串口连接。
51单片机仿电梯数字滚动显示代码解析及Processing交互实现

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

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