基于Proteus的LED流水灯实验

1实验原理

用八个LED灯实现流水灯的效果
P0口8个引脚各接一个LED灯,要求这8个LED灯从第一个开始,依次被点亮,一直循环往复,(注意每个时刻仅允许一个LED灯点亮)

2Proteus仿真电路图

基于Proteus的LED流水灯实验_第1张图片
这里用到了wiere Label mode(LBL)线标模式
给电路中需要使用线标的线头或端点起个名字,整个原理图中具有相同名字的端点,表示是短接在一起的,这样就不需要直接接线了,看起来会非常简单整洁

所用元器件图基于Proteus的LED流水灯实验_第2张图片

(这里我用了三种颜色的LED灯,当然这些都可以自行安排选择)

4C51代码

#include	//定义头文件

void init()		   //定义初始化子函数 
{
     
	P0=0XFF;	  //使P0口引脚全部设为1
}

void delay(int ms) //定义延时子函数
{
     
	int i,j;		
	for(i=ms;i>0;i--) 	 
	  for(j=110;j>0;j--);  //通过改变ms的次数来改变延时时间
}

void main()		 //main代表主函数,程序执行的部分
{
     
	init();			 //调用初始化子函数
	while(1)
	{
     
		P0=0XFE;	 //用二进制表示为1111 1110B ,使第一个LED亮
		delay(1000);   

		P0=0XFD;		//1111 1101B	,使第二个LED亮
		delay(1000);

		P0=0XFB;	  //1111 1011B ,下面以此类推
		delay(1000);

		P0=0XF7;
		delay(1000);	//延时,调用延时子函数

		P0=0XEF;
		delay(1000);

		P0=0XDF;
		delay(1000);

		P0=0XBF;
		delay(1000);

		P0=0X7F;
		delay(1000);

	}
}

①用十六进制表示P0口的状态:
我们写程序控制单片机的某个引脚输出高电平或者低电平时,都是提前定义一个变量代表这个引脚,如果要对单片机某个口的八个引脚都进行输出操作,就需要定义八个变量来表示这八个引脚,这样十分繁琐。
P0,P1,P2,P3这四个I/O口对单片机来说就是4个寄存器,这四个寄存器包括8个二进制位,(正好是1个字节),我们即可以对这四个寄存器进行为寻址,也可以进行字节寻址。对I/O进行编程,既可以对这个口的其中一个引脚进行编程,也可以对整个口进行编程操作。
例如让P0^0为高电平,其他为低电平,可以直接用二进制写成P0=0000 0001B(最高位在最左,最低位在最右),因为Keil,编译器不支持二进制数操作,所以就需要把二进制数转化为十六进制数,即P0=0X01;
②定义初始化子函数的原因:
一般在生产实践中,任何的应用系统在商店运行之后,会先执行一个初始化程序,保证所有的设备处于一个安全稳定的可靠状态,这样可以防止意外事故的发生,同时还会根据项目需求进行一些必须的系统设置,对于单片机应用系统来讲也是如此,所以最好在写程序时定义一个初始化子函数,这样可以保证相关的外设都处于一个非工作状态,比如对于这个LED灯来讲,我们就在初始化程序中控制它处于一个熄灭状态,若是某个引脚需要做输入口,则对其进行写1操作,另外,定时器中断系统等寄存器的配置,有时候也会根据需要进行设置。

5. C51代码(简化版)

#include	//定义51单片机所需的头文件
#include	   //定义循环左移函数所需头文件

unsigned char LED;											  
void init()		   //定义初始化子函数 
{
     
	P0=0XFF;	  //使P0口引脚全部设为1
}


void delay(int ms) //定义延时子函数
{
     
	int i,j;		
	for(i=ms;i>0;i--) 	 
	  for(j=110;j>0;j--);  //通过改变ms的次数来改变延时时间
}

void main()		 //main代表主函数,程序执行的部分
{
     
	init();			 //调用初始化子函数

	LED=0XFE;		 //1111 1110B
	while(1)
	{
     
	P0=LED;
	delay(300);		  //调用延时函数

	LED=_crol_(LED,1);	//调用循环左移函数
	}
}

循环左移函数
#include
-crol-(unsigned.char x ,unsigned.char weidhu);
其中“-crol-”包含在“”这个头文件中,
“unsigned.char x”表示需要左移的数据
“unsigned.char weidhu”表示左移的位数

你可能感兴趣的:(单片机,单片机)