#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灯上显示当前所在楼层。

硬件原理:

  1. 串口通信

使用单片机的串口通信功能实现与上位机的通信,通过接收上位机发送的指令控制电梯运行。

  1. 定时器中断

使用定时器中断实现LED灯的扫描,每4ms扫描一次,通过改变偏移量和行数实现LED灯上数字的变化。

  1. LED灯显示

通过8*8的点阵LED灯实现数字的显示,使用一个字符数组来存储数字的显示模式,通过偏移量和行数来选择对应的数字模式进行显示。

  1. 电梯控制

通过接收串口信号来控制电梯的运行,当接收到指定的楼层信号时,电梯会自动运行到该楼层并停止。

代码解释:

  1. 定义字符数组Table[]来存储数字的显示模式,通过偏移量和行数来选择对应的数字模式进行显示。

  2. 定义变量Current_Level表示当前所在楼层,Dest_Level表示目标楼层,x表示当前扫描的行数,r表示当前扫描的列数,offset表示偏移量。

  3. 在主函数中初始化串口通信和定时器中断,并开启总中断。

  4. 在串口中断函数Serial_Receive()中,当接收到指定的楼层信号时,将Dest_Level设置为该楼层。

  5. 在定时器中断函数Led_Dispaly()中,根据当前楼层和目标楼层的关系,改变偏移量和行数,从而实现LED灯上数字的变化。

  6. 在定时器中断函数Led_Dispaly()中,当当前楼层等于目标楼层时,向上位机发送一个0xff的信号,表示电梯已到达指定楼层。

总结:

该代码实现了一个简单的电梯控制系统,通过串口通信和定时器中断实现了电梯的控制和LED灯的显示。可以作为学习单片机中断和串口通信的一个简单示例。

单片机实现8层LED电梯显示系统

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

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