基於51微控制器的led燈控制小實驗
阿新 • • 發佈:2019-01-04
該小實驗是為了更好的理解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(); }