51 单片机仿真电梯数字滚动显示:Processing 交互控制
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);
}
}
}
电气原理图
- 51 单片机需要连接到电脑上,使用串口通信。具体连接方式可以参考相关教程。
- 51 单片机需要连接到一个 8x8 LED 点阵屏上,使用行列扫描的方式控制 LED 的亮灭。需要连接 8 根行线和 8 根列线,具体连接方式可以参考相关教程。
- 51 单片机需要连接到 5 个按键上,分别对应 5 个楼层。按键需要连接到单片机的输入口上,需要加上上拉电阻或使用外部上拉电源。
注意:
- 以上只是一个基本的实现,具体的硬件连接和代码实现还需要根据具体情况进行修改和完善。
- Processing 代码中的串口号需要根据实际情况修改。
- 51 单片机代码中需要根据按键的连接方式修改判断条件。
其他
- 51 单片机代码中,
Table[]数组存储了数字 0 到 9 的 8x8 LED 点阵屏显示数据。 - Processing 代码中,
draw()函数负责绘制楼层图像,mouseClicked()函数处理鼠标点击事件,serialEvent()函数接收来自单片机的串口数据。 - 电气原理图部分只是简单的说明,具体连接方式需要根据实际使用的硬件设备进行调整。
总结
本项目通过 51 单片机和 Processing 软件的结合,实现了简单电梯数字滚动显示功能,并能够通过鼠标点击交互控制。这是一个基本的示例,可以根据实际需求进行扩展和改进。
原文地址: https://www.cveoy.top/t/topic/k43k 著作权归作者所有。请勿转载和采集!