51 单片机接收程序和 Processing 发送程序示例
51 单片机接收程序
#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()
{
Current_Level = 1;//?1????
TMOD = 0x01; //T0????
TH0 = -4000/256;//4ms//?????8??
TL0 = -4000%256;
TR0=1;
IE = 0x82;
EA =1;
while(1);
}
void Led_Dispaly() interrupt 1
{
uchar i;
//??????,???????,???????
if (Current_Level == Dest_Level )
{
if (SBUF == 0x09) Dest_Level = 9;
else if (SBUF == 0x08) Dest_Level = 8;
else if (SBUF == 0x07) Dest_Level = 7;
else if (SBUF == 0x06) Dest_Level = 6;
else if (SBUF == 0x05) Dest_Level = 5;
else if (SBUF == 0x04) Dest_Level = 4;
else if (SBUF == 0x03) Dest_Level = 3;
else if (SBUF == 0x02) Dest_Level = 2;
else if (SBUF == 0x01) Dest_Level = 1;
}
TH0 = -4000/256;//4ms
TL0 = -4000%256;
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;
}
}
Processing 发送程序
import processing.serial.*;
Serial myPort; //创建串口对象
int level = 1; //初始化电梯当前楼层为1
void setup() {
size(200, 200);
myPort = new Serial(this, "COM3", 9600); //设置串口号和波特率
}
void draw() {
background(255);
fill(0);
textSize(20);
text("Current Level: " + level, 20, 50); //显示当前楼层
text("Press 1-9 to select floor", 20, 100);
}
void keyPressed() {
if (key >= '1' && key <= '9') { //如果按下的键是数字键1-9
level = key - '0'; //将楼层设置为对应数字
myPort.write(key); //向单片机发送选中的楼层
}
}
程序说明:
- 51 单片机程序使用定时器 0 产生 4ms 中断,在中断服务函数
Led_Dispaly()中读取串口接收到的数据,并根据数据控制 LED 显示屏,模拟电梯的运行过程。 - Processing 程序接收键盘输入的数字 1-9,并将数字发送给 51 单片机,控制电梯运行到对应楼层。
- 以上程序需要修改串口号和波特率以适应您的硬件环境。
原文地址: https://www.cveoy.top/t/topic/k45u 著作权归作者所有。请勿转载和采集!