概述
詳細
一、光敏傳感器
光敏傳感器是利用光敏元件將光信號轉換為電信號的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限於對光的探測,它還可以作為探測元件組成其他傳感器,對許多非電量進行檢測,只要將這些非電量轉換為光信號的變化即可。光敏傳感器中最簡單的電子器件是光敏電阻,它能感應光線的明暗變化,輸出微弱的電信號,通過簡單電子線路放大處理,可以控制LED燈具的自動開關。
模塊使用說明
-
光敏電阻模塊對環境光線最敏感,一般用來檢測周圍環境的光線的亮度,觸發單片機或繼電器模塊等;
-
模塊在環境光線亮度達不到設定閾值時,DO 端輸出高電平,當外界環境光線亮度超過設定閾值時,DO端輸出低電平;
-
DO 輸出端可以與單片機直接相連,通過單片機來檢測高低電平,由此來檢測環境的光線亮度改變;
-
小板模擬量輸出 AO 可以和 AD 模塊相連,通過 AD 轉換,可以獲得環境光強更精准的數值.
二、C51單片機串口顯示光照強度
光敏傳感器的AO引腳輸出的是模擬信號,而51單片機內部沒有AD/DA轉換器,不能接收模擬信號,只能接收到數字信號,所以我們需要一個能夠進行AD/DA轉換的模塊,這里我選擇了PCF8591模塊來進行AD轉換。
PCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591 具有 4 個模擬輸入、1 個模擬輸出和 1個串行 I2C 總線接口。PCF8591 的 3 個地址引腳 A0, A1 和 A2 可用於硬件地址編程,允許在同個 I2C 總線上接入8個PCF8591 器件,而無需額外的硬件。在 PCF8591 器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向 I2C 總線以串行的方式進行傳輸。(簡單的說:可以實現4路 模擬輸入,1路模擬輸出,具體功能看模塊使用說明)
硬件連接: 
PCF8591的使用會涉及到I2C總線,程序中也要加入對I2C的操作,Pcf8591SendByte()來選擇使用PCF8591 模塊的哪一路輸入(這里選擇AIN0)
void Pcf8591SendByte(uchar channel)
{
I2C_Start(); //開始I2C總線
I2C_SendByte(WRITEADDR); //發送寫器件地址
I2C_SendByte(0x40|channel); //發送控制寄存器
I2C_Stop();
}
uchar Pcf8591ReadByte() //讀取值
{
uchar num;
I2C_Start();
I2C_SendByte(READADDR); //發送讀器件地址
num=I2C_ReadByte(); //讀取數據
I2C_Stop(); //結束總線
return num;
}
void main()
{
uint adNum;
float value;
UsartInit();
while(1)
{
Pcf8591SendByte(0); //使用通道0 (可選擇通道0-3)光敏傳感器A0連接PCF8591傳感器的AIN0
/*adNum一定是0到255之間的一個數,因為pcf8591是8位的AD/DA芯片,所以輸出的范圍為00000000
到11111111,即0到255*/
adNum=Pcf8591ReadByte(); //讀出數值
value = adNum;
value=100.0 - value*100.0/255.0; //把光敏值轉換為0-100的數值,這里255.0可更改
//(根據實際測試value最暗值)
printf("light:");
printf("%.2f\n",value); //打印數據到串口
delay1s();
}
}
打開串口調試助手,獲取光照強度值:

三、Arduino串口顯示光照強度
Arduino內部有AD/DA轉換器,所以接收模擬信號會變得非常容易操作。
硬件連接: 
代碼如下:
#define light A5 //定義模擬口A5
float Intensity = 0;//光照度數值
void setup() //初始化
{
Serial.begin(9600);//設置波特率9600
}
void loop()//程序主體循環
{
Intensity = analogRead(light); //讀取模擬口AD5的值,存入Intensity變量
//Intensity = 100.0 - Intensity / 6.7;//VCC接3.3V時,Intensity最高為670,最低為0
Intensity = 100.0 - Intensity / 10.23;//VCC接5V時,Intensity最高為1023,最低為0
Serial.print("Intensity = "); //串口輸出"Intensity = "
Serial.print(Intensity); //串口輸出Intensity變量的值
Serial.print("%\n");
delay(1000); //延時1s
}
串口讀取到的光照強度值如下圖:

四、總結
本文實現51單片機和Arduino串口顯示光照強度,介紹了光敏傳感器和PCF8591 AD/DA轉換模塊的使用方法,如果你對模擬信號和數字信號還不怎么了解,我建議你先去學下。學完了這個,建議去讀取其他傳感器的模擬信號,具體實現方法是一樣的。
五、項目結構圖

