该小实验是为了更好的理解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();
}