找回密码
 注册
关于网站域名变更的通知
查看: 620|回复: 2
打印 上一主题 下一主题

51单片机学习:定时器产生PWM可调方波,控制led灯亮度

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-15 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

3#
发表于 2019-11-14 20:58 | 只看该作者
为所以偶他认为退热问题依然
; d. u0 d4 V9 |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-2 12:52 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表