基于Proteus和Keli的单片机电梯模拟:接收Processing发送的数据并显示楼层
//8*8led电梯显示 //processing发送代码 //通过processing向单片机发送数据
#include <reg51.h> #define uchar unsigned char #define uint unsigned int
//0~9数字表格 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 };
//当前楼层和目标楼层 uchar Current_Level = 1, Dest_Level = 1; uint r = 0; char offset = 0; uchar val = 0;
//显示数字 void displayDigit();
void main() { //初始化串口 TMOD = 0x20; //定时器1工作方式2 SCON = 0x50; //串口方式1,允许接收 PCON = 0x00; //波特率不倍速 TH1 = 0xFD; //设置波特率9600 TL1 = 0xFD; TR1 = 1; //启动定时器1 ES = 1; //允许串口中断 EA = 1; //允许总中断
while (1) { displayDigit(); //显示数字 } }
//串口中断服务程序 void serial() interrupt 4 { if (RI == 1) { //接收到数据 val = SBUF; //读取数据 RI = 0; //清除接收中断标志 if (val >= 1 && val <= 9) { //接收到1~9的数据 Dest_Level = val; //设置目标楼层 } } }
//显示数字 void displayDigit() { uchar i = Current_Level * 8 + r + offset; //计算要显示的数字在Table中的位置 P0 = ~Table[i]; //设置要显示的数字
//当前楼层小于目标楼层,电梯上升 if (Current_Level < Dest_Level) { if (++r == 8) { //到达一层楼,重置r,offset加1 r = 0; if (++offset == 8) { //到达新楼层,重置offset,Current_Level加1 offset = 0; Current_Level++; } }
} //当前楼层大于目标楼层,电梯下降 else if (Current_Level > Dest_Level) { if (++r == 8) { //到达一层楼,重置r,offset减1 r = 0; if (--offset == -8) { //到达新楼层,重置offset,Current_Level减1 offset = 0; Current_Level--; } }
} //当前楼层等于目标楼层,电梯停止 else { if (++r == 8) r = 0; //到达一层楼,重置r } }
原文地址: https://www.cveoy.top/t/topic/nJWh 著作权归作者所有。请勿转载和采集!