实验目的:
- 用51单片机控制16只LED灯左右来回循环滚动点亮,产生来回走马灯的效果;
- 在Proteus中设计仿真硬件电路,在keil中分别设计出汇编语言和C语言的源程序,然后用Proteus来进行整体系统的仿真运行。
实验器材:
Proteus、keil
实验原理(给出硬件电路图):
实验步骤:
- 在Proteus中完成流水灯的原理图设计,设计的是共阳极的流水灯,当P0口或者P2口为低电平(0)的时候,LED灯亮,当P0口或者P2口为高电平的时候,LED灯灭。
- 根据LED灯共阳极的特性,在keil中写16只流水灯的汇编语言和C语言代码,然后生成hex文件,在Proteus中实现LED的流水灯。
程序代码及实验结果(含汇编语言代码和C语言代码):
C语言代码:
#include <REGX52.H>
//定义了一个延时函数
void Delay1ms(unsigned int xms); //@12.000MHz
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
int main(void)
{
while(1)
{
P2=0xFE;//1111 1110
Delay1ms(1000);
P2=0xFD;//1111 1101
Delay1ms(900);
P2=0xFB;//1111 1011
Delay1ms(800);
P2=0xF7;//1111 0111
Delay1ms(700);
P2=0xEF;//1110 1111
Delay1ms(600);
P2=0xDF;//1101 1111
Delay1ms(500);
P2=0xBF;//1011 1111
Delay1ms(300);
P2=0x7F;//0111 1111
Delay1ms(100);
P2 = 0xFF; //让P2端口的灯灭 1111 1111
Delay1ms(100);
P0=0xFE;//1111 1110
Delay1ms(1000);
P0=0xFD;//1111 1101
Delay1ms(900);
P0=0xFB;//1111 1011
Delay1ms(800);
P0=0xF7;//1111 0111
Delay1ms(700);
P0=0xEF;//1110 1111
Delay1ms(600);
P0=0xDF;//1101 1111
Delay1ms(500);
P0=0xBF;//1011 1111
Delay1ms(300);
P0=0x7F;//0111 1111
Delay1ms(100);
P0 = 0xFF; //让P2端口的灯灭 1111 1111
Delay1ms(100);
}
}
汇编语言:
START:CLR P2.0 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.0 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.1 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.1 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.2 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.2 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.3 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.3 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.4 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.4 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.5 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.5 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.6 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.6 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P2.7 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P2.7 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.0 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.0 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.1 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.1 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.2 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.2 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.3 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.3 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.4 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.4 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.5 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.5 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.6 ;端口置0,寻址位置将bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.6 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
CLR P0.7 ;端口置0,寻址位置将 bit的位置0
LCALL DELAY ;调用延时函数
SETB P0.7 ;端口置1,寻址位置将bit的位置1
LCALL DELAY ;调用函数
AJMP START ;跳转到START,无条件转移(只能在2KB内范围内转移)
DELAY: MOV R7,#250 ;延时函数
D1: MOV R6,#250
D2: DJNZ R6,D2 ;程序的作用是原地转圈250次
DJNZ R7,D1
RET ;返回主函数
END ;指令结束