2020单片机V2.0-试题1 LED亮度切换(PWM调光)

实现 5 种 亮度等级 L ED 灯的切换 (必须用到定时器,不然不给分
利用 两个独立按键控制 L ED 灯的亮暗程度,一个按键按下变亮 一个等级 ,一
个按键按下变暗 一个等级 。 亮暗等级从完全熄灭(最暗)到完全点亮(最亮) 5
等分。

参考资料:
灯的亮度调节,利用视觉暂留效应

/************************************************

                        LED 亮 度 切 换(例程)

************************************************/

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit LED = P2 ^6;
sbit Key1 = P2 ^3;
sbit Key2 = P2 ^4;

uchar brightness, count;

void init();
void delay(uint z);  // 延时(ms)
void Key_scan();  // 按键扫描
void light();  //发送脉冲

void time0() interrupt 1
{
        TH0 = (65536 - 2000) / 256; //2ms
        TL0 = (65536 - 2000) % 256;
        count++;
        light();
        count = count % 10;  //10ms为一个信号周期
}

void light() {
    if (count <= brightness)  //亮度与周期内LED发光时间成正比,当发光时间不足时,继续发光
        LED = 0;
    else
        LED = 1;
}

void main() {
    while (1)
        Key_scan();
}

/* 初始化 */
void init(){
        TMOD = 0x01; //16位定时器0
    TH0 = (65536 - 2000) / 256; //2ms
    TL0 = (65536 - 2000) % 256;
    TR0 = 1;  //开启定时器0
    ET0 = 1;  //开启定时器0中断
    EA = 1;     //开总中断开关
    brightness = 1;  //初始亮度1档
}

/* 按键扫描 */
void Key_scan() {
    if (!Key1) {
        delay(5);
        if (!Key1)
            if (brightness < 5)
                brightness++;
        while (!Key1);  //松手检测
    }
    if (!Key2) {
        delay(5);
        if (!Key2)
            if (brightness > 1)
                brightness--;
        while (!Key2);
    }
}

/* 延时(ms) */
void delay(uint z) {
    uint x, y;
    for (x = z; x > 0; x--)
        for (y = 110; y > 0; y--);
}

暂无评论

相关推荐

微信扫一扫,分享到朋友圈

2020单片机V2.0-试题1 LED亮度切换(PWM调光)