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);
}
}
单片机接收程序
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
// 串口初始化
void Serial_Init()
{
SCON = 0x50; // 8位数据,可变波特率
TMOD |= 0x20; // 设置定时器1为8位自动重载模式
TH1 = 0xfd; // 波特率为9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
ES = 1; // 使能串口中断
EA = 1; // 使能总中断
}
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
TMOD = 0x01; // T0 模式1
TH0 = -4000/256; // 4ms
TL0 = -4000%256;
TR0 = 1;
Serial_Init(); // 串口初始化
while(1);
}
// 串口中断处理函数
void Serial_ISR() interrupt 4
{
if(RI) // 接收到数据
{
RI = 0;
switch(SBUF) // 根据接收到的数据进行处理
{
case 0x01: Dest_Level = 1; break;
case 0x02: Dest_Level = 2; break;
case 0x03: Dest_Level = 3; break;
case 0x04: Dest_Level = 4; break;
case 0x05: Dest_Level = 5; break;
case 0x06: Dest_Level = 6; break;
case 0x07: Dest_Level = 7; break;
case 0x08: Dest_Level = 8; break;
case 0x09: Dest_Level = 9; break;
default: break;
}
}
}
void Led_Dispaly() interrupt 1
{
uchar i;
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;
offset = 0;
}
}
程序说明:
- Processing 程序使用鼠标点击事件模拟电梯按键,并发送相应的楼层指令到串口。
- 单片机程序接收 Processing 发送的指令,并控制点阵屏显示相应的楼层数字。
- 程序中使用了 8x8 的点阵屏,每个数字对应一个 8x8 的点阵图。
- 点阵屏显示逻辑是通过不断循环点亮不同的点阵单元,从而实现数字的动态显示。
注意事项:
- 请确保 Processing 和单片机串口通信的波特率一致。
- 请根据实际情况修改代码中的 COM 端口号和点阵屏的连接方式。
- 可以根据需要修改点阵屏显示的数字,以及显示逻辑。
原文地址: https://www.cveoy.top/t/topic/k6dD 著作权归作者所有。请勿转载和采集!