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_LevelCurrent_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 单片机代码中的 P0P3 端口分别连接 LED 点阵的显示数据和位选择信号。
  3. 需要根据实际情况调整 51 单片机代码中的端口号和硬件连接方式。

扩展

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

代码下载

Processing 上位机代码

51 单片机代码

相关资源

Processing 官方网站

51 单片机教程

虚拟串口配对软件

作者

你的姓名


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

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