光センサーは光の強さにより、抵抗値が変わる物質(cds)を利用しています。光が殆どないときは、数十Kオームの高抵抗ですが、、室内照明程度の明るさで、数Kオームまで抵抗が低下します。


このcdsの抵抗変化を電圧として取り出し、PICのAD変換機能を利用すると、光センサーからの電圧により、出力の制御を行うことができます。
図で楕円で囲まれた抵抗の記号がCDS光センサです。CDSの面への明るさが変わると、図の出力端子の電圧が変化します。

setup_adc_ports(AN0);//A0端子をアナログ入力AN0として利用する setup_adc(ADC_clock_div_32);//クロックは内部クロックの1/3216F873は6本のアナログ信号端子があります。まず、まず set_adc_channel(0) で読み込む端子(チャンネル)を指定し、少し時間を置いてから read_adc() で変換値を読み込みます。読み込む値は10bitですから、変数は long 型で宣言します。
long vd;//16ビット整数 set_adc_channel(0);//0チャンネルを選択 delay_us(30);//変換時間待つ vd=read_adc();//変換結果を読む
setup_adc_ports(AN0); setup_adc(ADC_clock_div_32); set_adc_channel(0);コンパイルで、AN0がエラーになる場合、
//A0(2ピン)にCDSの電圧を接続する
//Cポートの下位4ビットにLEDを接続する
//cds の明るさの変化を15段階にしてポートCのLEDで表示する
#include <16F873.h>
#device ADC=10
#fuses HS,NOWDT,NOLVP,NOPROTECT,NOBROWNOUT
#use delay(clock = 20000000)
long vd0,df;
int ct,sw,dv;
long vmax0,vmin0,vsum0;
void main(){
setup_adc_ports(AN0);
setup_adc(ADC_clock_div_32);
ct=0;
vsum0=0;
vmax0=0;vmin0=10000;
while(1){
set_adc_channel(0);
delay_us(10);
vd0=read_adc();
if(vmax0 < vd0) vmax0=vd0;//最大の更新
if(vmin0 > vd0) vmin0=vd0;//最小の更新
vsum0 += vd0;
if (ct==10) {
output_toggle(PIN_B0);
vsum0=vsum0/10;//平均
df=(vmax0-vmin0)/15;//最大と最小の間を15レベルにする
dv=(vsum0-vmin0)/df;
if(dv>15) dv=15;//15を超えたときは15にする
ct=0;
output_c(dv);
}
//delay_us(10);
ct++;
delay_ms(100);
}
}
電源から20KΩでCDS に接続しCDSの他の端子をグランドに接続します(図では4.7kですが変更、A1に接続するスイッチは不要)。ポートC(下位4ビット)にはLEDを接続します。

プログラムをコンパイルし、MicroCodeLoader 経由でPICに書き込み実行してください。PICにはシリアル接続が必要です。
プログラムを書き込んだら、cds の面を指でふさいで、明るさを変化させます。このとき、LEDの表示が変化することを確認してください。