Processing 与 51 单片机交互实现电梯数字滚动仿真
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 单片机代码
//名称:8×8LED点阵屏仿电梯数字滚动显示
//说明:本例模拟了电梯显示屏上下滚动显示楼层的效果,当目标楼层大于
//当前楼层时,将向上滚动显示,反之则向下滚动显示。
#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;
//配置串口
SCON = 0x50;
TMOD |= 0x20; //定时器1工作方式2
TH1 = -12; //定时器1初值
TL1 = -12; //定时器1初值
TR1 = 1; //开启定时器1
ES = 1; //开启串口中断
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;
}
}
void serial() interrupt 4
{
uchar data;
if (RI == 1) //收到数据
{
data = SBUF; //读取数据
RI = 0; //清除接收中断标志位
if (data == 0x01) //收到1楼的指令
{
Dest_Level = 1;
}
else if (data == 0x02) //收到2楼的指令
{
Dest_Level = 2;
}
else if (data == 0x03) //收到3楼的指令
{
Dest_Level = 3;
}
else if (data == 0x04) //收到4楼的指令
{
Dest_Level = 4;
}
else if (data == 0x05) //收到5楼的指令
{
Dest_Level = 5;
}
}
}
说明
- Processing 代码使用
Serial类与 51 单片机进行串口通信。 - 单片机代码中添加了串口接收中断,用于接收 Processing 发送的楼层指令。
- 51 单片机使用定时器 0 产生 4ms 的中断,实现 LED 滚动显示。
- 单片机代码中
Dest_Level变量用于保存目标楼层,Current_Level用于保存当前楼层。 - 在
Led_Dispaly函数中,根据Dest_Level和Current_Level的比较结果,控制 LED 向上或向下滚动显示。 - 当
Current_Level等于Dest_Level时,LED 停止滚动,保持目标楼层显示。
使用方法
- 使用虚拟串口配对软件,将 Processing 上位机与 51 单片机进行配对。
- 在 Processing 代码中,修改
COM3为实际使用的串口号。 - 编译并运行 Processing 代码。
- 在 Processing 画板上点击相应的楼层,51 单片机将接收指令并控制 LED 显示目标楼层。
注意
- 51 单片机代码中的
Table数组存储了 LED 点阵显示的数字字符数据。 - 51 单片机代码中的
P0和P3端口分别连接 LED 点阵的显示数据和位选择信号。 - 需要根据实际情况调整 51 单片机代码中的端口号和硬件连接方式。
扩展
- 可以增加更多的功能,例如电梯运行方向指示、楼层到达提示音等。
- 可以使用不同的 LED 显示方式,例如使用 7 段数码管或图形 LCD。
- 可以使用其他编程语言,例如 Python,进行上位机开发。
代码下载
相关资源
作者
原文地址: https://www.cveoy.top/t/topic/k434 著作权归作者所有。请勿转载和采集!