1. 程式人生 > >基於51微控制器的led燈控制小實驗

基於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();
}