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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机学习:定时器产生PWM可调方波,控制led灯亮度+ T$ }) ~5 y: @6 a/ H7 }

6 R3 |0 I- r4 H. H2 |

$ |) L/ P% W5 z/ V2 r: A5 R5 Z8 k
* H5 b9 P2 h! E$ O2 f9 k  \5 F7 B' g
使用定时器T0产生PWM方波,
" h1 M: g/ x3 {. r8 U( Y; O; A用按键调整占空比,20级可调
  y; v% e, b, m9 l- _" W$ U8 d/ Z控制led灯的亮度等级.& C9 U7 d7 g. Z  G9 y; R2 m

9 G- B1 ]; V& Z2 K  w* M. U源程序:

$ l+ N4 M9 H$ n#include  "my51.h"9 v. @; [: Y8 V/ V* f3 d
#include  "timer0.h": I; v' L, Y0 O+ u6 `

8 \) r- [# v) M9 x5 L: ^! r

+ V  O0 l0 h' |9 {#define grading    20                       //亮度20级变化
  a5 e; w9 x% o; m; Q) }" D+ m# Csbit keyS3=P3^5;                            //按键调整占空比,PWM_keyChange++
: Q* l- F9 r; z- z7 wsbit keyS4=P3^6;                            //                                PWM_keyChange--. |; ?' ^9 Z+ Z4 U# e

5 t5 t5 d. L! A. {) j

* {2 G& f: h/ k1 ju8 PWM_keyChange=10;                     //初值,按键调整在1~20之间变化
& ^( x( B* Z& M0 u( E                                                           //占空比   PWM_keyChange/grading
/ x* w7 a, d& r% q  b
* [! W9 G$ q$ _9 h4 p5 C; V
" w) v' J: \! R. a
void T0_work()                                   //本函数由T0定时器中断函数调用
6 E4 J" l* W2 }! ?5 Q{        
$ n+ E' {" f- p1 G        if(timeMultiple1Flag)
1 N# {' D  b# `: M! N0 d        {               
* X/ o$ O5 v- g7 |6 b9 [3 I3 j                led=off(7);                           //关闭7号灯
$ G5 `& C6 K7 }: L$ w, N7 ^: |: V                timeMultiple1Flag=0;   //清定时器复用置位标志4 @1 H# K" O; m# J
        }
" Y. v- q( N% ]9 _        
/ Q7 s4 _3 k2 o" X& z        if(timeMultiple2Flag). P- Z5 C) i. U% H" C' d
        {               
* n2 t" `0 }6 f/ @; t( ~/ Z                led=on(7);                           //打开7号灯5 D$ g/ j* g+ b
                timeMultiple2Flag=0;   //清定时器复用置位标志
4 y' w8 i- [. ~! B) V* j' {+ l        }                  ( Z/ G" X1 Z7 q6 {( A4 ]# V
}6 D5 Z' G6 g) P+ E. t. @, j$ h

* q' `* q% C! Q( F; Y3 ^$ p( {+ u, r
3 f0 a/ ~4 a: L% L4 o! D
void main()                                            //测试
% a" V1 k& A! I8 B{: F# m4 c- V  Z  r
        u8 keyFlag=1;                                //程序中没有消抖处理,只是简易的按键进出自锁标志
4 V9 Y$ x1 N6 K( U4 Y2 b        led0=ledon;                                        //先打开0号灯,用于和7号灯对比亮度               
/ ^, s: D' p- K9 N5 w        initT0(1,10,grading);                //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒! u* t* k1 y( Y* B$ v7 D
        while(1)
3 r6 u' h7 |) C# @) o  j        {  q$ t. O& G/ `
                if(0==keyS3)5 Q# j. A4 F6 ^$ p4 V
                {
2 y- z# Z* O  Z- e# d                        if(keyFlag)                                                     //防止一次按键中多次执行
# E, C9 {/ j; _/ q& S% H5 k                        {
3 n1 c6 Q4 V# e+ o  }3 m# x6 x                                keyFlag=0;                                             //清标志,类似同步锁
- K8 w3 ]$ w+ h# o4 n( l3 y                                if(++PWM_keyChange>grading)
, Z" F/ m9 P3 q6 J1 {" ?                                {! m) g8 E& @; Z0 A( i% h  W
                                        PWM_keyChange=grading;          //占空比最大100%
9 M# A1 w2 h" U( u                                }; X# A0 \6 R, }: {# e" ~9 u' R$ I
                                initT0(1,PWM_keyChange,grading);        , r2 S' j' a6 u5 F; s
                        }                        
* N. V! @6 m9 G8 F                }
6 G+ n. `, X0 x* i                else if(0==keyS4)
4 _5 W4 I  ]8 V# i, Q6 i                {
6 \% n- |0 F3 E. `& @                        if(keyFlag)
0 `' B7 j& D( W9 o6 y& g                        {' B- K' C4 ~' X( O* b# [2 [
                                keyFlag=0;
' G) J& n4 P1 d& }* |' r                                if(0==--PWM_keyChange)                                //占空比减小
" ^! K: z. `5 G! Q! a' ^                                {  Q. N" m, ^( e
                                        PWM_keyChange=1;                                  //最小占空比 1/20/ b. H+ v: f, H1 k( m2 i& v
                                }        9 V0 Z5 X+ ~+ T" x6 j2 B# n
                                initT0(1,PWM_keyChange,grading);        //占空比减小
, X( a7 H0 J& C( @                        }; ^; }& C. a' F- S( c
                }: O$ Y6 w' {) J6 M! _2 ^
                else
+ v. B: D+ i% h                {. u9 J8 _3 j9 ]- @) R5 e2 I+ [
                        keyFlag=1;        //按键锁释放标志,下一次按键时允许调整占空比, B$ ]- [; Y9 R' {5 v; W
                }
+ w& K8 d0 m( E, i        }
3 g5 _  f' f3 L) a" R0 x}# I+ [  E2 U3 M. b6 ~
! F2 E$ E* m% G! \! ?- f( V8 _

" V% D4 s, |  P0 |2 R% M) M. O
- V: e! F. l2 }& [  T3 Z
游客,如果您要查看本帖隐藏内容请回复

6 y/ Q' f& b1 @5 M- M; P- Q
( A' n9 i  g2 z, K6 T, J

" r# u8 E1 p5 b! }6 T8 H
4 Z. c# q  X" P

该用户从未签到

3#
发表于 2019-11-14 20:58 | 只看该作者
为所以偶他认为退热问题依然: l! n! }' G  P9 q6 c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 07:22 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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