51单片机实现光敏电阻控制LED灯亮灭代码
时间: 2024-09-24 08:30:54 浏览: 171
在51单片机中,利用光敏电阻(Light-dependent Resistor, LDR)控制LED灯的亮灭通常涉及到模拟信号处理。这里是一个基本的示例,假设我们使用ATmega8/8515等单片机,配合LDR和LED:
```c
#include <reg52.h> // 包含51单片机头文件
// 定义LDR和LED引脚
#define LDR_PIN P0_0
#define LED_PIN P0_1
void setup() {
TRISB = 0x00; // 设置PB口所有引脚为输入模式(P0_0 LDR, P0_1 LED)
DDRB = 0xFF; // 将PB口设置为输出模式
}
void loop() {
int ldrValue = analogRead(LDR_PIN); // 读取LDR的模拟值,范围0-1023
if (ldrValue > 500) { // 当光线暗时,LDR值较高,LED亮
PORTB = 0b00000001; // 输出低电平点亮LED
} else { // 光线亮时,LDR值较低,LED灭
PORTB = 0b00000000; // 输出高电平关闭LED
}
}
相关问题
51单片机光敏电阻调节led亮度
根据提供的引用内容,可以得知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;
}
}
}
}
```
stc89c52单片机光敏电阻控制led灯
STC89C52是一款常用的51系列单片机,它主要用于嵌入式系统设计。如果要用这种单片机控制LED灯,并通过光敏电阻作为传感器,你可以按照以下步骤进行:
1. **硬件连接**:
- 将光敏电阻连接到单片机的输入引脚,通常选择模拟输入端口如A0或A1,因为光敏电阻的变化会生成线性的电压变化。
- LED灯的一端接Vcc(电源正),另一端接到单片机的数字输出引脚,比如PB0,通过外部上拉或下拉电阻进行驱动。
2. **软件编程**:
- 使用汇编语言或C语言编写程序,在C51中,可以使用`ANSEL`寄存器设置模拟输入引脚的模式为输入。
- 编写一段读取光敏电阻值的函数,这通常涉及到ADC(模数转换器)的使用。例如,`ADCCON`寄存器配置好后,用定时器溢出中断来触发ADC转换,然后读取结果。
- 根据光敏电阻值判断LED亮度,一般可以根据电阻的电压降计算出光照强度,然后调整对应的PWM(脉冲宽度调制)信号来控制LED灯的亮度。如果支持,可以使用单片机的PWM模块,如定时器T1或T2的模式1。
3. **控制流程**:
- 当光敏电阻值增加时,LED亮度减小;当光敏电阻值降低时,LED亮度增加。
- 可能还需要加入一个阈值比较,当光强低于某个值时LED全关,高于另一个值时全亮。
阅读全文