传感器使用一个LM358运放和光敏电阻组成。运放接两个电位器。可以调节感应程度的。两个运放的输出端接到单片机除P0口的任意口线。在程序中检测运放的输出状态。有光的时候,两个运放都是输出为高电平。这时候,单片机继续等待。光线强度下降的时候,其中一个运放就会输出低电平了。这时,单片机检测到后就会打开其中一个灯。当光线强度继续下降,这时,两个运放就会都输出低电平。这时,单片机检测到都为低电平的时候,打开两个灯就可以啦。到了快天亮的时候,光线强度上升。这时候,其中一个运放又会输出高电平,单片机就会关闭其中一个灯了。天完全亮后,关闭所有的灯。
硬件连接:P1.0口接第一个运放的输出端。P1.1口接第二个运放的输出端。P2.0口接第一个控制继电器的三极管,P2.1口接第二个控制继电器的三极管。输出为低电平有效。
实现功能:白天的时候,继电器都释放。光线下降后,其中一个继电器吸合。光线很弱的时候,两个继电器都吸合。循环。
偶使用了最笨的法子,蹲点守候!嘿嘿嘿 程序中引入延时判断,防止误触发。
org 0
ajmp start
org 30h
start:mov a,p1
cjne a,#0feh,next
lcall dely
mov a,p1
cjne a,#0feh,next
clr p2.0
ajmp start
next: cjne a,#0fch,next1
lcall dely
mov a,p1
cjne a,#0fch,next1
clr p2.0
clr p2.1
ajmp start
next1:cjne a,#0ffh,start
lcall dely
mov a,p1
cjne a,#0ffh,start
setb p2.0
setb p2.1
ajmp start
dely: mov r7,#100
dl1: mov r6,#100
dl2: mov r5,#50
djnz r5,$
djnz r6,dl2
djnz r7,dl1
ret
end
程序不好用就找偶!
ORG0000HL0000: LJMP MIN00主程序
/ *** *** *** *** / 初始化 PWM
PCA00: MOV CMOD, #82H(fSYS/2)
MOV CCON, #00H
MOV CL, #00H
MOV CH, #00H
MOV CCAPM0, #00H PWM0 输出
MOV PCA_PWM0, #00H
SETBCR开 PWM
RET
/ *** *** *** *** / 主程序
P1M0EQU 91H
P1M1EQU 92H
P3M0EQU 0B1H
P3M1EQU 0B2H
ADC_CONTR EQU 0C5H A/D 转换寄存器
ADC_DATAEQU 0C6H A/D 结果寄存器
MIN00: MOV P1M0, #08H 设置 P1.3 为高阻状态
MOV P1M1, #08H
MOV ADC_CONTR, #0E3H 开A/D 转换电源 P1.3
LCALL PCA00初始化 PWM
MIN10: NOP 主程序 入口
LCALL ADC00测光敏电阻电压
MOV CCAP0H, A写入PWM 控制 发光亮度
LJMPMIN10
RET
/ *** *** *** *** / A/D 转换通道 测电压
ADC00: MOV ADC_DATA, #00H
ORL ADC_CONTR, #08H 启动 AD 转换
MOV A, #10H 判断 AD 转换是否完成
ANL A, ADC_CONTR
JZ ADC32 AD 转换尚未完成, 继续等待
ANL ADC_CONTR, #0E7H 清0 ADC_FLAG, ADC_START 位, 停止A/D 转换
MOV A, ADC_DATA A = AD 转换结果
RET
END
如上图所示:
1、在有光照的情况下,光敏电阻的阻值大概只有几Ω~几十Ω,三极管Q1的基极是低电压,三极管Q1不能导通,所以,PNP三极管Q的基极是高电压,也不能导通,所以此时,LED不会发光。
2、在无光照的情况下,光敏电阻的阻值会达到MΩ以上,三极管Q1的基极是高电压,三极管Q1导通,所以,PNP三极管Q的基极就会是低电压,Q也能导通,所以此时,LED会发光。
希望能帮到你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)