Processing 控制 8x8 LED 点阵模拟电梯数字滚动
使用 Processing 控制 8x8 LED 点阵模拟电梯数字滚动
本示例演示了如何使用 Processing 作为上位机,通过虚拟串口控制 51 单片机,实现 8x8 LED 点阵模拟电梯数字滚动效果。用户在 Processing 画板上点击楼层,单片机接收信息并显示对应数字。
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()
{
Current_Level = 1;//初始为1层
P0 = ~Table[0]; //点阵屏初始显示数字1
TMOD = 0x01; //T0模式1
TH0 = -4000/256;//4ms
TL0 = -4000%256;
TR0=1;
IE = 0x82;
EA =1;
while(1);
}
void Led_Dispaly() interrupt 1
{
uchar i;
//接收processing发送的信息
if (RI == 1)
{
RI = 0;
if (SBUF == 0x09) Dest_Level = 9;
else if (SBUF == 0x08) Dest_Level = 8;
else if (SBUF == 0x07) Dest_Level = 7;
else if (SBUF == 0x06) Dest_Level = 6;
else if (SBUF == 0x05) Dest_Level = 5;
else if (SBUF == 0x04) Dest_Level = 4;
else if (SBUF == 0x03) Dest_Level = 3;
else if (SBUF == 0x02) Dest_Level = 2;
else if (SBUF == 0x01) Dest_Level = 1;
}
TH0 = -4000/256;//4ms
TL0 = -4000%256;
i = Current_Level * 8 + r + offset;
P0 = ~Table[i];
//电梯上升
if (Current_Level < Dest_Level )
{
if ( ++r == 8)
{
r = 0;
if( ++x == 4)
{
x = 0;
if(++offset == 8)
{
offset = 0;
Current_Level++;
}
}
}
}
//电梯下降
else if(Current_Level > Dest_Level )
{
if ( ++r == 8)
{
r = 0;
if( ++x == 4)
{
x = 0;
if(--offset == -8)
{
offset = 0;
Current_Level--;
}
}
}
}
//电梯停止
else
{
if ( ++r == 8) r = 0;
}
}
使用方法:
- 将 Processing 代码中的 "COM3" 替换为你的 Arduino 板的实际端口号。
- 编译并运行 Processing 代码。
- 点击 Processing 画板上的任意楼层,单片机将会控制 8x8 LED 点阵显示对应数字,并模拟电梯滚动效果。
注意:
- 该示例假设你已经连接了 51 单片机和 8x8 LED 点阵,并设置了必要的硬件连接。
- 你需要安装 Processing 软件,并确保你已经安装了 Processing Serial 库。
- 确保 Processing 和 51 单片机的串口通讯速率一致。
- 51 单片机代码中的
Table数组存储了 8x8 LED 点阵显示数字的代码,你可以根据需要修改。 - 该示例只演示了基本的电梯模拟功能,你可以根据需要进行扩展和改进。
扩展和改进:
- 添加开门、关门等其他电梯功能。
- 使用更复杂的点阵动画,模拟更逼真的电梯效果。
- 使用多层点阵,模拟更高的楼层。
- 使用网络连接,实现远程控制电梯。
希望该示例能帮助你学习使用 Processing 和 51 单片机控制 8x8 LED 点阵,并实现简单的电梯模拟效果。
原文地址: https://www.cveoy.top/t/topic/k45l 著作权归作者所有。请勿转载和采集!