电路图
5506光敏电阻光强增加电阻值减小
以上电路实测无光时电压1.5v 有光且较亮时电压2.7v。
转换程序和ADC0832程序如下
// ADC0832引脚定义
sbit ADC_CS = P1^2; // 片选信号
sbit ADC_CLK = P1^0; // 时钟信号
sbit ADC_DIO = P1^1; // 数据线
// 获取电压值 - 返回char,实际值需除以10
char getVoltage()
{
unsigned char adcValue = ADC0832_ReadByte(0); // 读取通道0的值
return (char)(adcValue * 50 / 255); // 转换为电压值(0-5.0V),乘以10表示小数点后一位
}
// 获取光照强度 - 将电压值转换为光照强度(0-100)
unsigned char getLightIntensity()
{
unsigned char voltage = getVoltage();
// 光照强度与电压成正比,但需要映射到合适的范围
// 无光时1.5V (15),有光且较亮时2.7V (27)
if(voltage < 15) // 低于最小值
return 0;
else if(voltage > 27) // 高于最大值
return 100;
else
// 将15-27的电压值映射到0-100的光照强度
return (voltage - 15) * 100 / 12;
}
/******************************************************************************/
// ADC0832相关函数
/******************************************************************************/
void Delay5us()
{
uchar i, j;
i = 2;
j = 2;
do
{
while (--j)
;
} while (--i);
}
unsigned char ADC0832_ReadByte(unsigned char channel)
{
unsigned char i, j, dat = 0;
ADC_CS = 0;
// 发送起始位
ADC_CLK = 0;
ADC_DIO = 1;
Delay5us();
ADC_CLK = 1;
Delay5us();
// 发送通道选择位
ADC_CLK = 0;
ADC_DIO = 1; // 通道选择位SGL/DIF=1,表示单端输入
Delay5us();
ADC_CLK = 1;
Delay5us();
ADC_CLK = 0;
ADC_DIO = channel; // 通道选择位ODD/SIGN=0或1,0表示CH0,1表示CH1
Delay5us();
ADC_CLK = 1;
Delay5us();
ADC_CLK = 0;
ADC_DIO = 1; // 释放总线
// 读取数据
for(i = 0; i < 8; i++)
{
ADC_CLK = 1;
Delay5us();
ADC_CLK = 0;
Delay5us();
j = ADC_DIO;
dat = (dat << 1) | j;
}
ADC_CS = 1;
return dat;
}