該小實驗是爲了更好的理解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();
}