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 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;
	//在停止滚动时,如果有按键按下,则判断目标楼层
	if (P1 != 0xff && Current_Level == Dest_Level )
	{
		if (P1 ==0xfe)Dest_Level =5;
		if (P1 ==0xfd)Dest_Level =4;
		if (P1 ==0xfb)Dest_Level =3;
		if (P1 ==0xf7)Dest_Level =2;
		if (P1 ==0xef)Dest_Level =1;
	}
	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;		
	}
}

Processing 代码

import processing.serial.*;

Serial myPort;  // 创建一个串口对象
int floor = 1;  // 当前楼层
int destFloor = 1;  // 目标楼层
boolean isMoving = false;  // 是否在滚动显示数字
int offset = 0;  // 数字滚动的偏移量

void setup() {
  size(400, 400);
  background(255);
  stroke(0);
  strokeWeight(2);
  textSize(32);
  textAlign(CENTER, CENTER);
  // 打开串口,注意需要修改串口号
  myPort = new Serial(this, "COM4", 9600);
}

void draw() {
  // 绘制楼层图画
  background(255);
  for (int i = 1; i <= 9; i++) {
    if (i == floor) {
      fill(255, 0, 0);
    } else {
      fill(0);
    }
    rect(50, 50 + (i-1)*40, 100, 30);
    fill(255);
    text(i, 100, 65 + (i-1)*40);
  }
  // 如果正在滚动显示数字,发送目标楼层到单片机
  if (isMoving) {
    myPort.write(destFloor);
  }
}

void mouseClicked() {
  // 如果没有在滚动显示数字,记录目标楼层并开始滚动显示数字
  if (!isMoving) {
    for (int i = 1; i <= 9; i++) {
      if (mouseX > 50 && mouseX < 150 && mouseY > 50 + (i-1)*40 && mouseY < 80 + (i-1)*40) {
        destFloor = i;
        isMoving = true;
        break;
      }
    }
  }
}

void serialEvent(Serial p) {
  // 接收单片机发送的数字并显示
  String input = p.readString();
  if (input != null) {
    input = input.trim();
    if (input.length() == 1) {
      floor = Integer.parseInt(input);
    }
  }
}

电气原理图

  1. 51 单片机需要连接到电脑上,使用串口通信。具体连接方式可以参考相关教程。
  2. 51 单片机需要连接到一个 8x8 LED 点阵屏上,使用行列扫描的方式控制 LED 的亮灭。需要连接 8 根行线和 8 根列线,具体连接方式可以参考相关教程。
  3. 51 单片机需要连接到 5 个按键上,分别对应 5 个楼层。按键需要连接到单片机的输入口上,需要加上上拉电阻或使用外部上拉电源。

注意:

  • 以上只是一个基本的实现,具体的硬件连接和代码实现还需要根据具体情况进行修改和完善。
  • Processing 代码中的串口号需要根据实际情况修改。
  • 51 单片机代码中需要根据按键的连接方式修改判断条件。

其他

  • 51 单片机代码中,Table[] 数组存储了数字 0 到 9 的 8x8 LED 点阵屏显示数据。
  • Processing 代码中,draw() 函数负责绘制楼层图像,mouseClicked() 函数处理鼠标点击事件,serialEvent() 函数接收来自单片机的串口数据。
  • 电气原理图部分只是简单的说明,具体连接方式需要根据实际使用的硬件设备进行调整。

总结

本项目通过 51 单片机和 Processing 软件的结合,实现了简单电梯数字滚动显示功能,并能够通过鼠标点击交互控制。这是一个基本的示例,可以根据实际需求进行扩展和改进。

51 单片机仿真电梯数字滚动显示:Processing 交互控制

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

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