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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机学习:定时器产生PWM可调方波,控制led灯亮度  K, q$ L# N  l1 o
( ~1 T# h' X( \2 o

* ?, O# G2 p  q- T: L- u& C0 p! S4 Y7 N

7 q% p+ o: L8 _$ l3 j0 u使用定时器T0产生PWM方波,
5 U1 g' u- j1 W% @: e& e用按键调整占空比,20级可调
3 I/ l- i3 c1 Z' U. y) p3 k/ }控制led灯的亮度等级.- ]1 |3 C& ]+ n1 c

; T: F- n1 s( {- |源程序:
$ u4 W  h+ g' a3 F7 Y8 W
#include  "my51.h"
+ @. e% {  k6 W# c: _7 [5 y#include  "timer0.h"2 k6 }: U. O% y6 l
$ `( s6 X4 X* S( a/ X( U
  r# I  O# _) m/ n/ g; d! x3 e) Q
#define grading    20                       //亮度20级变化" n  o% J" {+ Z$ \) M7 O! z% J! W
sbit keyS3=P3^5;                            //按键调整占空比,PWM_keyChange++
+ m9 p  A5 [6 y$ y2 k/ Esbit keyS4=P3^6;                            //                                PWM_keyChange--
! n" T" R9 l3 O) l: {1 U' |4 e7 n7 s" }9 q& }

: n: t. E2 I2 R4 iu8 PWM_keyChange=10;                     //初值,按键调整在1~20之间变化
' e" ?% X9 h2 g/ t                                                           //占空比   PWM_keyChange/grading
3 G* r! E7 s& ?8 U6 K
. A- m/ c0 {. ~: d' ~$ t

( O, L  s. X7 p* Gvoid T0_work()                                   //本函数由T0定时器中断函数调用
+ O3 X1 P: D* X5 q9 N9 l! p{        ' @# o( n9 L7 A( ^+ _# H. B
        if(timeMultiple1Flag)
0 l, A' j& e' U) S+ ]        {               
" ~9 t* n0 N) _6 }+ n9 S8 a9 X                led=off(7);                           //关闭7号灯* V' i) ?+ m- K/ \  j6 U! V! Z
                timeMultiple1Flag=0;   //清定时器复用置位标志7 D* T3 v4 l) b# ?9 _% e
        }& A4 @4 m0 r6 J1 Q
        " U" Z( j; G' h. o( g/ A/ }- e
        if(timeMultiple2Flag)
, z4 l: \( @0 D        {               
# @' _4 g/ L2 b* i0 A$ `2 R) v2 B) `                led=on(7);                           //打开7号灯
6 b% u  i3 @, _2 _( F& w                timeMultiple2Flag=0;   //清定时器复用置位标志7 E; z" m( ?$ [
        }                  
5 [) L5 m, E! h4 n+ }}7 d/ O9 Q- p+ t* \
/ Q& {1 Y  B/ c" A/ j& B6 z1 B

. u' k# D7 A9 v7 o5 {( m9 `void main()                                            //测试, O; v( V" U/ E
{
0 l( u; V8 r% O& g& Q& f2 h' L! ]        u8 keyFlag=1;                                //程序中没有消抖处理,只是简易的按键进出自锁标志# @# G' j7 n- {1 Q& P% g8 W, w
        led0=ledon;                                        //先打开0号灯,用于和7号灯对比亮度                # V% ]1 x! L# O- v6 l- f- S4 d
        initT0(1,10,grading);                //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒. V6 |! f) r  \
        while(1)8 n& V" I- [* u$ P
        {
% w! n' L. q1 @3 ~                if(0==keyS3)
  ^% u8 \' T- W8 ~& m7 M8 h                {3 ~- w) l0 R; i' n4 g7 k6 a
                        if(keyFlag)                                                     //防止一次按键中多次执行
8 w) v; q+ {5 W9 F% y2 z8 G                        {
- n7 e2 h* d) `0 O" ~2 K: Z4 W0 E                                keyFlag=0;                                             //清标志,类似同步锁
4 {; F* g4 h8 Y- E+ N! h/ b                                if(++PWM_keyChange>grading)1 \5 z1 i  R" e% X& E
                                {
3 b$ |1 B6 H' n$ v) k( h* n4 n                                        PWM_keyChange=grading;          //占空比最大100%
: ~( i+ Y, Y7 ?/ S" \                                }
, L+ V; Z7 n+ e4 B1 H+ J                                initT0(1,PWM_keyChange,grading);        9 N2 X; X% \7 f3 X& X
                        }                        
0 V6 V( p  Z4 S) a5 [  S; m                }3 O/ w' U: N0 n3 A
                else if(0==keyS4)
  S/ Y2 k' ~1 P5 g1 b' {+ ~. g- v                {. I. W0 [) A  s% p- P# V8 `$ d0 y
                        if(keyFlag)1 b  G8 X* v- i# b
                        {
# S/ J: b4 ^% l  O/ e9 I0 j                                keyFlag=0;! F& g$ \. c/ x
                                if(0==--PWM_keyChange)                                //占空比减小
# n. u+ D' u+ M$ ]                                {
$ U3 W! m* k, K                                        PWM_keyChange=1;                                  //最小占空比 1/20
  [! ?" G: ~& L2 s. p# y& B4 m  M                                }        $ \3 K( V. ?( A) `
                                initT0(1,PWM_keyChange,grading);        //占空比减小- u" {5 A8 _7 N: z& N
                        }
8 T3 j& V6 L( X" J: o                }( r& k, O& Y. n, K! f# g; {0 V# ~
                else
9 |' @5 t3 w- D7 F                {9 p! g. B  M" n: }. m1 R* o0 {
                        keyFlag=1;        //按键锁释放标志,下一次按键时允许调整占空比' o( A( J+ R: j& ^7 f! _) a
                }+ w0 V3 A' v$ z4 U- \  O
        }) d& a6 y" M" z. C: T* R- q
}4 b6 o! ?: j6 u5 ]1 I: N
, g& M; |* f* N+ a
( L" N: C  K! q/ Q$ a* o9 Y0 \

* [4 T4 L7 o# Q; [9 y
游客,如果您要查看本帖隐藏内容请回复
4 B( r" o) N( L$ V* S

! n9 S# @: s- i* l
, s3 S: b' C: N- E% U

/ ?3 H0 a. h& W! i: \9 ?( T

该用户从未签到

3#
发表于 2019-11-14 20:58 | 只看该作者
为所以偶他认为退热问题依然) {# @$ w9 b0 N  s3 M  m% ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-11 10:56 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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