51单片机入入入入入入门小练习之——控制LED

       点亮LED小灯作为一项最简单的应用,可以帮助大家理解单片机工作方式,学会操控某些I/O口的电平。

       学习开发板的LED一般采用共阳的连接方式,LED所需电流较小,可直接由单片机I/O口提供。控制I/O输出低电平,LED小灯两端即会产生电势差,从而点亮。

本次实验内容:

1.使 LED1 亮灭;

2.LED1 闪烁(delay);

3.流水灯(>、while、for、delay)

        (1)从 LED1 到 8 按顺序亮

        (2)流两个来回

        (3)从 LED1 开始每次亮两个灯循环

        (4)LED1.3.5.7 亮 0.5s 灭 0.5s,2.4.6.8 亮 0.5s 灭 0.5s,全亮 0.5s 全 灭 0.5s,循环。

4.更多有趣设计!!!

参考代码:

(参考代码格式相对标准易读,适合大家学习、理解。但并非最简单的代码)

1.使 LED1 亮灭;

/**************************************************************************************
*使 LED1 亮*
实现现象:下载程序后D1指示灯点亮																				  
***************************************************************************************/
#include "reg52.h"       //此文件中定义了单片机的一些特殊功能寄存器
sbit led=P2^0;	         //将单片机的P2.0端口定义为led

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
*******************************************************************************/
void main()
{
	while(1)
	{
		led=0;	//P2.0端口设置为低电平
	}		
}

2.LED1 闪烁(delay);

/**************************************************************************************
*LED闪烁实验	*
实现现象:下载程序后D1指示灯闪烁																			  
***************************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0;		 //将单片机的P2.0端口定义为led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
*******************************************************************************/
void main()
{
	while(1)
	{
		led=0;
		delay(50000); //大约延时500ms
		led=1;
		delay(50000); //大约延时500ms	
	}		
}

3.流水灯

(1)从 LED1 到 8 再从8到1流两个来回

方法一:

/*******************************************************************************
*LED流水灯实验*
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动																				  
********************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>	    	 //因为要用到左右移函数,所以加入这个头文件

typedef unsigned int u16;	 //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2	             //将P2口定义为led 后面就可以使用led代替P2口

/******************************************************************************
函 数 名: delay			函数功能: 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}
/******************************************************************************
* 函 数 名: main		函数功能: 主函数
*******************************************************************************/
void main()
{
	u8 i,k;
	for(k=0;k<2;k++)
	{	
		for(i=0;i<7;i++)	 //将led左移一位
		{
			led=_crol_(led,1);
			delay(50000);    //大约延时500ms	
		}
		for(i=0;i<7;i++)  	 //将led右移一位
		{
			led=_cror_(led,1);
			delay(50000);    //大约延时500ms	
		}
	}
	while(1);	
}
	

方法二:

/*******************************************************************************
*LED流水灯实验*
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动																				  
********************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	 //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2	             //将P2口定义为led 后面就可以使用led代替P2口

/******************************************************************************
函 数 名: delay			函数功能: 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/******************************************************************************
* 函 数 名: main		函数功能: 主函数
*******************************************************************************/
void main()
{				
	u8 i,k;
    for(k=0;k<2;k++)
	{
		for(i=0;i<7;i++)
		{
			led=~(0x01<<i);	//将0000 0001左移i位,然后将结果取反赋值到P2口
			delay(50000);   //大约延时500ms
		}
		for(i=0;i<7;i++)
		{
			led=~(0x80>>i);	//将1000 0000右移i位,然后将结果取反赋值到P2口
			delay(50000);   //大约延时500ms
		}
	}
	while(1);
}

	

方法三:

小笨蛋专用:一个灯一个灯分开定义,按亮灭顺序写一大长串代码。不建议使用,看起来太呆啦!!

(2)从 LED1 开始每次亮两个灯循环

/*******************************************************************************
*LED双流水灯实验*
实现现象:下载程序后LED呈现双流水灯效果进行左移右移滚动																				  
********************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	 //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2	             //将P2口定义为led 后面就可以使用led代替P2口
/******************************************************************************
函 数 名: delay			函数功能: 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}
/******************************************************************************
* 函 数 名: main		函数功能: 主函数
*******************************************************************************/
void main()
{
	u8 i,k;				
	for(k=0;k<2;k++)
	{
		for(i=0;i<6;i++)
		{
			led=~(0x03<<i);	//将0000 0011左移i位,然后将结果取反赋值到P2口
			delay(50000);   //大约延时500ms
		}
		for(i=0;i<6;i++)
		{
			led=~(0xc0>>i);	//将1100 0000右移i位,然后将结果取反赋值到P2口
			delay(50000);   //大约延时500ms
		}
	}
	while(1);
}

(3)LED1.3.5.7 亮 0.5s 灭 0.5s,2.4.6.8 亮 0.5s 灭 0.5s,全亮 0.5s 全 灭 0.5s,循环。

/*******************************************************************************
*LED控制实验*
实现现象:LED1.3.5.7 亮 0.5s 灭 0.5s,2.4.6.8 亮 0.5s 灭 0.5s,全亮 0.5s 全 灭 0.5s,循环。																				  
********************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	 //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2	             //将P2口定义为led 后面就可以使用led代替P2口

/******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
*******************************************************************************/
void main()
{
	delay(50000); //大约延时500ms	
	while(1)
	{			
		led=0xaa;	//将1010 1010赋值到P2口
		delay(50000);   //大约延时500ms
		led=0xff;	//将1111 1111赋值到P2口
		delay(50000);   //大约延时500ms
		led=0x55;	//将0101 0101赋值到P2口
		delay(50000);   //大约延时500ms
		led=0xff;	//将1111 1111赋值到P2口
		delay(50000);   //大约延时500ms
		led=0x00;	//将0000 0000赋值到P2口
		delay(50000);   //大约延时500ms
		led=0xff;	//将1111 1111赋值到P2口
		delay(50000);   //大约延时500ms


	}
}

无线电小组——TZ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值