51单片机实现光敏电阻控制LED灯亮灭代码
时间: 2024-09-24 11:30:54 浏览: 100
在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;
}
}
}
}
```
51单片机PCF8591光敏电阻调灯亮度代码并告诉我ad数据的数字范围
以下是一个基于51单片机和PCF8591的光敏电阻调灯亮度的代码示例:
```C
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1; //IIC时钟引脚
sbit SDA=P2^0; //IIC数据引脚
sbit Led=P1^0; //LED灯引脚
void delay(uint x) //延时函数
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
void Start() //IIC起始信号
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void Stop() //IIC停止信号
{
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
}
void Write(uchar dat) //IIC写数据
{
uchar i;
for(i=0;i<8;i++)
{
SDA=dat&0x80;
dat<<=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
}
uchar Read() //IIC读数据
{
uchar i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
dat<<=1;
dat|=SDA;
SCL=0;
}
return dat;
}
void main()
{
uchar ad_dat;
Start();
Write(0x90); //发送写命令,选择PCF8591设备
Write(0x40); //选择通道0
while(1)
{
Write(0x00); //发送转换命令
delay(5); //延时等待转换完成
Start();
Write(0x91); //发送读命令,选择PCF8591设备
ad_dat=Read(); //读取AD转换数据
Stop();
Led=ad_dat>128?0:1; //根据AD转换数据控制LED灯亮度
}
}
```
该代码使用了51单片机和PCF8591的I2C通信协议,通过读取PCF8591的AD转换数据来调节LED灯的亮度。其中,PCF8591的A/D转换器可以将模拟量转换成数字量,转换后的数字范围是0~255(8位分辨率),因此AD转换数据的数字范围也是0~255。