各位單片機(jī)高手:請教一個(gè)單片機(jī)控制發(fā)光二極管亮度的問題
我現(xiàn)在所用的芯片是AT89C2051芯片,發(fā)光二極管接在芯片的p1口,P1.0未接,共七個(gè)發(fā)光二極管,我想通過軟件控制二極管的亮度漸變,不知道有沒有辦法實(shí)現(xiàn),怎么樣實(shí)現(xiàn)???
我找過很多關(guān)于PWM的調(diào)節(jié),據(jù)說這個(gè)PWM能夠?qū)崿F(xiàn)我想要的,但本人不懂PWM的原理,所以也未能實(shí)現(xiàn),請各們大哥多多指教!!
請教一個(gè)單片機(jī)控制發(fā)光二極管亮度的問題??
全部回復(fù)(15)
正序查看
倒序查看
@gnlee
對于你來講pwm調(diào)節(jié)就是調(diào)節(jié)再一個(gè)周期內(nèi)led亮和滅的時(shí)間比
您好!我也剛學(xué)單片機(jī),這是我用HT的單片機(jī)做的一個(gè)控制LED亮度的程序,由于我目前沒有條件搭線,所以想請高手幫忙指點(diǎn)一下.
看看小弟還有那些不足的地方.呵呵我還是個(gè)學(xué)生呢.
#include ht46r47.inc
;Pb2控制占空比
;Pc1,Pc2輸出PWM
;Pb1選擇Pc1或Pc2
data.section 'data'
t0 db ?;The cycle of PWM pulse
t10 db ?;Open time
aaa db ?;Open time control
bbb db ?;Close time control
sov db ?;Open time end
bov db ?;close time end
code.section 'code'
org 00h
clr pbc
mov a,02h
mov pbc,a
jmp start
org 08h
jmp pwm
;+++++++++++++++++++++++++++++++++++++++++++++++
start:
mov a,3 ;cycle of PWM pulse
mov t0,a
mov aaa,a
mov a,1
set sov
clr bbb
clr t10
;+++++++++++++++++++++++++++++++++++++++++++++
main:
mov a,05h
mov intc,a
mov a,84h
mov tmrc,a;fsys=32768Hz,rtc,t0=fsys/32=0.5ms
mov a,0feh;The clock base this time
mov tmr,a
set tmrc.4
jmp $
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
sz pb.1 ;判斷鍵是否按下
jmp loop
call chou
loop:
sz sov
jmp next1
sz bov
jmp next2
jmp loop
next1:
inc t10
mov a,aaa
sub a,t10
mov sov,a
sz sov
reti
sz bov
jmp $1
set sov
jmp loop
$1:
cpl pc
set bov
reti
next2:
inc t20
mov a,bbb
mov bov,a
sz bov
reti
sz sov
jmp $1
jmp loop
$1:
cpl pc
set sov
reti
;+++++++++++++++++++++++++++++++++++++++++++++++++
chou proc
sdz aaa
jmp $1
jmp start
$1:
mov a,t0
sub a,aaa
mov bbb,a
ret
chou endp
end
看看小弟還有那些不足的地方.呵呵我還是個(gè)學(xué)生呢.
#include ht46r47.inc
;Pb2控制占空比
;Pc1,Pc2輸出PWM
;Pb1選擇Pc1或Pc2
data.section 'data'
t0 db ?;The cycle of PWM pulse
t10 db ?;Open time
aaa db ?;Open time control
bbb db ?;Close time control
sov db ?;Open time end
bov db ?;close time end
code.section 'code'
org 00h
clr pbc
mov a,02h
mov pbc,a
jmp start
org 08h
jmp pwm
;+++++++++++++++++++++++++++++++++++++++++++++++
start:
mov a,3 ;cycle of PWM pulse
mov t0,a
mov aaa,a
mov a,1
set sov
clr bbb
clr t10
;+++++++++++++++++++++++++++++++++++++++++++++
main:
mov a,05h
mov intc,a
mov a,84h
mov tmrc,a;fsys=32768Hz,rtc,t0=fsys/32=0.5ms
mov a,0feh;The clock base this time
mov tmr,a
set tmrc.4
jmp $
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
sz pb.1 ;判斷鍵是否按下
jmp loop
call chou
loop:
sz sov
jmp next1
sz bov
jmp next2
jmp loop
next1:
inc t10
mov a,aaa
sub a,t10
mov sov,a
sz sov
reti
sz bov
jmp $1
set sov
jmp loop
$1:
cpl pc
set bov
reti
next2:
inc t20
mov a,bbb
mov bov,a
sz bov
reti
sz sov
jmp $1
jmp loop
$1:
cpl pc
set sov
reti
;+++++++++++++++++++++++++++++++++++++++++++++++++
chou proc
sdz aaa
jmp $1
jmp start
$1:
mov a,t0
sub a,aaa
mov bbb,a
ret
chou endp
end
0
回復(fù)
@dfstar
嘿嘿我做過一會(huì),原理就是跟了3樓的你一樣.控制一個(gè)周期內(nèi)LED亮和滅的時(shí)間比.
OUTE BIT P1.7 ;單片機(jī)引腳定義
SDAT BIT P1.6
STRB BIT P1.5
SCLK BIT P1.4
ORG 0000H
AJMP MAIN
ORG 0080H
MAIN:
;============================
;============================
MOV P1,#0FFH
REDSHOW: ; 紅色漸變
MOV R4,#80
ACALL COLOR1
ACALL LOOP0
ACALL COLOR1
ACALL LOOP2 ;將輸入數(shù)據(jù)送入鎖存器
DJNZ R4,$-8
ACALL START
ACALL LIGHTOUT
;============================
AJMP MAIN
START: ;計(jì)數(shù)器亮度控制函數(shù)
LCALL DELAY05S
CLR TF0
MOV R1,#LOW(65535-10000)
MOV R2,#HIGH(65535-10000)
MOV TL0,R1
MOV TH0,R2
MOV R3,#LOW(65535-1)
MOV R4,#HIGH(65535-1)
MOV TL1,R3
MOV TH1,R4
RET
LIGHTOUT: ;二極管亮度控制
LOOPREDB: ;;二極管由暗到暗明
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
CLR OUTE ;TIGER
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
SETB OUTE ;STOP
CLR C
MOV A,R1
ADD A,#4
MOV R1,A
MOV A,R2
ADDC A,#0
MOV R2,A
MOV TL0,R1
MOV TH0,R2
CLR C
MOV A,R3
SUBB A,#4
MOV R3,A
MOV A,R4
SUBB A,#0
MOV R4,A
MOV TL1,R3
MOV TH1,R4
CJNE R1,#0FFH,LOOPREDB
CJNE R2,#0FFH,LOOPREDB
CLR OUTE
LCALL DELAY2S
MOV TL0,R1
MOV TH0,R2
LOOPREDB1: ;;二極管由明到暗
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
CLR OUTE ;TIGER
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
SETB OUTE ;STOP
CLR C
MOV A,R1
SUBB A,#4
MOV R1,A
MOV A,R2
SUBB A,#0
MOV R2,A
MOV TL0,R1
MOV TH0,R2
CLR C
MOV A,R3
ADD A,#2
MOV R3,A
MOV A,R4
ADDC A,#0
MOV R4,A
MOV TL1,R3
MOV TH1,R4
CJNE R1,#0EFH,LOOPREDB1
CJNE R2,#0D8H,LOOPREDB1
SETB OUTE
RET
;======================================
COLOR0: ;不亮
ACALL LOOP0
ACALL LOOP0
ACALL LOOP0
RET
COLOR1: ;紅色
ACALL LOOP0
ACALL LOOP0
ACALL LOOP1
RET
COLOR2: ;綠色
ACALL LOOP0
ACALL LOOP1
ACALL LOOP0
RET
COLOR3: ;藍(lán)色
ACALL LOOP1
ACALL LOOP0
ACALL LOOP0
RET
COLOR4:
ACALL LOOP0
ACALL LOOP1
ACALL LOOP1
RET
COLOR5:
ACALL LOOP1
ACALL LOOP0
ACALL LOOP1
RET
COLOR6:
ACALL LOOP1
ACALL LOOP1
ACALL LOOP0
RET
COLOR7:
ACALL LOOP1
ACALL LOOP1
ACALL LOOP1
RET
;================================
LOOP0: ;輸入數(shù)據(jù)
CLR SDAT
CLR SCLK
SETB SCLK
RET
LOOP1:
SETB SDAT
CLR SCLK
SETB SCLK
RET
LOOP2:
CLR STRB
SETB STRB
RET
;==================================
delay:
mov r7,#10
mov r6,#10
mov r5,#10
djnz r5,$
djnz r6,$-2
djnz r7,$-4
ret
;==============================
DELAY05S:
MOV R5,#3 ;4
MOV R6,#250 ;230
MOV R7,#250
DJNZ R7,$
DJNZ R6,$-4
DJNZ R5,$-6
RET
DELAY1S:
MOV R5,#3 ;4
MOV R6,#250 ;230
MOV R7,#250
DJNZ R7,$
DJNZ R6,$-4
DJNZ R5,$-6
RET
;===================
DELAY2S:
MOV R5,#10 ;4
MOV R6,#250 ;230
MOV R7,#250
DJNZ R7,$
DJNZ R6,$-4
DJNZ R5,$-6
RET
;===================
END
;============================
SDAT BIT P1.6
STRB BIT P1.5
SCLK BIT P1.4
ORG 0000H
AJMP MAIN
ORG 0080H
MAIN:
;============================
;============================
MOV P1,#0FFH
REDSHOW: ; 紅色漸變
MOV R4,#80
ACALL COLOR1
ACALL LOOP0
ACALL COLOR1
ACALL LOOP2 ;將輸入數(shù)據(jù)送入鎖存器
DJNZ R4,$-8
ACALL START
ACALL LIGHTOUT
;============================
AJMP MAIN
START: ;計(jì)數(shù)器亮度控制函數(shù)
LCALL DELAY05S
CLR TF0
MOV R1,#LOW(65535-10000)
MOV R2,#HIGH(65535-10000)
MOV TL0,R1
MOV TH0,R2
MOV R3,#LOW(65535-1)
MOV R4,#HIGH(65535-1)
MOV TL1,R3
MOV TH1,R4
RET
LIGHTOUT: ;二極管亮度控制
LOOPREDB: ;;二極管由暗到暗明
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
CLR OUTE ;TIGER
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
SETB OUTE ;STOP
CLR C
MOV A,R1
ADD A,#4
MOV R1,A
MOV A,R2
ADDC A,#0
MOV R2,A
MOV TL0,R1
MOV TH0,R2
CLR C
MOV A,R3
SUBB A,#4
MOV R3,A
MOV A,R4
SUBB A,#0
MOV R4,A
MOV TL1,R3
MOV TH1,R4
CJNE R1,#0FFH,LOOPREDB
CJNE R2,#0FFH,LOOPREDB
CLR OUTE
LCALL DELAY2S
MOV TL0,R1
MOV TH0,R2
LOOPREDB1: ;;二極管由明到暗
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
CLR OUTE ;TIGER
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
SETB OUTE ;STOP
CLR C
MOV A,R1
SUBB A,#4
MOV R1,A
MOV A,R2
SUBB A,#0
MOV R2,A
MOV TL0,R1
MOV TH0,R2
CLR C
MOV A,R3
ADD A,#2
MOV R3,A
MOV A,R4
ADDC A,#0
MOV R4,A
MOV TL1,R3
MOV TH1,R4
CJNE R1,#0EFH,LOOPREDB1
CJNE R2,#0D8H,LOOPREDB1
SETB OUTE
RET
;======================================
COLOR0: ;不亮
ACALL LOOP0
ACALL LOOP0
ACALL LOOP0
RET
COLOR1: ;紅色
ACALL LOOP0
ACALL LOOP0
ACALL LOOP1
RET
COLOR2: ;綠色
ACALL LOOP0
ACALL LOOP1
ACALL LOOP0
RET
COLOR3: ;藍(lán)色
ACALL LOOP1
ACALL LOOP0
ACALL LOOP0
RET
COLOR4:
ACALL LOOP0
ACALL LOOP1
ACALL LOOP1
RET
COLOR5:
ACALL LOOP1
ACALL LOOP0
ACALL LOOP1
RET
COLOR6:
ACALL LOOP1
ACALL LOOP1
ACALL LOOP0
RET
COLOR7:
ACALL LOOP1
ACALL LOOP1
ACALL LOOP1
RET
;================================
LOOP0: ;輸入數(shù)據(jù)
CLR SDAT
CLR SCLK
SETB SCLK
RET
LOOP1:
SETB SDAT
CLR SCLK
SETB SCLK
RET
LOOP2:
CLR STRB
SETB STRB
RET
;==================================
delay:
mov r7,#10
mov r6,#10
mov r5,#10
djnz r5,$
djnz r6,$-2
djnz r7,$-4
ret
;==============================
DELAY05S:
MOV R5,#3 ;4
MOV R6,#250 ;230
MOV R7,#250
DJNZ R7,$
DJNZ R6,$-4
DJNZ R5,$-6
RET
DELAY1S:
MOV R5,#3 ;4
MOV R6,#250 ;230
MOV R7,#250
DJNZ R7,$
DJNZ R6,$-4
DJNZ R5,$-6
RET
;===================
DELAY2S:
MOV R5,#10 ;4
MOV R6,#250 ;230
MOV R7,#250
DJNZ R7,$
DJNZ R6,$-4
DJNZ R5,$-6
RET
;===================
END
;============================
0
回復(fù)
@zrz2008
OUTEBITP1.7 ;單片機(jī)引腳定義SDATBITP1.6STRBBITP1.5SCLKBITP1.4ORG0000HAJMPMAINORG0080HMAIN:;============================;============================MOVP1,#0FFHREDSHOW: ;紅色漸變MOV R4,#80ACALL COLOR1ACALL LOOP0ACALL COLOR1ACALL LOOP2 ;將輸入數(shù)據(jù)送入鎖存器 DJNZ R4,$-8ACALLSTARTACALLLIGHTOUT;============================AJMPMAINSTART: ;計(jì)數(shù)器亮度控制函數(shù) LCALL DELAY05S CLR TF0 MOV R1,#LOW(65535-10000) MOV R2,#HIGH(65535-10000) MOV TL0,R1 MOV TH0,R2 MOV R3,#LOW(65535-1) MOV R4,#HIGH(65535-1) MOV TL1,R3 MOV TH1,R4RETLIGHTOUT: ;二極管亮度控制LOOPREDB: ;;二極管由暗到暗明 SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 CLR OUTE ;TIGERSETB TR1JNB TF1,$ CLR TR1 CLR TF1 SETB OUTE ;STOP CLR C MOV A,R1 ADD A,#4 MOV R1,A MOV A,R2 ADDC A,#0 MOV R2,A MOV TL0,R1 MOV TH0,R2CLR C MOV A,R3 SUBB A,#4 MOV R3,A MOV A,R4 SUBB A,#0 MOV R4,A MOV TL1,R3 MOV TH1,R4 CJNE R1,#0FFH,LOOPREDB CJNE R2,#0FFH,LOOPREDB CLR OUTE LCALL DELAY2S MOV TL0,R1 MOV TH0,R2LOOPREDB1: ;;二極管由明到暗 SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 CLR OUTE ;TIGERSETB TR1JNB TF1,$ CLR TR1 CLR TF1 SETB OUTE ;STOP CLR C MOV A,R1 SUBB A,#4 MOV R1,A MOV A,R2 SUBB A,#0 MOV R2,A MOV TL0,R1 MOV TH0,R2CLR C MOV A,R3 ADD A,#2 MOV R3,A MOV A,R4 ADDC A,#0 MOV R4,A MOV TL1,R3 MOV TH1,R4 CJNE R1,#0EFH,LOOPREDB1 CJNE R2,#0D8H,LOOPREDB1SETB OUTERET;======================================COLOR0: ;不亮ACALLLOOP0ACALLLOOP0ACALLLOOP0RETCOLOR1: ;紅色ACALLLOOP0ACALLLOOP0ACALLLOOP1RETCOLOR2: ;綠色ACALLLOOP0ACALLLOOP1ACALLLOOP0RETCOLOR3: ;藍(lán)色ACALLLOOP1ACALLLOOP0ACALLLOOP0RETCOLOR4:ACALLLOOP0ACALLLOOP1ACALLLOOP1RETCOLOR5:ACALLLOOP1ACALLLOOP0ACALLLOOP1RETCOLOR6:ACALLLOOP1ACALLLOOP1ACALLLOOP0RETCOLOR7:ACALLLOOP1ACALLLOOP1ACALLLOOP1RET;================================LOOP0: ;輸入數(shù)據(jù) CLR SDAT CLR SCLK SETB SCLKRETLOOP1: SETB SDAT CLR SCLK SETB SCLKRETLOOP2: CLR STRB SETB STRBRET;==================================delay:movr7,#10movr6,#10movr5,#10djnzr5,$djnzr6,$-2djnzr7,$-4ret;==============================DELAY05S: MOV R5,#3 ;4 MOV R6,#250 ;230 MOV R7,#250 DJNZ R7,$ DJNZ R6,$-4 DJNZ R5,$-6 RETDELAY1S: MOV R5,#3 ;4 MOV R6,#250 ;230 MOV R7,#250 DJNZ R7,$ DJNZ R6,$-4 DJNZ R5,$-6 RET;===================DELAY2S: MOV R5,#10 ;4 MOV R6,#250 ;230 MOV R7,#250 DJNZ R7,$ DJNZ R6,$-4 DJNZ R5,$-6 RET;===================END;============================
以上是我的程序,根據(jù)各位的意思,基本上是實(shí)現(xiàn)了,我十分高興,不過還有一個(gè)小小的問題,二極管很閃,很剌眼,該怎么辦
0
回復(fù)
@lanpxr
您好!我也剛學(xué)單片機(jī),這是我用HT的單片機(jī)做的一個(gè)控制LED亮度的程序,由于我目前沒有條件搭線,所以想請高手幫忙指點(diǎn)一下.看看小弟還有那些不足的地方.呵呵我還是個(gè)學(xué)生呢.#includeht46r47.inc;Pb2控制占空比;Pc1,Pc2輸出PWM;Pb1選擇Pc1或Pc2data.section'data't0 db?;ThecycleofPWMpulset10db?;Opentimeaaadb?;Opentimecontrolbbbdb?;Closetimecontrolsovdb?;Opentimeendbovdb?;closetimeendcode.section'code'org 00hclr pbcmov a,02hmov pbc,ajmp startorg 08hjmp pwm;+++++++++++++++++++++++++++++++++++++++++++++++start:mov a,3 ;cycleofPWMpulsemov t0,amov aaa,amov a,1set sovclr bbbclr t10;+++++++++++++++++++++++++++++++++++++++++++++main:mov a,05hmov intc,amov a,84hmov tmrc,a;fsys=32768Hz,rtc,t0=fsys/32=0.5msmov a,0feh;Theclockbasethistimemov tmr,aset tmrc.4jmp $;+++++++++++++++++++++++++++++++++++++++++++++++++++++++sz pb.1 ;判斷鍵是否按下jmp loopcallchouloop:sz sovjmp next1sz bovjmp next2jmp loopnext1:inc t10mov a,aaasub a,t10mov sov,asz sovretisz bovjmp $1set sovjmp loop$1:cpl pcset bovretinext2:inc t20mov a,bbbmov bov,asz bovretisz sovjmp $1jmp loop$1:cpl pcset sovreti;+++++++++++++++++++++++++++++++++++++++++++++++++chouprocsdz aaajmp $1jmp start$1:mov a,t0sub a,aaamov bbb,aretchouendpend
嘿嘿 小弟也做過一樣的東東
原理就是大家所說的 也通過電路實(shí)現(xiàn)了
不過還是想看看大家怎么做的
我看我得程序比較幼稚 像大家學(xué)習(xí)
我copy 了你的程序 回家看看
我也是個(gè)新手 學(xué)生
請大家多多指教
原理就是大家所說的 也通過電路實(shí)現(xiàn)了
不過還是想看看大家怎么做的
我看我得程序比較幼稚 像大家學(xué)習(xí)
我copy 了你的程序 回家看看
我也是個(gè)新手 學(xué)生
請大家多多指教
0
回復(fù)