基于51单片机的led灯控制小实验

该小实验是为了更好的理解51单片机的使用,其完成的要求如下:

1.第一个键控制两个灯的翻转;

2.第二个键控制一个灯的翻转;

3.第三个键接在51单片机的外部中断口,每检测到一次,翻转三下;

4.第四个键控制灯的亮度,使灯的亮度从低加到高。


说明:

(1).此实验使用的开发板,led灯是共阳极的,所以当51单片机输出低电平时,led灯会亮;

(2).要求4是用定时器来实现的,改变定时器重装的初值来改变高低电平的占空比,从而改变输出电压的有效值;

(3).在测试要求4时,可以用万用表测量其用效值,会发现其有效值是随着按键变小的,从而led灯的两边压差变大,会变得更亮。

其代码如下:

#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char

sbit key_0=P2^0;	//控制两个led灯
sbit key_1=P2^1;	//控制一个led灯
sbit key_2=P3^2;	//控制灯闪烁
sbit key_3=P2^2;	//调节灯亮度


sbit led_0=P1^0;     //0号led灯
sbit led_1=P1^1;     //1号led灯
sbit led_2=P1^2;     //2号led灯
sbit led_3=P1^3;     //3号led灯

uint pwm=1024;			//定义PWM波初值 
uint flag=0;            //高低电平标志位

void delay(uint z)    //延时函数
{
   	  uint i,j;
	  for(i=z;i>0;i--)
	   for(j=110;j>0;j--);
}

void fanzhuan_double()		//两个led灯翻转
{  
     led_0=~led_0;
	 led_1=~led_1;
}

void fanzhuan_single()	   //单个led灯翻转
{
    led_0=~led_0; 
}

void shanshuo()		       //灯的闪烁
{
     uint i;
	 for(i=0;i<6;i++)
	 {
	      led_2=~led_2;
		  delay(500);
	 }
}
void key_scan()		 //按键检测
{
     
       if(key_0==0)
	   {
	     delay(5);
		 if(key_0==0)
	   {
	       fanzhuan_double();
		   while(1)
		   {
		      if(key_0==1)
			  {
			     break;
			  }
		   }
		 }
	   }


	   if(key_1==0)
	   {
	      delay(5);
		  if(key_1==0)
		  {
	       fanzhuan_single();
		      while(1)
		   {
		      if(key_1==1)
			  {
			     break;
			  }
		   }
		  }
	   }  
	   
}

void time_int0_init()	  //定时器,外部中断初始化
{
       TMOD=0x01;				//选择定时器0,模式为1
	   TH0=(65536-pwm)/256;		//将初值装入高8位
	   TL0=(65536-pwm)%256;		//将初值装入低8位
	   EA=1;				    //开总中断	   			
	   ET0=1;	                //开定时器0中断
	   EX0=1;					//开外部中断0
	   IT0=1;
	   TR0=1;

}
						 

void main()
{
     time_int0_init();
	 while(1)
	 {
	   key_scan();
	 }
} 


void time() interrupt 1				//定时器0中断服务函数
{
   if(key_3==0)
	   { 
			 delay(5);
			if(key_3==0)          //每点下一次改变定时器的初值,即改变占空比。
		  {

			 pwm=pwm+512;
			 if(pwm>65535)
			 {
			     pwm=1024;
			 }
			   while(1)
		   {
		      if(key_3==1)
			  {
			     break;
			  }
		   }
		  }
	   }	   
 if(flag==0)
{
TH0=pwm/256;
TL0=pwm%256;
  led_3=1;
  flag=1;
}
if(flag==1)
{
  TH0=(65536-pwm)/256;
  TL0=(65536-pwm)%256;
  led_3=0;
  flag=0;
}

}

void rise_down() interrupt 0	   //外部中断服务函数
{ 
    	   shanshuo();
}

猜你喜欢

转载自blog.csdn.net/qq_40598185/article/details/80308163