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;
        }
    }
}

说明

  1. Processing 代码使用 Serial 类与 51 单片机进行串口通信。
  2. 单片机代码中添加了串口接收中断,用于接收 Processing 发送的楼层指令。
  3. 51 单片机使用定时器 0 产生 4ms 的中断,实现 LED 滚动显示。
  4. 单片机代码中 Dest_Level 变量用于保存目标楼层,Current_Level 用于保存当前楼层。
  5. 在 Led_Dispaly 函数中,根据 Dest_Level 和 Current_Level 的比较结果,控制 LED 向上或向下滚动显示。
  6. 当 Current_Level 等于 Dest_Level 时,LED 停止滚动,保持目标楼层显示。

使用方法

  1. 使用虚拟串口配对软件,将 Processing 上位机与 51 单片机进行配对。
  2. 在 Processing 代码中,修改 COM3 为实际使用的串口号。
  3. 编译并运行 Processing 代码。
  4. 在 Processing 画板上点击相应的楼层,51 单片机将接收指令并控制 LED 显示目标楼层。

注意

  1. 51 单片机代码中的 Table 数组存储了 LED 点阵显示的数字字符数据。
  2. 51 单片机代码中的 P0 和 P3 端口分别连接 LED 点阵的显示数据和位选择信号。
  3. 需要根据实际情况调整 51 单片机代码中的端口号和硬件连接方式。

扩展

  1. 可以增加更多的功能,例如电梯运行方向指示、楼层到达提示音等。
  2. 可以使用不同的 LED 显示方式,例如使用 7 段数码管或图形 LCD。
  3. 可以使用其他编程语言,例如 Python,进行上位机开发。

代码下载

Processing 上位机代码

51 单片机代码

相关资源

Processing 官方网站

51 单片机教程

虚拟串口配对软件

作者

你的姓名


原文地址: https://www.cveoy.top/t/topic/k434 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录