单片机实现8层LED电梯显示系统
#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,0x2,0x2,0x7E,//9
}; uint r= 0; char offset = 0; uchar Current_Level = 1,Dest_Level=1,x=0,t =0;
void main() { P1 = 0x80; Current_Level = 1;//?1???? TMOD = 0x21; //T0????, T1???? TH0 = -4000/256;//4ms//?????8?? TL0 = -4000%256; TR0=1; SCON=0x50; //???????? TH1=0xFD;TL1=0xFD;//??????9600 TR1=1; //?????1 IE = 0x92;//???????? EA =1; while(1); }
void Serial_Receive() interrupt 4 { //????? unsigned char val=0; val=SBUF; P2=val; if (Dest_Level == Current_Level && val != 0xff) { if (val ==0x09)Dest_Level =9; if (val ==0x08)Dest_Level =8; if (val ==0x07)Dest_Level =7; if (val ==0x06)Dest_Level =6; if (val ==0x05)Dest_Level =5; if (val ==0x04)Dest_Level =4; if (val ==0x03)Dest_Level =3; if (val ==0x02)Dest_Level =2; if (val ==0x01)Dest_Level =1; } RI = 0;//????????? }
void Led_Dispaly() interrupt 1 { uchar i; //??????,???????,??????? if (Dest_Level == Current_Level) { SBUF = 0xff; //???????? } TH0 = -4000/256;//4ms TL0 = -4000%256; P1 =crol(P1,1); i = Current_Level *8 + r + offset+1; P0 = ~Table[i];
//up
if (Current_Level < Dest_Level )
{
if ( ++r ==8)
{//?????8??
r =0;
if( ++x ==4)
{//???x??????
x = 0;
if(++offset ==8)
{
offset = 0;
Current_Level++;
}
}
}
}
//down
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;
}
}
详细解释代码中的硬件原理,包括定时器中断,串口中断内容:该代码实现了一个8层的LED灯电梯显示系统,通过接收串口信号控制电梯上下运行,并在LED灯上显示当前所在楼层。
硬件原理:
- 串口通信
使用单片机的串口通信功能实现与上位机的通信,通过接收上位机发送的指令控制电梯运行。
- 定时器中断
使用定时器中断实现LED灯的扫描,每4ms扫描一次,通过改变偏移量和行数实现LED灯上数字的变化。
- LED灯显示
通过8*8的点阵LED灯实现数字的显示,使用一个字符数组来存储数字的显示模式,通过偏移量和行数来选择对应的数字模式进行显示。
- 电梯控制
通过接收串口信号来控制电梯的运行,当接收到指定的楼层信号时,电梯会自动运行到该楼层并停止。
代码解释:
-
定义字符数组Table[]来存储数字的显示模式,通过偏移量和行数来选择对应的数字模式进行显示。
-
定义变量Current_Level表示当前所在楼层,Dest_Level表示目标楼层,x表示当前扫描的行数,r表示当前扫描的列数,offset表示偏移量。
-
在主函数中初始化串口通信和定时器中断,并开启总中断。
-
在串口中断函数Serial_Receive()中,当接收到指定的楼层信号时,将Dest_Level设置为该楼层。
-
在定时器中断函数Led_Dispaly()中,根据当前楼层和目标楼层的关系,改变偏移量和行数,从而实现LED灯上数字的变化。
-
在定时器中断函数Led_Dispaly()中,当当前楼层等于目标楼层时,向上位机发送一个0xff的信号,表示电梯已到达指定楼层。
总结:
该代码实现了一个简单的电梯控制系统,通过串口通信和定时器中断实现了电梯的控制和LED灯的显示。可以作为学习单片机中断和串口通信的一个简单示例。
原文地址: https://www.cveoy.top/t/topic/geQB 著作权归作者所有。请勿转载和采集!