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

单片机接收代码

#include <reg51.h>
#include <intrins.h>
#include <string.h>

#define uchar unsigned char
#define uint unsigned int

uchar code Table[]= // LED 显示数字对应码表
{
    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()
{
    Current_Level = 1;//初始为1层
    TMOD  = 0x01;    //T0模式1
    TH0 = -4000/256;//4ms
    TL0 = -4000%256;
    TR0=1;
    IE = 0x82;
    EA =1;
    while(1);   
}

void Led_Dispaly() interrupt 1
{
    uchar i;
    static char buffer[3]; //用于存储接收到的数据
    static int count = 0; //计数器,用于记录已经接收到的字符数
    // 接收数据
    if (RI)
    {
        buffer[count] = SBUF; //将接收到的字符存入缓冲区
        count++; //计数器加1
        if (count == 2) //当接收到2个字符时,表示完整的数据已经接收完成
        {
            buffer[count] = '\0'; //将缓冲区末尾置为'\0',表示字符串结束
            Dest_Level = atoi(buffer); //将字符串转换为整数,并赋值给目标楼层
            count = 0; //计数器清零
        }
        RI = 0; //清除接收中断标志位
    }
    TH0 = -4000/256;//4ms
    TL0 = -4000%256;
    i = Current_Level *8 + r + offset; // 计算LED显示码表索引
    P0 = ~Table[i]; // 控制LED显示
    
    // 上升
    if (Current_Level < Dest_Level )
    {
        if ( ++r ==8)
        {
            r =0;
            if( ++x ==4)
            {
                x = 0;
                if(++offset ==8)
                {
                    offset = 0;
                    Current_Level++;                
                }
                
            }
        }
        
    }
    // 下降
    else if(Current_Level > Dest_Level )
    {
        if ( ++r ==8)
        {
            r =0;
            if( ++x ==4)
            {
                x = 0;
                if(--offset == -8)
                {
                    offset = 0;
                    Current_Level--;                
                }
                
            }
        }
        
    }
    // 停止,保持当前楼层
    else
    {
        if ( ++r ==8) r =0;
        offset = 0;
    }
}

代码说明

  1. Processing 发送程序

    • 使用 processing.serial 库进行串口通信。
    • port=new Serial(this,"COM3",9600); 设置串口号为 COM3,波特率为 9600
    • port.write(0x01~0x09); 发送对应楼层的数字,单片机接收后控制 LED 显示当前楼层。
  2. 单片机接收代码

    • Table 数组存储 LED 显示数字对应码表。
    • Current_Level 存储当前楼层,Dest_Level 存储目标楼层。
    • 使用定时器 T0 产生 4ms 的时间间隔,控制 LED 刷新速度。
    • 通过中断 Led_Dispaly 处理串口接收数据和 LED 控制。
    • 使用 buffer 数组存储接收到的数据,并使用 atoi() 函数将字符串转换为整数。
    • 根据 Current_LevelDest_Level 的值,通过控制 offsetr 变量实现楼层上升、下降和停止状态的切换。

运行步骤

  1. 将 Processing 发送程序代码保存为 .pde 文件,并使用 Processing 软件打开运行。
  2. 将单片机接收代码烧录到单片机中。
  3. 连接 Processing 和单片机串口。
  4. 在 Processing 程序中点击对应楼层按钮,单片机接收后控制 LED 显示当前楼层。

总结

本代码示例提供了一种使用 Processing 和单片机实现楼层控制的方案。通过串口通信,实现不同设备之间的交互,方便调试和修改,具有良好的扩展性。

Processing 发送程序与单片机接收代码:实现楼层控制

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

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