51单片机之LED灯

学习51单片机的第二节课,学习的是LED使用,俗语“点亮你的第一盏灯”。

由下图可以看到,P1组I/O口的8个接口分别接着一个LED灯,并且当P1上的某个口为低电平时,LED就会亮。

#include<reg52.h>
sbit LED0=P1^0;		// 用自己写的标志 LED0 表示 I/O口 P1^0
sbit LED1=P1^1;
 
void main()
{
	LED0 = 0;	//P1^0口给低电平
	LED1 = 0;	//P1^1口给低电平
	while(1);	//不让程序结束,防止程序跑飞,死机。

以上程序只是让灯一直亮着,之后可以再写一些花式灯法

LED向右逐个点亮 ,向左逐个点亮,有两头向中间移动点亮;

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

#include <reg51.h>   
//微妙级延时, t = 2n+6(us); 若要精确延时请使用汇编;
void DelayUs2x(unsigned char n); 
//毫秒级延时,t = n(ms);
void DelayMs(unsigned char n);

void DelayUs2x(unsigned char n)
{
	while(--n);   
}

void DelayMs(unsigned char n)
{
	while(--n)
	{
		DelayUs2x(245);
		DelayUs2x(245);
	}
}

//这种延时方式可以做不是特别精确的延时,原因主要在于while(--n)在编译成机器指令后的不确定性
//(基本指令是确定的,但是涉及到编译器差异,其他中断影响等因素),
//还有函数调用过程中的其他处理,导致了指令数的相对不确定。 
#endif

Move.h

#ifndef __MOVE_H__
#define __MOVE_H__

#include "Delay.h"

void R_move()  //LED灯向右移动
{
	unsigned char i, w;
	for(i=0, w=0x01; i<8; i++ )
	{
		P1 = ~w;  //取反是11111110,第一个灯先亮
		w <<= 1;  //11111110中的0向左移动,自动补1
		DelayMs(1000);
	}
}

void L_move()  //LED灯向左移动
{
	unsigned char i, w;
	for(i=0, w=0x80; i<8; i++ )
	{
		P1 = ~w;  //取反是01111111,最后一个灯先亮
		w >>= 1;
		DelayMs(1000);
	}
}

void M_move()  //向两边移动
{
	P1 = 0x7e;   //01111110
	DelayMs(1000);
	P1 = 0xbd;   //10111101
	DelayMs(1000);
	P1 = 0xdb;   //11011011
	DelayMs(1000);
	P1 = 0xe7;   //11100111
	DelayMs(1000);
}

#endif

 led.c

#include <Move.h>   

void main()
{
	/*P1 = 0;
	DelayMs(5000);
	*/
	unsigned char t = 5;
	while(t)
	{
		P1 = 0;
		DelayMs(1000);  //使LED灯常亮一段时间
		t--;
	}

	L_move();
	R_move();
	M_move();
}

猜你喜欢

转载自blog.csdn.net/wsqfly06/article/details/81149022