Processing 发送程序与单片机接收代码:实现楼层控制
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;
}
}
代码说明
-
Processing 发送程序
- 使用
processing.serial库进行串口通信。 port=new Serial(this,"COM3",9600);设置串口号为COM3,波特率为9600。port.write(0x01~0x09);发送对应楼层的数字,单片机接收后控制 LED 显示当前楼层。
- 使用
-
单片机接收代码
Table数组存储 LED 显示数字对应码表。Current_Level存储当前楼层,Dest_Level存储目标楼层。- 使用定时器
T0产生 4ms 的时间间隔,控制 LED 刷新速度。 - 通过中断
Led_Dispaly处理串口接收数据和 LED 控制。 - 使用
buffer数组存储接收到的数据,并使用atoi()函数将字符串转换为整数。 - 根据
Current_Level和Dest_Level的值,通过控制offset和r变量实现楼层上升、下降和停止状态的切换。
运行步骤
- 将 Processing 发送程序代码保存为
.pde文件,并使用 Processing 软件打开运行。 - 将单片机接收代码烧录到单片机中。
- 连接 Processing 和单片机串口。
- 在 Processing 程序中点击对应楼层按钮,单片机接收后控制 LED 显示当前楼层。
总结
本代码示例提供了一种使用 Processing 和单片机实现楼层控制的方案。通过串口通信,实现不同设备之间的交互,方便调试和修改,具有良好的扩展性。
原文地址: https://www.cveoy.top/t/topic/k59W 著作权归作者所有。请勿转载和采集!