EDA365电子工程师网

标题: 利用PIC16F1947的PWM模块做了两个呼吸灯 [打印本页]

作者: Dedy01    时间: 2016-7-2 14:38
标题: 利用PIC16F1947的PWM模块做了两个呼吸灯
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
: S- A( |: \! {
* d4 D7 A+ N7 m3 [/*
6 Z6 H0 z7 \8 R% k2 G*@Name:        PWM_led9 F" [! B  D' r" I+ h  s
*@version  1.03 V, A; Z9 Z0 q4 p. V
*@Author        xiaopan
+ |  O+ E& [7 D: X$ V' f*@Date                2014.8.2
- _3 I& ?* E. G" n2 F*/4 M( y+ m# P7 ~) H7 G; l( p4 D( N: i  {
, L8 t) g2 n& J9 c0 N
#include<pic.h>
; g* L7 }( `, l$ O5 L0 H" A#define uint unsigned int 6 B% X4 w$ U7 h4 z3 y
#define uchar unsigned char
5 c+ L/ Q% q( b2 Z! O9 S5 \8 q! O: B% }
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        % Y+ a% j$ F* P- F2 U$ N
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
& h0 f. d) |  w4 p3 T& O2 [8 Y  w% D1 s0 M
uint Time = 0;
2 V6 g+ }! E( U- I9 buint cnt_1ms = 0;
& P- f6 R1 i9 i) guchar State = 0;# M: p- r3 Q+ S* W- Y

, x' @$ t3 y+ d) t- U9 b' P  q, evoid GPIO_INIT();7 R5 i! N) g  a0 _9 ]
void TIMER2_INIT();
* J: [+ X* I% f* Ivoid TIMER4_INIT();8 w0 d, h  s, w$ [$ @) d9 t
void PWM_INIT();' I* b* [2 R# E2 d
void Control_Task();/ J: |! a' i6 w! p8 y# R& a9 u: O
6 ]+ `- k' E7 F$ ?: v+ ^0 S
/*
: ?2 L' Q8 H* C% d: N  l. Y*@function 主函数$ _; i: h& Q  ]& ^, w
*/3 {+ L9 I: Q. b
void main()3 ]5 N; C% D0 j, X7 f7 P6 ~8 r
{
) V7 o* S- ?( u" C8 P6 b        GPIO_INIT();& W1 r( {3 ^3 M: V/ P+ b7 V
        PWM_INIT();
) q; Y) I+ _- l$ @7 G/ O" W        TIMER2_INIT();                                //PWM利用TIMER2
. s" T. o+ m$ [0 X: L+ R/ w        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
$ L$ d% A' P2 u3 D* |- y) I- g. P        while(1)  _8 O% o! F3 v" X* d
        {
9 T* t  U, N) {9 @8 A) H7 l                Control_Task();
; x- I+ f. O% @) m6 o& p& b' C$ j        }
* s  Y( m( S! `9 D}3 Q- u4 A+ n7 z5 H* s" i
/*3 d/ P% w; W9 Z8 n
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
& ~* _3 r* ]: P4 ^, y8 @*/. V5 I0 Q2 P' ], J  Y: J- }
void GPIO_INIT()# T& U2 A: |0 \9 ^
{# r- x1 C: q0 Q, z: t( l
        TRISG = 0X00;        //设置RG口为输出, D- ~+ T- F7 ]7 j  F. Z+ G% z
        ANSELG = 0;                //设置RG口为数字量
6 }' y% y, i9 i6 C        LATG = 0;                //设置RG口为低电平$ j6 i/ g  D; Y' ]' e( D- Q
        8 h$ H! K4 |. v3 W% A7 K! l
        TRISF = 0;9 A1 ]& h$ e  u$ t, I! S; J
        ANSELF = 0;
$ o! D* N. E* A$ m        LATF = 0;
' c0 ]: I* f0 K0 z. y}
( X$ Q! d# }7 W$ x5 f6 Z4 u8 M2 k0 h7 j! W3 h8 r, L4 y3 F$ F" P- k# h8 z6 E
/*% W  G  z' d8 ~& ?$ A5 g4 o
*@定时器2初始化
% q5 l: |6 _; e  G# \  w' G*/
! I! I" r& H! g9 v0 k( lvoid TIMER2_INIT()
3 v+ B6 R6 w3 B2 d{9 E& J2 L% i8 D6 k
        TMR2 = 0;9 |% }" j# u) w6 ?
        PR2 = 255;                //255
# U8 T- i4 A8 M7 X7 y6 e        
! o# y0 V$ l7 j8 |6 B; g9 C, t        TMR2IF = 0;
2 o" j' X) y1 W* L4 [0 L) Q        
' v& l3 }7 E9 c        T2CKPS0 = 1;        //1
6 R+ ]/ w/ n' f) t  T( z. d+ f$ r7 y        T2CKPS1 = 0;        //0' I. f9 Q+ M. g  e
        & \4 i' w* _) K& `: G
        TMR2ON = 1;        ; h% w: ], |6 x  Y% B  K
}
7 @  V9 e. B0 x1 E6 q0 P
9 O6 t9 U7 e6 n' @& ^1 x/*
8 ~- h* r1 }+ w. T$ E8 x- w  d2 u6 e*@定时器4初始化
% e, {# Z; Y7 ~# i% b$ ~*/. D* g" T( O  j; c3 F
void TIMER4_INIT()
& d, J% l  S* K{! g3 M4 F3 C- |8 o: l
        T4CON = 0x0e;                         //0000 1110  _) t0 J# L6 w! K9 ]8 d
4 R) P3 u' R9 Y* k3 W4 _- t
        TMR4IE = 1;- K# h+ C! K7 X; m; `
        TMR4IF = 0;                              " l# V- R& ?1 S& R# w# @3 L" k
: a5 i4 I+ r1 t0 P0 o
        TMR4 = 0X00;
1 n7 v. g5 a! J% r: B        * s! e% q2 [5 e4 B' v
        PEIE = 1;
2 g, H) K! ~& z7 r        GIE = 1;
$ a! ]4 ^/ c5 [3 U}" q  M. W' ^! y  @" s! E
- {! V/ B& b  W: D
0 h# h/ ]4 N$ y
/*
* N3 F; U% `- Q7 M*@ PWM初始化
2 u, H9 D1 L2 Q8 Z0 i% t*/5 X$ R' K- p9 o; k5 n. }
void PWM_INIT()! U% q" O) B5 S
{
- A# N' a/ x3 \, [" m" Q' N5 G        CCP3CON = 0X0C;
3 b, F; j! l6 L2 s2 |& ~3 l        CCP4CON = 0X0C;- X$ V( X6 c6 m
        
6 X2 P+ j$ b1 j  a4 {: Y        CCPTMRS0 &= 0X0F;
% Q, L* X8 k2 }& o4 s        : i7 F0 Y- T4 O0 F* h; t
        TRISG = 0;
+ J! N+ `& E* U4 ?- C2 f}
6 s3 Z9 C( ~% d* K% A
9 X" ^2 L5 M" w# g3 x) }/ `/*
0 u0 F( Z8 R0 z! s4 _*@Function 主任务函数5 `  f+ @4 _6 V+ V
*/# P& n. l, N' ^: O7 L& f
void Control_Task(), \! p" Y" G/ a1 E3 r
{
$ M! h) u2 Y, G) t3 p7 Q/ ^        static uint Time ;' N6 }5 h5 ]4 x; E
//        static uchar State = 0;6 e0 i) q5 O$ J; g* G
        static uint Record_Time;
9 o! E  {: V' W7 I  M& U5 i        uint Delta_Time;6 j$ g& [+ Y  N+ d4 `/ l
        5 ~9 d4 n  t$ R( L
        if(State == 0)
+ o0 z/ l9 v6 {* H( Q        {& Y; ]5 z" n! ~, L# Y; p( x$ C
                Time = 1000;
4 Y% [) D' q4 E' ~# c2 @                State = 1;: I9 o  @& N+ p8 @7 Z. L7 H

! C; |' b4 Z- ~/ `        }
) @3 A! s4 ?" u4 R        if(State == 1)2 j$ z  G) j' ]1 b* M
        {
! E2 P; m+ b, S0 z# W3 D+ r9 R                PWM1(Time);" r2 j, F. Q  d  C! Z. X
                PWM2(Time);
$ u" ~, w( G( ^: ^4 b  {* ?               
( l" H0 f# T% v/ h                Record_Time = cnt_1ms;1 R; N  W( ?+ u0 C* R' Z4 g
                ( \! M. g/ U) a3 k% N" B
                State = 2;
2 r/ T  G, u* T0 p0 W* @, Q3 j        }' K% Y+ K7 f: q7 r3 @
        : s, ?/ [( e7 y6 Q$ {4 E4 `
        if(State == 2)8 G" _3 q; q# [
        {
1 ]7 w4 ]! G8 K                if (cnt_1ms < Record_Time)
3 A8 ], A4 z$ _; ?                {
% I, q/ R$ Z" k( T3 K, K                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
9 T0 r8 s1 z  p1 H  v  m3 W                }9 q4 G% K6 K$ m4 n1 d: o
                else
7 a7 Z: s+ O7 F: Q9 i5 W! @                {
+ S2 a3 H- Y% ^                        Delta_Time = cnt_1ms - Record_Time;                + S) U' x1 u" g( ^
                }$ T. w+ {: \& j! Z1 F
$ M' Z0 N' e$ s8 ?" i/ }1 ~6 |/ I
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
" m3 b/ r# d- W                {4 n3 b/ k& s' D: b% B& J2 U
                        Time = Time - 100;8 `, Q4 q" B+ W2 Q5 k
                        State = 1;9 t) }1 p. Q# z
                        
" B( K( w$ ]" z, @9 u                        if(Time == 0)/ ^, ~7 H5 {& X: `/ d2 {! i# e
                        {- i3 d: a  U) \
                                Time = 0;/ O5 y6 C3 k1 v1 n' V; y  i: h
                                State = 3;0 J- r, W; c) H" ^/ K3 b, }
                        }
, E. I, \; Y/ J4 p; R                }
/ _. O2 |8 T% {3 T, y( _        }+ v! M3 ~# N+ ]
        
' f3 i! @8 F5 I" D( l% n& y4 K( i        if(State == 3)
; P6 @4 |6 l6 R3 W0 Q- t5 j        {
- c! X' ?5 _: A- e% K0 O9 A9 L                PWM1(Time);
6 T  V" C3 w  c3 P8 O$ H5 P- s( k                PWM2(Time);% N: v/ W7 i: z  @
               
7 X; g. z6 A/ ?" u6 Y8 X/ G                Record_Time = cnt_1ms;" a: R0 q+ w) K
                % [- F  r. g. z- E# B1 `" E
                State = 4;
6 B" D$ m8 Y0 ~0 `  S0 J& X' j        }
+ s4 q+ p+ Z! I' c% @) D        
! G8 m$ z9 Y/ D8 t        if(State == 4)
4 H- T  F/ v% P5 P        {% W# @& C, Z' T3 E' C) l
                if (cnt_1ms < Record_Time)
2 x6 s/ @: B3 d                {/ E- q3 N) B9 n1 x' I6 O
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
0 X) z* l4 ]) Z* O                }
" N4 S* U# r# O$ {0 P0 ~; {- u; H                else
+ U9 `- T5 O" R5 B- y& ?; [4 D3 F                {
; e! t  X' O+ C; y4 e* _2 T                        Delta_Time = cnt_1ms - Record_Time;               
3 w( C8 H3 k8 }" I                }& T; x: l! R8 |2 W0 a5 w

6 r; R% ?  x; q. Y  M9 G3 V                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT6 R# T  U% T; I
                {& G, U, \% R9 i5 J; s  v- d
                        Time = Time + 100;7 C# }' V' W0 x+ |1 f
                        State = 3;/ w( R! u& \: {& Z5 r/ T$ D: R8 K
                        1 i& L' ?( T, C7 A$ G9 C) N
                        if(Time == 1000)+ `+ K4 s3 G# T8 `8 [
                        {8 a/ u) P% D2 ]7 h  W9 j: u
                                State = 0;" }) W1 P! B% r0 a7 ^/ M
                        }
3 O% z0 S# C0 |+ L7 V% f3 J" h                }- f1 I( w; r: L% A" g$ v$ O4 `  v. \
        }! J) }  K- X$ ^7 W3 Q
}9 X' `: X- D' J% P% j

( @8 l0 P- X! O  l$ yvoid interrupt ISR(void)
: {; Z9 U( S- r, d/ @, G" y7 V{
( z" Z1 k' `# U: y0 V& _        if(TMR4IF == 1)/ I$ z/ t5 ^( T" W2 o
        {
& R) ]5 N4 J! [( l# H                TMR4IF = 0;
9 t" q$ c+ G4 h) G' d: K- E; A" o                cnt_1ms++;5 S) r7 u" @3 M" Z+ f4 ~7 I
               
# E5 z6 z; i9 f3 I4 y5 A        //        LATF0 = !LATF0;
; c& S; _5 n+ Y        }        
" T4 |3 \( c3 `1 J9 b/ t- O}
! u4 A! f: |, X/ x

PIC16F1947原理图.pdf

533.08 KB, 下载次数: 0, 下载积分: 威望 -5


作者: Wenghezhong    时间: 2016-7-4 14:27
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈3 `0 h- ]8 b- i% [1 A2 U. U

作者: yhg-lee    时间: 2016-7-4 14:30
楼主辛苦了!# D$ J. \( C# q$ I6 B  w% B

作者: xuzwg    时间: 2016-7-4 14:42
路过捧场,谢谢分享!+ d/ j( q. u) M/ Z3 L' r





欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2