求一单片机程序(用光敏电阻,PWM输出控制LED亮度)

下图是单片机电路和LED驱动电路,

这里P20错了,应该是接P3.7/PWM0接口,可以无视了,我是初学,求程序,汇编或者C都可以,谢谢了

ORG 0000H
L0000: 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
SETB CR ; 开 PWM
RET
; / *** *** *** *** / 主程序
P1M0 EQU 91H
P1M1 EQU 92H
P3M0 EQU 0B1H
P3M1 EQU 0B2H
ADC_CONTR EQU 0C5H ; A/D 转换寄存器
ADC_DATA EQU 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 控制 发光亮度
LJMP MIN10
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追问

请问ADC00 里面, JZ ADC32 这句语句是什么意思啊,就这里不懂啦,帮我帮到底吧,谢谢啦

追答

等待可以这样
JZ $

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-18
电源的5V那你不要接在地线上面了啦。呵呵 电都通不上,程序也很简单的嘛。单片机采集光敏电阻节点上的电压,根据这个电压输出一定的占空比的PWM。
A/D:
ORG 0000H
LJMP MAIN
;-----------------------------------------
ORG 0100H
MAIN:
LCALL INIT_UART ;Init UART, use to show ADC result
LCALL INIT_ADC ;Init ADC sfr
;-------------------------------
NEXT:
MOV A,#0
LCALL SHOW_RESULT ;Show channel0 result
MOV A,#1
LCALL SHOW_RESULT ;Show channel1 result
MOV A,#2
LCALL SHOW_RESULT ;Show channel2 result
MOV A,#3
LCALL SHOW_RESULT ;Show channel3 result
MOV A,#4
LCALL SHOW_RESULT ;Show channel4 result
MOV A,#5
LCALL SHOW_RESULT ;Show channel5 result
MOV A,#6
LCALL SHOW_RESULT ;Show channel6 result
MOV A,#7
LCALL SHOW_RESULT ;Show channel7 result

SJMP NEXT
;/*----------------------------
;Send ADC result to UART
;Input: ACC (ADC channel NO.)
;Output:-
;----------------------------*/
SHOW_RESULT:
LCALL SEND_DATA ;Show Channel NO.
LCALL GET_ADC_RESULT ;Get high 8-bit ADC result
LCALL SEND_DATA ;Show result

;//if you want show 10-bit result, uncomment next 2 lines
; MOV A,ADC_LOW2 ;Get low 2-bit ADC result
; LCALL SEND_DATA ;Show result
RET

;/*----------------------------
;Read ADC conversion result
;Input: ACC (ADC channel NO.)
;Output:ACC (ADC result)
;----------------------------*/
GET_ADC_RESULT:
ORL A,#ADC_POWER | ADC_SPEEDLL | ADC_START
MOV ADC_CONTR,A ;Start A/D conversion
NOP ;Must wait before inquiry
NOP
NOP
NOP
WAIT:
MOV A,ADC_CONTR ;Wait complete flag
JNB ACC.4,WAIT ;ADC_FLAG(ADC_CONTR.4)
ANL ADC_CONTR,#NOT ADC_FLAG ;Clear ADC_FLAG
MOV A,ADC_RES ;Return ADC result
RET

;/*----------------------------
;Initial ADC sfr
;----------------------------*/
INIT_ADC:
MOV A,#0FFH
MOV P1,A
MOV P1M0,A
MOV P1M1,A ;Set all P1 as Open-Drain mode
MOV ADC_RES,#0 ;Clear previous result
MOV ADC_CONTR,#ADC_POWER | ADC_SPEEDLL
MOV A,#2 ;ADC power-on and delay
LCALL DELAY
RET

;/*----------------------------
;Initial UART
;----------------------------*/
INIT_UART:
MOV SCON,#5AH ;8 bit data ,no parity bit
MOV TMOD,#20H ;T1 as 8-bit auto reload
MOV A,#-5 ;Set Uart baudrate -(18432000/12/32/9600)
MOV TH1,A ;Set T1 reload value
MOV TL1,A
SETB TR1 ;T1 start running
RET

;/*----------------------------
;Send one byte data to PC
;Input: ACC (UART data)
;Output:-
;----------------------------*/
SEND_DATA:
JNB TI,$ ;Wait for the previous data is sent
CLR TI ;Clear TI flag
MOV SBUF,A ;Send current data
RET

;/*----------------------------
;Software delay function
;----------------------------*/
DELAY:
MOV R2,A
CLR A
MOV R0,A
MOV R1,A
DELAY1:
DJNZ R0,DELAY1
DJNZ R1,DELAY1
DJNZ R2,DELAY1
RET

END
////////////////////////////////
A/D转换的模板如上,PWM比较简单,你自己看资料配置一下寄存器就可以了,追问

刚才手滑了,想点追问却点到采纳了楼上的,今天快断网了,明天能把PWM的部分也说以下吗,顺便把分给你,谢谢了

追答

你要看新片资料嘛,没有PWM口也可以做一个模拟,让P3.7输出的波形频率高就是电压高,反之就低(LED就暗)
比如:
LEDPWM:
SETB P3.7;点亮了LED
Call DELAY4 ; 延时,这个时间就决定LED的亮度
CLR P3.7
Call DELAY 4
....
JUP LEDPWM
DELAY4:
MOV R2,A;(这个A可以是采集的到的相关数据,也可以设定一个数字,比如 100)
MOV R0,A
MOV R1,A
DELAY10:
DJNZ R0,DELAY10
DJNZ R1,DELAY10
DJNZ R2,DELAY10
RET

第2个回答  2013-04-18
你用的是哪种型号的单片机本回答被提问者采纳

求一单片机程序(用光敏电阻,PWM输出控制LED亮度)
L0000: 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 SETB CR ; 开 PWM ...

如何通过光敏感受信号再利用单片机PWM控制灯的亮度(强光下灯是灭的...
光敏电阻的输出应该先经过AD转换成数据给单片机处理,根据您的回答,89C51应该是没有这个转换口的,须用其他芯片完成AD功能。89C51貌似不包含直接控制PWM的功能,据我所知,有这个功能的单片机有STC89C56

单片机根据环境光照强度自动控制调节LED灯亮度
补充871的回答,其实是这么回事,使用AD转换芯片检测光敏电阻的阻值,使用单片机将电压转换为阻值,而阻值对应于光照强度。这样,最终就可以获得光照强度,利用光照强度去控制LED灯的亮度即可。当然,这种方法精度不高。AD转换芯片最常用的是ADC0809。 本回答由提问者推荐 举报| 答案纠错 | 评论 1 1 senall 采纳率:51% ...

急求 路灯 的单片机控制系统设计!!!
然后,我们需要编写单片机的程序。程序部分主要包括初始化设置、功能实现和故障检测等。初始化设置包括设置IO口的输入输出方向、中断设置等。功能实现包括根据外部信号控制路灯的开关和亮度调节,可以使用PWM技术实现亮度调节。故障检测可以通过检测电源电压、光敏电阻等来判断是否存在故障,并通过程序进行相应的处理...

五一单片机控制12864液晶背光的问题。
这样可以通过PWM来控制背光亮度(相当于能让单片机输出模拟信号,而不再只有高低两种电平)编程如下(在利用光敏电阻判断是否到晚上了,主程序就自己编吧):sbit LED = P1 ^ 4; \/\/液晶屏背光定义(PWM控制,不能更改)\/ 函数名:PWM初始化函数(控制背光亮度)调 用:PWM_init();参 数:无...

光敏器件触发单片机控制直流电机
光敏电阻会根据光线的强弱改变阻值,所以把它和一个电阻串联分压后接入电源,然后通过AD检测光敏电阻两端电压即可。直流电机控制电路一般用的是H桥,如果电机的功率不大,电流不超过500ma的话可以直接用8050和8550搭建一个H桥驱动即可 电流小于3A可以使用l298N(l298N的原理图我这没有,你自己百度搜把),...

51单片机做个led路灯照明,求1W led驱动电路
先说简易方案,用三极管与功率电阻组合用单片机控制这是简易方案。然后说明其中作用,三极管选用9013,作用是放大,他的几级串电阻接单片机。他的发射极串x欧姆电阻接地,他的集电极串接led和电阻。其中集电极电阻r和发射极电阻x欧需功率电阻,大小为1W的功率电阻。集电极供电电源是由7808稳压器,若改为7805...

怎样使LED灯随光的强弱变化亮度
简单点的,可以采用恒流使LED发光,而恒定电流的大小由光敏器件感受光的强弱来改变,但这种方法可能会改变LED输出光的颜色。复杂的,可以采用单片机输出PWM使LED发光,光敏器件输出电压信号由单片机AD转换成数值,再根据这个数值改变PWM的占空比达到改变LED亮度,这个不改变颜色但是要编程复杂多了。具体采用什么...

我在做AD转换控制pwm的设计,硬件已经做出来了,但调试出来的PWM很不稳定...
4. 。。。做程序有以下建议:1.首先确认外围光敏电阻部分电路正常 2.明确PWM控制灯亮的效果与PWM取值的关系,正确设置PWM频率占空比等 3.AD要设置正确,从AD取到正确的数据(可以多读AD几次取平均值,比如,读6次,丢掉最大最小的2个数据再取剩余4个的平均值)4.建立AD数值与PWM赋值的关系 ...

简易太阳能白天充电,晚上灯亮线路图?
10.2、当A\/DC1转换后的数字值小于某1个临界值时,单片机会输出一数字信号c,该信号打开电源控制电路,使电池的电能流人驱动电路中。同时,输出PWM的信号以点亮LED灯。A\/Dc1转换后的数字值越小,单片机输出PWM的脉波宽度越宽。11、检测电路检测电路如图4所示。光敏电阻(Cds)与人体红外线传感器(GDS),分别检测车辆灯光与...

相似回答