51单片机电梯楼层显示程序优化:8*8 LED点阵显示
51单片机电梯楼层显示程序优化:8*8 LED点阵显示
本文提供一个使用 51 单片机和 8*8 LED 点阵显示电梯楼层的程序示例,并对程序进行优化。同时,还会介绍一些常见的问题和排查方法。
程序流程
- 上位机程序 (Processing): * 使用 Processing 发送 1~9 之间的数字到单片机,代表目标楼层。* 单片机程序 (Keli): * 接收 Processing 发送的目标楼层数据。 * 驱动 LED 点阵显示当前楼层和目标楼层变化。
程序代码
**Processing 程序:**processingimport processing.serial.*;
Serial port;
void setup() { size(200, 500); textSize(150); textAlign(CENTER, CENTER); port = new Serial(this, 'COM3', 9600); //单片机的端口号}
void draw() { background(225);
String floors = 'F1 F2 F3 F4 F5 F6 F7 F8 F9'; textSize(24); fill(255, 0, 0); textLeading(50); text(floors, 20, 25, 40, 450);
for (int i = 0; i < 9; i++) { fill(100); rect(50, i * 50, 100, 50); }}
void mouseClicked() { int currentFloor = -1; for (int i = 0; i < 9; i++) { if (mouseX >= 50 && mouseX <= 150 && mouseY >= i * 50 && mouseY <= (i + 1) * 50) { currentFloor = i + 1; break; } } if (currentFloor > 0) { println(currentFloor + ' floor'); port.write(currentFloor); //向单片机发送数据 }}
**51单片机程序 (Keli):**c//8*8led显示电梯楼层//processing发送数据//需要配合processing代码使用
#include <reg51.h>#define uchar unsigned char#define uint unsigned int
//数字0~9的编码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};
uchar Current_Level = 1, Dest_Level = 1; //当前楼层和目标楼层uint r = 0; //控制led显示的计数器char offset = 0; //控制led显示的偏移量uchar val = 0; //从processing接收到的数据
void displayDigit(); //显示数字void serial() interrupt 4; //串口中断函数
void main() { //串口初始化 TMOD = 0x20; //设置计数器1为8位自动重载模式 SCON = 0x50; //设置串口为模式1,允许接收 PCON = 0x00; //波特率不加倍 TH1 = 0xFD; //计数器1初值,用于波特率9600 TL1 = 0xFD; TR1 = 1; //启动计数器1 ES = 1; //允许串口中断 EA = 1; //开全局中断
while (1) { displayDigit(); //显示数字 }}
void serial() interrupt 4 { if (RI == 1) { //如果接收到数据 val = SBUF; //读取数据 RI = 0; //清除接收中断标志位 if (val >= 1 && val <= 9) { //如果数据为1~9之间的数字 Dest_Level = val; //设置目标楼层为该数字 } }}
void displayDigit() { uchar i = Current_Level * 8 + r + offset; //计算要显示的数字在Table中的索引 P0 = ~Table[i]; //在led上显示该数字
//根据目标楼层调整当前楼层的值以及led的显示效果 if (Current_Level < Dest_Level) { //电梯上升 if (++r == 8) { //到达下一个数字 r = 0; if (++offset == 8) { //下一个数字超出led的显示范围,需要移动偏移量 offset = 0; Current_Level++; } } } else if (Current_Level > Dest_Level) { //电梯下降 if (++r == 8) { //到达下一个数字 r = 0; if (--offset == -8) { //下一个数字超出led的显示范围,需要移动偏移量 offset = 0; Current_Level--; } } } else { //电梯停止 if (++r == 8) r = 0; //到达下一个数字
原文地址: https://www.cveoy.top/t/topic/k4ne 著作权归作者所有。请勿转载和采集!