实例一 LED控制

本文详细介绍了51单片机上控制LED的基本原理和编程方法,包括LED常亮、闪烁及流水灯效果的实现。从源代码出发,深入解析了sbit定义、数据类型、延时函数、循环控制等关键技术点。

LED控制

LED亮灯

源程序

#include’’reg52.h’’

sbit led=P2^0;

void main()
{
   led=0; //P2.0端口设置为低电平
   while(1)
   {
   }
} 

功能

通过P2.0端口输出低电平点亮LED

程序讲解

sbit led=P2^0;

sbit定义 P2.0 管脚,定义好后即可使用led来替代 P2.0 口

led=0;指示灯即点亮

然后进入 while 循环,单片机此时一直在 while 内循环操作。当然该条语句也可以放在 while 循环语句内,同样会点亮 D1 指示灯。在 51 单片机

程序开发中,main 函数内通常都会有一个 while 循环,在循环体内不断执行我们所要实现的功能。对于 LED 这种一次性操作的器件来说,可以把控制语句放在while之前来执行。

LED闪烁

源程序

#include "reg52.h"			 
typedef unsigned int u16;	  
typedef unsigned char u8;

sbit led=P2^0;		 

void delay(u16 i)
{
	while(i--);	
}

void main()
{
	while(1)
	{
		led=0;
		delay(50000); //大约延时450ms
		led=1;
		delay(50000); //大约延时450ms	
	}		
} 

功能

将P2.0端口所控制的LED灯开启450ms,关闭450ms,用肉眼看起来LED灯在闪烁

程序讲解

typedef unsigned int u16;	  
typedef unsigned char u8; \\对数据类型进行定义

delay()为延时函数,跳转到子程序void delay(u16 i),延时时间需要考虑单片机所接晶振电路的频率和循环程序的机器周期。

led=0;
led=1;\\LED开启与关闭

LED流水灯

源程序1

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

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define led P2	   //将P2口定义为led 后面就可以使用led代替P2口

void delay(u16 i)
{
	while(i--);	
}

void main()
{
	u8 i;
	led=~0x01;
	delay(50000); //大约延时450ms	
	while(1)
	{	
		for(i=0;i<8;i++)
		{
			P2=~(0x01<<i);	 //将1右移i位,然后将结果赋值到P2口
			delay(50000); //大约延时450ms
		}
}

源程序2

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>		//因为要用到左右移函数,所以加入这个头文件

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define led P2	   //将P2口定义为led 后面就可以使用led代替P2口

void delay(u16 i)
{
	while(i--);	
}

void main()
{
	u8 i;
	led=~0x01;
	delay(50000); //大约延时450ms	
	while(1)
	{	
		for(i=0;i<7;i++)	 //将led左移一位
		{
			led=_crol_(led,1);
			delay(50000); //大约延时450ms	
		}
		for(i=0;i<7;i++)	//将led右移一位
		{
			led=_cror_(led,1);
			delay(50000); //大约延时450ms	
		}

		}
}

功能

每450msLED灯依次开启,且只能亮一个LED灯,LED灯工作持续450ms

程序讲解

程序1

led=~0x01;,因为 LED 是低电平点亮,所以 0X01 取反 后的结果是 0XFE,对应二进制数为 1111 1110,即最低位为 0,因此最开始的P2.0指示灯会点亮,然后延时一段时间进入 while 循环。
通过for循环8次,每循环一次,点亮的小灯向右移动一次,即P2口输出的低电平要左移一位(需了解P2口与8B字节的关系)
P2=~(0x01<<i);该语句实现低电平移位。

程序2

keil软件内有对应的位移库函数_crol_(),_cror_(),使用这两个函数必须在程序中包含#include<intrins.h>头文件。

循环左移函数_crol_(a,b);``a是左移的值 ,b是左移的位 数 。 包含在instrins.h库函数里面。
循环右移函数,_cror_(a,b);``a是右移的值,b 是右移的位数。 包含在instrins.h库函数里面)

小结

原理:控制P2口输出进而控制LED灯工作。
注意细节:
sbit功能
LED共阴极与共阳极
P2端口与8位数据
while,for循环
数据类型定义
延时函数
晶振频率与机器周期
取反
位移库函数_crol_(),_cror_()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值