51单片机光敏电阻调节led亮度
时间: 2024-02-04 19:07:39 浏览: 304
根据提供的引用内容,可以得知51单片机光敏电阻调节LED亮度的具体实现方法如下:
1. 首先需要连接STC89C52单片机电路、光照检测电路(光敏电阻)、AD0832转换电路、4位高亮LED灯电路、按键电路和电源电路。
2. 系统具有自动模式和手动模式,按模式键可以进行切换。在手动模式下,按加、减键可以手动调节台灯的亮度。
3. 在自动模式下,需要实时监测当前亮度,比预设值小,就点亮一个LED,再检测,再点亮,以此类推,直到达到预设亮度。
4. 在手动模式下,需要通过光敏电阻检测当前亮度,并将其转换为电压信号,然后通过AD0832转换电路将其转换为数字信号,最后通过单片机控制4位高亮LED灯电路的亮度。
代码实现如下:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1 = P1^0; // 定义LED1引脚
sbit led2 = P1^1; // 定义LED2引脚
sbit led3 = P1^2; // 定义LED3引脚
sbit led4 = P1^3; // 定义LED4引脚
sbit key1 = P3^0; // 定义按键1引脚
sbit key2 = P3^1; // 定义按键2引脚
sbit key3 = P3^2; // 定义按键3引脚
sbit key4 = P3^3; // 定义按键4引脚
sbit light = P2^0; // 定义光敏电阻引脚
uchar code led_table[] = { // 定义数码管显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
void delay(uint i) { // 延时函数
while(i--);
}
void display(uchar num) { // 数码管显示函数
P0 = led_table[num];
}
uchar read_AD0832(uchar channel) { // 读取AD0832转换电路函数
uchar i, dat = 0;
CS = 0;
CLK = 0;
DIN = 1;
delay(1);
CS = 1;
delay(1);
CS = 0;
delay(1);
DIN = 0;
delay(1);
CLK = 1;
delay(1);
CLK = 0;
delay(1);
DIN = 1;
delay(1);
CS = 1;
delay(1);
CS = 0;
delay(1);
DIN = 1;
delay(1);
CLK = 1;
delay(1);
CLK = 0;
delay(1);
DIN = channel;
delay(1);
for(i = 0; i < 8; i++) {
CLK = 1;
delay(1);
CLK = 0;
delay(1);
dat <<= 1;
dat |= DOUT;
}
CS = 1;
return dat;
}
void main() {
uchar mode = 0, light_value = 0, led_value = 0;
while(1) {
if(key1 == 0) { // 切换模式
delay(10);
if(key1 == 0) {
mode = !mode;
while(!key1);
}
}
if(key2 == 0 && mode == 0) { // 手动调节亮度
delay(10);
if(key2 == 0) {
led_value++;
if(led_value > 15) {
led_value = 0;
}
while(!key2);
}
}
if(mode == 0) { // 手动模式
display(led_value);
if(led_value == 0) {
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
} else if(led_value == 1) {
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
} else if(led_value == 2) {
led1 = 1;
led2 = 1;
led3 = 0;
led4 = 0;
} else if(led_value == 3) {
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 0;
} else {
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
}
} else { // 自动模式
light_value = read_AD0832(0); // 读取光敏电阻的值
if(light_value < 100) { // 如果亮度小于100,点亮LED1
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
} else if(light_value < 200) { // 如果亮度小于200,点亮LED1和LED2
led1 = 1;
led2 = 1;
led3 = 0;
led4 = 0;
} else if(light_value < 300) { // 如果亮度小于300,点亮LED1、LED2和LED3
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 0;
} else { // 如果亮度大于等于300,点亮LED1、LED2、LED3和LED4
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
}
}
}
}
```
阅读全文