用PWM控制LED的由灭渐亮的程序?

用PWM控制LED的由灭渐亮的程序?,第1张

PWM EQU 7FHWM赋初始值- KH, S9 t! G@

OUT EQU P0 8个LED灯的接口, {~, G! M* f@% m2 q7 x

! O2 y\$ {. P4 p6 {( d9 z INCKEY EQU P3.4 K1,PWM值增加键。$ c( ?, D) C% M1 L( S

DECKEY EQU P3.5 K2,PWM值减小键。

) i/ e2 T1 p* Q/ L"消雹 d2 o/ v$ @% S8 ]$ @- _! v

BEEP EQU P3.7/ A- `* O! \( h, ]6 D

---------------郑册-------------0 Y7 p% {7 ~0 v7 `) W3 vF&{

ORG 0000H$ S" d% ~8 c r&n

SJMP START" K3 W3 s* t" K: A T' k- W O( S

ORG 000BH

v8 K- B! {c, B7 P9 \D SJMP INTT0

/ v5 t9 N0 v: f3 n( ~ ORG 001BH

# l% r1 @# t7 w" z$ ?- f SJMP INTT1

" C" K: F2 i- w8 n% Z. KV2 L9 R ORG 0030H+ i|8 S1 f) ]! n$ I# J

--------------喊桥宏--------------! ?2 w' E# C( A

主程序% e' q! g7 D! S. P5 I

定时器0工作在模式1,定时器1工作在模式2。0 ~\( G8 W- }$ N4 w2 F5 X1 r, L

----------------------------/ [0 V% F$ q7 s, R% o' O( t. S

START:7 }/ P5 r" ^4 T0 [4 Y" [3 f

MOV SP,#30H

F2 ^1 X( r3 z+ S E MOV TMOD,#21H

- r8 YT* v: M2 n3 p# r MOV TH1,PWM脉宽调节0 F4 ], l6 h$ D5 a' L. b2 U

MOV TL1,#02H8 R, f3 d. |Y2 k/ W

MOV TH1,#0FCH

&z! g- [% O! Q! M7 l2 n8 h MOV TH1,#066H( A&o0 v0 [8 ]+ i

MOV TH0,#0FCH 1ms延时常数

5 v7 ?, N1 C* }, d MOV TL0,#066H 频率调节( Q! ^* u, Z], D% n&e" x4 B. M

MOV TH0,PWM

' Z/ b5 a1 q: g% g: ~ MOV TL0,#02H

! X: T3 u* r6 } SETB EA, H5 H, r$ F0 r) @9 ^. ?

SETB ET0. W# a2 M$ f' h! k' {6 Q9 }

SETB ET1

8 I0 I&k) a) S# y) x) a SETB TR0

: H3 I* z_) R% p' Y* ^1 [# s) q

) C1 q8 a, m. c! K: uLOOP:

' C5 I5 F5 ~0 Z/ D. ~. H1 Ug$ B$ M# s/ c

MOV A,PWM5 a, m. t6 A6 n _- Q

JB INCKEY,LOOP1 增加键是否按下?) c0 S" u/ E1 M/ ~

CALL DELAY 延时去抖动+ l7 [4 E5 n1 [ e

JB INCKEY,LOOP1

b" i1 N- S5 K CJNE A,#0FFH,PWMINC 是否到最大值?

, t7 \+ w. G1 O CALL BEEP_BL 是,蜂鸣器报警。 t, D/ N&w! t' X

SJMP LOOP: V4 k3 i W! ^- ^

PWMINC:# p7 ^6 B0 O5 @% C3 }&n

INC PWM调节脉宽(脉宽减小)

+ G- T+ u6 i7 m: ~7 ^ SJMP LOOP, |8 F, i7 W7 Vx$ E, o/ |% d0 y|

/ }0 ~9 P# a/ xLOOP1:

{) w0 e1 m' J1 b

. v$ B5 `( x- l0 _! \1 p4 K6 ] JB DECKEY,LOOP2 减小键是否按下?6 a, c8 f' K1 |' u&K- [! I1 Y

CALL DELAY 延时去抖动3 s( C# AR9 e1 t- z: Y0 r/ l/ [ ^

JB DECKEY,LOOP2

1 O3 W! c: n4 t CJNE A,#00H,PWMDEC是否到最小值?) P: y2 [9 y$ M% I: F

CALL BEEP_BL是,蜂鸣器报警。0 n" f# H% U4 h' H+ y1 k

SJMP LOOP' uc8 m" ?9 Z ? A

PWMDEC:

Y( U. ], w&L( i DEC PWM 调节脉宽(脉宽增加)

% D) K9 R3 j1 Z. `&BLOOP2:SJMP LOOP7 e$ Q9 N5 h# z: g* W6 @

. e4 i, m1 e t7 _$ tr------------------------------

5 @2 c- U1 C! [, \! zT0中断服务子程序 (频率)- h3 f2 J$ L. p8 ]- L

控制定时器1中断+ ^( k: X* T0 @1 G E

------------------------------

9 l3 w2 N+ k* w$ x- JINTT0:% v9 T* k: y6 _&B1 \

CLR TR1

9 d8 j5 Z4 U8 {, d4 T MOV TH0,#0FCH 1ms延时常数4 U1 p&t( x% I/ U0 y4 x0 h_

MOV TL0,#066H 频率调节

9 n. P( G8 W7 E) ]2 N* W MOV TH1,PWM

. i5 S/ w4 u T$ w u) _: e SETB TR16 @( U# b! w j$ h+ p

MOV OUT,#00H 启动输出

, D6 C: }2 l- r/ r \: @. ? RETI- k/ S/ s7 v U' i% j) o" T

------------------------------

$ f8 [3 @ e&E9 X% L, ^3 GT1中断服务子程序 (脉宽)

" w1 W/ X$ s6 b4 z3 }. }4 `1 o控制PWM脉冲宽度

. W1 b1 \0 ]- E6 H0 A. Q( c------------------------------) J( S$ h4 v d0 \) c, s, ~

INTT1:

b, B, Y* G( z [c$ p2 X! x CLR TR1 脉宽调节结束! J0 Z0 `, P5 m/ q5 v) M

MOV OUT,#0FFH 结束输出

. u6 C, U% C/ C7 h+ t RETI) A, @. Z" m@2 f9 ]1 h5 [

------------------------------

6 Q9 _* ~6 [/ w, N&O&R10ms延时子程序

- h) G6 K( h5 p' U------------------------------+ c&_! P/ v, I

DELAY:3 \2 w5 h+ l1 R: W% s% Z

MOV R6,#50+ A W" [/ \( E# T: V0 |3 Q

DELAY1:# I+ b) ^&a- j" gV s. r

MOV R7,#100

+ P7 { d9 G a9 H O- O, p. v DJNZ R7,$! T# A1 R( D. o" I

DJNZ R6,DELAY1

\, e, J1 l* l&W RET

( T- C! Wj. ]&v. g1 n9 }8 o------------------------------

/ n F5 V4 Ph&A蜂鸣器响一声子程序

' K5 {0 h* ]% R* [: ` R/ XT3 j* |# ^------------------------------1 d4 L* a8 g7 k7 @2 Y4 L

BEEP_BL:7 b4 J: d1 d! T% u3 p

MOV R6,#200

% W, R&X! l5 B' P* j BL1: CALL BL21 j' ~: T% _2 P3 f2 h

CPL BEEP

7 I6 K/ J9 G) P/ e/ F: B DJNZ R6,BL1/ R" `! _* S! @3 a' C9 _

MOV R5,#25

9 e/ @4 W) Y- j: l7 D! V CALL DELAY2% D, ^. v&h&u/ h$ ^' j, ^( R6 v

RET2 j2 e% x v&`E( X* j9 K

) d0 A3 q' i! D BL2: MOV R7,#180

# ~2 @# ?2 l* b+ p' D2 U BL3: NOP

8 w$ f$ i0 |3 d3 H+ A DJNZ R7,BL37 \! d/ S7 x4 F1 A1 l

RET

( u0 qz) T" e* h DELAY2:延时R5×10MS

9 [$ y/ Z&l3 [6 [ MOV R6,#508 H5 B4 G% w1 ~" \, j5 R6 I

BL4: MOV R7,#100

, q_g9 X9 ?+ n) a, K BL5: DJNZ R7,BL5

. i: W) v3 eu$ I&@ DJNZ R6,BL4

. L8 B0 v+ G8 w. S- h0 n DJNZ R5,DELAY2

" m+ W8 R ~, ` RET

7 \% P9 ^: sR2 V9 m" a9 A! U3 A------------------------------

: ef% b) G7 n END

这哪慧是一个独立控制2路PWM的汇编程序:

2个输出口以高电平为有效输出,也就是当输出100%时为高电平输出,输出0%时为低电平输出。

改变10H-11H的值可以控制2路PWM的占空比变化,例如当10H中的值从0-255变化时候,P1.0输出从0%-100%变化

此程序中频率完全固定不变化,改变10H,11H,12H中的清返值仅改变三路输出的占空比,

频率是完全恒定的.这里PWM波周期为(r7)50usx200=10mS,约为100Hz,晶振用的是12MHz

zzz EQU P1.0 左路马达输出口

yyy EQU P1.1 右路马达输出口

ld1 EQU 10H 左路马达,即占空比的比值,0-255变化

ld2 EQU 11H 右路马达,即占空比的比值,0-255变化

ORG 0000H

LJMP mm

ORG 000BH

LJMP t000

主程序段*****************************************************************************

org 0100h

mm:nop 复位程序

mov r4,#00h 延时1秒用

mov r5,#00h

mov r6,#05h

MOV SP,#5fH

MOV P1,#0FFH P1置高,关闭全部灯

MOV 10h,#0fH 给左路马达赋值,0ffh为速度最快,00h为最慢

MOV 11h,#8fH 给右路马达赋值,0ffh为速度最快,00h为最慢

mov r0,10h 将左路的赋值送进左路缓存

mov r1,11h 将右路的赋值送进右路缓存

MOV TMOD,#02H50us t0方式2自动重装

mov tcon,#00h

MOV TH0,#0cdH

MOV TL0,#0cdH

mov r7,#200 设定周期数据

SETB EA

SETB ET0

SETB TR0

mov 20h,#00h

m0:acall ys00延时1秒

acall pwm改变速度子程序

sJMP m0

定时器t0中断子程序<占用区0>********************************************************************

org 0180h

t000: 50us t0中断子程序,用于实现三路PWM输出

PUSH ACC

PUSH PSW

clr psw.4 进入区0

clr psw.3

CJNE R7,#00H,AA 从这里是程序的精华,检测R7值是否为0,等于0则下一条重新赋值,否则跳到AA

MOV R7,#200 R7重新赋值

setb 07h 设置改变pwm数据标志位

MOV R0,10h把左路速度值复制给R1

MOV R1,11h把右路速度值复制给R2

AA:CJNE R0,#00H,BB判断控制左路的值是否(或是否被减为0)为0,是则下一条关闭左路,否则跳到BB

SETB zzz 关闭左路

sJMP CC 跳到CC检测右路

BB:CLR zzz打开(或继续打开)左路

DEC R0R1数值减1

CC:CJNE R1,#00H,DD这里控制右路与上面左路原理一样

SETB yyy

sJMP GG

DD:CLR yyy

DEC R1

GG: DEC R7把R7的值减1,R7的初始值是#200h

POP PSW

POP ACC

RETI

延时1秒时间子李正答程序*****************************************************

org 0200h

ys00:push dph

push dpl

push acc

push psw

clr psw.4 进入区0

clr psw.3

ys1:djnz r4,ys1

ys2:djnz r5,ys1

ys3:djnz r5,ys1

mov r4,#00h

mov r5,#00h

mov r6,#05h

acall pwm

pop psw

pop acc

pop dpl

pop dph

ret

pwmr改变pwm时间子程序*****************************************************

org 0280h

pwm:jb 07h,pwm1 一个完整周期到否?

ret 未到则返回

pwm1:push acc

push psw

clr psw.4 进入区0

clr psw.3

mov a,10h

cjne a,#0ffh,pwm3 未到最大则继续

mov 10h,#0fh

sjmp pwm4

pwm3:mov a,10h

add a,#10h

mov 10h,a

pwm4:mov a,11h

cjne a,#0ffh,pwm6 未到最大则继续

mov 11h,8fh

sjmp pwm11

pwm6:mov a,11h

add a,#10h

mov 11h,a

pwm11:clr 07h

pop acc

pop psw

ret

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12236597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存