|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:定时器产生PWM可调方波,控制led灯亮度
7 @) _6 N8 S4 g% e- x4 O$ a3 u: H! x! N( A; g1 C U
* d- b2 l9 O8 S; J
8 V2 o9 z+ w1 t7 W3 I# U3 ^4 s4 e9 s8 u7 ^) _
使用定时器T0产生PWM方波, h. Z: @; n. q2 t
用按键调整占空比,20级可调1 E4 L( M1 A; R7 |) ^- f
控制led灯的亮度等级.& R1 {, Q8 U5 s7 I2 x2 k
( x& `' Y) D4 l- Q9 q& ?8 L! @源程序:
: L9 r. `% d& i" o8 ^#include "my51.h"
; q q: @( w, ^1 w$ a: o#include "timer0.h", _" v; U$ a$ l( P
/ S' M" U" ]) V$ `
! W4 M' `/ x3 M" K6 }8 \7 }- ~
#define grading 20 //亮度20级变化
# W4 r. A. n' Q: V) E, `sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++
. s7 z+ Y; ~! N1 N. wsbit keyS4=P3^6; // PWM_keyChange--
7 x/ _1 g k9 v3 {- c4 Y0 f; q: }, y2 ]1 y# N
9 D% \# P) `8 N! R: ~0 G2 L
u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化
5 P. w9 m& b7 t1 |2 b1 t //占空比 PWM_keyChange/grading
1 E$ ?& o# Y: H+ D- K9 g& r1 n2 y5 P& g! K2 {0 l
# ^3 {4 J* ~. ~
void T0_work() //本函数由T0定时器中断函数调用; O3 p$ q# _8 J/ C" \
{
' l# B* {3 z8 B' U7 B if(timeMultiple1Flag)+ p0 ^+ G5 C. e) I
{ . ^6 d- j+ R d- ?/ ?' b
led=off(7); //关闭7号灯' f8 [ W: d+ L, O$ a! @
timeMultiple1Flag=0; //清定时器复用置位标志: [* d1 T }/ R3 @' D% I
}7 q9 ~: f9 o. @. s. [
5 Q0 n' c2 J! W9 E0 T
if(timeMultiple2Flag)
% b. P9 {9 E& p0 q$ P {
& O0 O8 \. n- F/ m# | led=on(7); //打开7号灯+ K6 y5 A% x1 l8 r4 J& P
timeMultiple2Flag=0; //清定时器复用置位标志
$ ?& C/ y3 f. b4 B: B* h2 W }
: w# l& R) {. y2 J}+ W' H, ^+ S% Y5 y K- @, Y* `; m/ L
* m7 I# V5 ^) U9 o. T. Y
y# \: b* O2 W* ^
void main() //测试4 L6 K' e% C4 g/ O$ [
{; p5 N- J$ ~6 M i. R
u8 keyFlag=1; //程序中没有消抖处理,只是简易的按键进出自锁标志
& U7 w, [7 Y* G: P% {8 b led0=ledon; //先打开0号灯,用于和7号灯对比亮度 6 j) t C: G2 I; Y& {. M |9 B# A
initT0(1,10,grading); //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒
& o. w, y& ^7 N! O( d( z6 F7 u N while(1). E# t8 B) c, {' |
{
4 Q* x, ?# D* T if(0==keyS3)
, ^. _2 u' o8 L- }/ F1 q {. A% m6 j- r+ M& `! C2 V7 j% x
if(keyFlag) //防止一次按键中多次执行
0 Q* Z7 \# X a0 P! u {& g* }1 x; i" ?0 }5 |0 ]* r
keyFlag=0; //清标志,类似同步锁
. z) G+ f; u- q* { if(++PWM_keyChange>grading)/ _, x' [4 s2 u2 f/ B+ k5 P0 i
{3 O% F# C. p3 a" z& j9 [
PWM_keyChange=grading; //占空比最大100%( R6 B' Y! a1 z( r1 u
}
; e, \1 y5 a5 l! |" W# m) O5 z5 q0 S initT0(1,PWM_keyChange,grading);
) s/ f9 r- z8 t } 8 o2 b: D9 } T3 W6 q( P @, Z$ v1 l
}
1 V2 w1 o. {* D$ M0 S- q else if(0==keyS4)
s1 L0 J4 k6 z& r6 Q { l0 a7 t4 L7 }1 a) T" i# x5 m* u
if(keyFlag)
/ T6 T4 I& y! e" J/ A {; j8 e# o" l8 }& w$ p3 ^( V0 q7 e
keyFlag=0;
. b% P8 k" U" B if(0==--PWM_keyChange) //占空比减小' J$ N% I6 T) l
{! |, G0 H9 h. X: C$ X8 |
PWM_keyChange=1; //最小占空比 1/20 U8 b; H, E& }! u9 c; R
}
2 c: l7 T: S0 y: U; V0 ^ initT0(1,PWM_keyChange,grading); //占空比减小
: P/ }$ V9 F+ \$ j3 n: h& @ }
+ J4 L/ O5 h* M& ^$ l }
' ]) t' I" }! R% M else
3 v" F x* M, b' b+ t8 ]; Q {
) k. e; [$ T( L7 Q: L& P5 }! ~- p keyFlag=1; //按键锁释放标志,下一次按键时允许调整占空比
* ]. a. o( P4 J2 j9 A }& q& g/ r; {8 p* V" k
}
7 ?0 g1 z. _- f' G}0 N: O" n, H( w6 z; ?
' E: t5 O9 J+ t* y# A7 k- R# N) }% U" s$ v4 k# }1 O7 @& g* m9 E8 x
: f$ ]1 [( `8 q
: D" G2 k4 @- i. {4 Q' [* \9 M2 m& G! b. C
9 k, |, K7 L/ E$ C2 j
& \9 o7 {" H7 Q. M( Z |
|