利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7

利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7,第1张

我有一个可以借鉴一下:

//

// 利用定时器控制产生占空比可变的 PWM 波

// 按K5,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K6,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

//

#include < reg51h >

#include < intrinsh >

sbit K5 =P3^2 ; //增加键

sbit K6 =P3^3 ; //减少键

sbit BEEP =P3^7 ; //蜂鸣器

unsigned char PWM=0x7f ; //赋初值

void Beep();

void delayms(unsigned char ms);

//

void main()

{

P2=0xff;

TMOD=0x21 ;

TH0=0xfc ; //1ms延时常数 12M

TL0=0x18 ; //频率调节

// TH1=PWM ; //脉宽调节

// TL1=0 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Beep() ;

}

while(K5==0);

do{

if(PWM!=0x00)

{PWM-- ;delayms(10);}

else Beep() ;

}

while(K6==0);

}

}

//

// 定时器0中断服务程序

//

void timer0() interrupt 1

{

// TR1=0 ;

TH0=0xfc ;

TL0=0x66 ;

TR1=1 ;

P2=0x00 ; //启动输出

}

//

// 定时器1中断服务程序

//

void timer1() interrupt 3

{

TH1=PWM ; //用定时器的方式2,是数据重装TH-TL中,改变PWM的值即该变定时器的初值

TR1=0 ;

P2=0xff ; //结束输出

}

//

//蜂鸣器子程序

//

void Beep()

{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delayms(2) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

}

//

// 延时子程序

//

void delayms(unsigned char ms)

{

unsigned char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

//

你想让输出口是P1^7,我这用的是P2口为输出,将其变化一下即可,希望对你有用!!!!!!!

PWM EQU 7FH WM赋初始值- K; H, S9 t! G; @

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

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

DECKEY EQU P35 ;K2,PWM值减小键。

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

BEEP EQU P37/ A- ` O! \( h, ]6 D

;----------------------------0 Y7 p% {7 ~0 v7 `) W3 v; F& {

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 K; V2 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 Y; T 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 U; g$ B$ M# s/ c

MOV A,PWM ;5 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 V; x$ 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# A; R9 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' u; c8 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 _$ t; r;------------------------------

5 @2 c- U1 C! [, \! z;T0中断服务子程序 (频率)- 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 G;T1中断服务子程序 (脉宽)

" 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& R;10ms延时子程序

- 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" g; V 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! W; j ]& v g1 n9 }8 o;------------------------------

/ n F5 V4 P; h& A;蜂鸣器响一声子程序

' K5 {0 h ]% R [: ` R/ X; T3 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 q; z) 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 e; u$ I& @ DJNZ R6,BL4

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

" m+ W8 R ~, ` RET

7 \% P9 ^: s; R2 V9 m" a9 A! U3 A;------------------------------

: e; f% b) G7 n END

以上就是关于利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7全部的内容,包括:利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7、用PWM控制LED的由灭渐亮的程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10089162.html

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

发表评论

登录后才能评论

评论列表(0条)

保存