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 currentLevel = 1, destLevel = 1, x = 0, t = 0;
void main() {
P3 = 0x80;
currentLevel = 1;
TMOD = 0x01; //T0工作方式
TH0 = -4000 / 256; //4ms//每个数字有8字节
TL0 = -4000 % 256;
TR0 = 1;
IE = 0x92; //开启串口中断
EA = 1;
while (1);
}
void Led_Dispaly() interrupt 1 {
uchar i;
TH0 = -4000 / 256; //4ms
TL0 = -4000 % 256;
P3 = _crol_(P3, 1);
i = currentLevel * 8 + r + offset;
P0 = ~Table[i];
//上升显示
if (currentLevel < destLevel) {
if (++r == 8) { //每个数字有8字节
r = 0;
if (++x == 4) { //每完成x次刷新后后偏
x = 0;
if (++offset == 8) {
offset = 0;
currentLevel++;
}
}
}
}
//下降显示
else if (currentLevel > destLevel) {
if (++r == 8) { //每个数字有8字节
r = 0;
if (++x == 4) { //每完成x次刷新后前偏
x = 0;
if (--offset == -8) {
offset = 0;
currentLevel--;
}
}
}
}
//停止滚动,保持稳定的刷新显示
else {
if (++r == 8) r = 0;
}
}
void UART() interrupt 4 {
if (RI) {
destLevel = SBUF;
RI = 0;
}
}
Processing代码
import processing.serial.*;
Serial myPort; //创建串口对象
int level = 1; //当前楼层
int destLevel = 1; //目标楼层
void setup() {
size(400, 400);
background(255);
textAlign(CENTER, CENTER);
//打开串口
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
void draw() {
background(255);
//绘制楼房
for (int i = 0; i < 9; i++) {
fill(200);
rect(100, 360 - i * 30, 200, 30);
fill(0);
textSize(20);
text(i + 1, 200, 375 - i * 30);
}
//绘制当前楼层
fill(0, 255, 0);
rect(150, 360 - (level - 1) * 30, 100, 30);
}
void mousePressed() {
//检测点击的楼层
if (mouseY >= 60 && mouseY <= 390) {
int clickedLevel = 10 - (mouseY - 60) / 30;
if (clickedLevel != level) {
destLevel = clickedLevel;
myPort.write(destLevel);
}
}
}
代码说明
-
51单片机代码
- 定义了数字显示的字符表
Table,用于存储每个数字的点阵数据。 - 使用定时器0产生4ms的定时中断,用于控制数字显示的刷新频率。
- 使用串口中断接收来自Processing的指令,更新目标楼层
destLevel。 - 在中断函数
Led_Dispaly中实现数字滚动的逻辑,根据当前楼层和目标楼层进行上升或下降滚动。
- 定义了数字显示的字符表
-
Processing代码
- 使用
Serial类与单片机进行串口通信。 - 使用鼠标点击事件检测用户选择的楼层。
- 将用户选择的楼层信息通过串口发送给单片机。
- 使用
运行效果
运行Processing代码后,会显示一个九层楼房的图形界面。用户可以点击不同的楼层按钮,单片机上的数字会相应地滚动显示到对应的楼层数字。
总结
本文通过一个简单的例子演示了如何使用51单片机模拟电梯数字滚动显示,并使用Processing实现与单片机交互的图形界面,让用户可以更加直观地体验和控制数字滚动的效果。
注意:
- 实际应用中,还需要根据具体情况进行代码的修改和完善。
- 确保Processing程序和51单片机程序的串口配置一致。
- 为了能够在Processing和51单片机之间进行串口通信,需要将Processing的串口与51单片机的串口连接。
原文地址: https://www.cveoy.top/t/topic/k43i 著作权归作者所有。请勿转载和采集!