EDA365电子工程师网

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

作者: Hh0203    时间: 2016-4-29 14:20
标题: [PIC经验] 利用PIC16F1947的PWM模块做了两个呼吸灯
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:! G1 W1 O% j3 m# k/ m0 b
$ U2 `  b* M0 w4 l. |; a6 y
/*
$ I& ^- Y/ B9 \( a*@Name:        PWM_led
+ t0 N, d' p! K0 ?' T: K2 B*@version  1.0* T8 d( d+ V9 q) s6 b( X
*@Author        xiaopan6 o$ Z  j- W6 u$ G# g
*@Date                2014.8.2
* M6 D$ ~9 M! z. S: S/ A7 e*/
! F7 T& q6 E# O* n. ]
: L% v9 e/ N, C, v5 R: ]7 F& q6 @: y#include<pic.h>3 B8 y8 I1 v6 s0 j3 c3 H' d
#define uint unsigned int % _8 H4 b. _3 G
#define uchar unsigned char! r; e) ?8 n) w; [4 n
9 o! z2 ]; b, p3 K% x% d3 e* P
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
* H8 S: P: |& y$ M" F#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        0 v& J7 ^, K* [1 g$ \  l+ ]
( C7 j2 f3 N; v; Z
uint Time = 0;
7 K9 b, p, ]2 J: F- w7 b8 p! wuint cnt_1ms = 0;
; F1 Z2 e$ M0 K9 W2 [' duchar State = 0;5 E! |1 Y  J9 m: F' z0 P1 n

! W8 c( N7 G  r0 v* o( l, a; O% Mvoid GPIO_INIT();
' X7 d  o4 ^+ `5 _  lvoid TIMER2_INIT();
: u% ~* Z, u8 F/ A% L* Wvoid TIMER4_INIT();
/ ~! n8 @, |& G- ]4 H. ^7 yvoid PWM_INIT();- F1 K# E" p8 ?8 G1 \7 `
void Control_Task();# s& Q6 k+ U" ~9 L
# {2 f3 \0 Q7 {3 p0 Q2 |; ~) P# _7 L9 Y
/*
8 J' x: X+ r$ ^5 q*@function 主函数
# h) F2 P" D: b7 ~3 N*/
$ m; D& n9 `& h0 y* Wvoid main()
9 Z7 t) x" g: F' j2 m* @& N( B{4 [! u4 ]) }- R/ M
        GPIO_INIT();( n+ ?$ ~1 V3 V+ [3 x. [
        PWM_INIT();
& u# q( i0 t4 Y& s' u        TIMER2_INIT();                                //PWM利用TIMER2
4 r5 W9 C8 \9 F        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形8 w; `+ {: x- D$ g% z' e+ M9 A
        while(1)
5 z. Z# c  m/ g& J# M        {( t6 E/ w- b4 S# s+ W+ N# X& s& C! w
                Control_Task();0 @8 g% N9 {; ~  o' S% ^) }2 u
        }
9 q/ ^) U2 h' E0 M9 c}
# s8 L4 s9 ]  @$ B% b/*
- c" `; D" Z5 G) d2 g*@Function                IO口初始化 RG0        CCP3        RG3        CCP4% U, M! R. y# v" F: F: p7 p
*/
5 I" E) z  F) {! D7 Hvoid GPIO_INIT()/ }: z* _. v* q, W* P
{" h+ [. Y& A- Z3 N0 C
        TRISG = 0X00;        //设置RG口为输出6 ^8 D1 Q  e/ |, Y
        ANSELG = 0;                //设置RG口为数字量9 Y1 k9 n# q( x; J
        LATG = 0;                //设置RG口为低电平, E9 P/ d# X% w) E9 l1 z
        
. f( _  K# j6 d        TRISF = 0;
7 z, i5 L' z( N6 z        ANSELF = 0;* m) @, ]4 \% ~# q* J: @
        LATF = 0;8 ]+ d% n1 T8 T6 C2 c  B
}0 u, u! f$ i7 N2 z1 U7 X

, S. l6 D. v5 g9 J, s( M' s/*
- [! o, W% |" q- G: \*@定时器2初始化% t, k4 R, s! c2 k' {2 i
*/
) e, l; v# u+ Pvoid TIMER2_INIT()
6 t: D# H7 u9 h- n' v" Q% g{
. D* p( C1 n. |! y9 |        TMR2 = 0;
$ n. I& V" l  R  J# d        PR2 = 255;                //255
' X: N* r% M+ N        & |! _6 o5 I/ S) w, _7 T, G
        TMR2IF = 0;
* g! ]# ~: s+ U3 `        ! A! R8 N) b! n! M
        T2CKPS0 = 1;        //1
* I4 I# k; [7 S) L        T2CKPS1 = 0;        //0
' r( j) B! S; s6 Z7 x5 ~7 m        
2 Y, ?4 W) t; S) o        TMR2ON = 1;        % ~+ h+ r& j+ J  _, A
}6 A8 z8 ~9 L( \
: d9 P  u3 j7 l* R
/*
8 h1 V, s+ e- V' h) m% V5 D*@定时器4初始化
- m) y+ K6 Q' \8 l% d*/+ T/ r! D( Y9 U1 x
void TIMER4_INIT()5 u: L9 m$ B3 V" }+ e) [
{' Q9 R' \" {# E& x5 t7 b; q
        T4CON = 0x0e;                         //0000 1110
/ k( E( y9 E5 F" t9 U7 ^( I
: Z! F6 C5 e# k: i! X        TMR4IE = 1;
' t  [# k, V! W6 E+ u        TMR4IF = 0;                              5 `: _# r1 Z5 d& Y
7 C9 |- Z" S; ]' ~' W% E/ c: o
        TMR4 = 0X00;  Q+ K* `, t8 H
        
/ f% o6 N( P, d/ ~9 i+ A* ?' O        PEIE = 1;! A6 L( U# N4 q
        GIE = 1;
9 Y1 N6 q' d5 X% G5 b}
3 r$ y, m- K' w- r  [1 \$ h) z/ W1 G1 l4 X/ _& }

2 C9 _4 k3 D5 g' d5 ?9 i9 Y/*" m7 J6 z: U  W( [# h, F+ ]5 i, h
*@ PWM初始化( j0 {5 c; j+ M1 R
*/7 U! V% v+ `, R1 r/ Y0 Q7 W
void PWM_INIT()
' w2 t% Z( E: J! p3 |6 o) E6 E{0 u' M$ l7 o2 N( U/ w& c
        CCP3CON = 0X0C;
1 S& F: }* O" C' N  b) f( o7 ^        CCP4CON = 0X0C;
8 ], O3 r6 p3 E7 ^9 y  G) `        . n' N! K! T; U% x; e
        CCPTMRS0 &= 0X0F;- D4 I: O" C* ?+ V
        
5 n: \3 E7 S. ^* k, j4 ]        TRISG = 0;
% i) W* v& U* ^% Y" L}
+ O9 r0 y% k$ D1 z- t# z/ A; D( }% [) S$ y
/*9 e, z/ s: H( Z7 A3 N8 }
*@Function 主任务函数$ W9 Z2 ?: v4 I: Q( K* d# k! L8 @+ m
*/
" X8 i8 o2 L1 P: @4 uvoid Control_Task()
: c* ]! B( e) u; b) X{
6 _6 r' Y5 E4 o5 `& e/ r        static uint Time ;5 t9 y* b6 n# m4 {9 u
//        static uchar State = 0;
: K& I/ N& @  M% u        static uint Record_Time;
9 [3 E3 Y& ~: i        uint Delta_Time;: _7 k& v. g5 Z6 {- l) l& c( H
        $ W+ I, v& J" E2 {; q4 f- T
        if(State == 0). I2 k, F7 n2 L8 f
        {7 K+ }% W% X) Y# r7 C
                Time = 1000;
2 N) a! q9 f. g- p1 `& y5 W- Z                State = 1;" m$ @5 V3 {0 M
* k! O$ N1 a$ c; A+ g
        }
7 r- I1 B; y7 q0 @) l! c        if(State == 1)9 g4 T- M* l& E* k
        {, y  x  I+ S3 `# V* \8 T  e
                PWM1(Time);; g2 y: J/ n# h: R3 M
                PWM2(Time);
8 p* [1 w3 r3 h4 |. A, B3 J% I2 o) P               
! J( I; F4 O7 F                Record_Time = cnt_1ms;
: k% b8 u+ b9 o! ?. ?" v               
5 N* f" E/ n5 N6 S+ P8 L/ F                State = 2;
  e" a: e0 [0 P        }
! q4 z, ?3 B4 y9 m+ q        
" a, a& R' |+ W, ?6 \        if(State == 2)% N( Y0 _) r6 {4 {7 c
        {+ x( x3 g+ F8 @- f3 A# A
                if (cnt_1ms < Record_Time)
1 |- m  I" y0 t0 F                {: F) {; Y/ ?) T: i6 M0 c1 p& M7 n
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        * U: k5 \, ?# h+ R) }! J! y
                }  i7 Y3 |8 h# ~6 y& \
                else  z" M& E+ p" h/ [2 w& Q6 N
                {6 B6 h5 ]7 z, L* L' C+ D
                        Delta_Time = cnt_1ms - Record_Time;                # ~- k% D- [6 O3 Y* y& @! @2 X: a0 ]& y
                }5 b8 N0 p1 ]  ^0 A3 Z9 a. |8 {
) |6 d. z6 G' q$ D  H* B9 Z
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT; A* R, C2 f" t2 M, ^5 H
                {
; E: C2 B2 S( a# I                        Time = Time - 100;
0 s6 F, ]3 @+ j2 U; J( B                        State = 1;9 N" u( P; i9 _0 h
                        
6 W8 Z9 @) n& ^. Y; T+ o                        if(Time == 0)
" Z2 Y8 P% j, P( z# Z/ w% _4 D                        {
5 x+ ~2 \9 ]! y  Q; [                                Time = 0;
' L7 Z+ H& `& B/ A& D2 a: U' w: Y                                State = 3;- H9 ?2 k  ]! v+ e" o# X1 t/ b
                        }$ t/ {+ T8 V, D/ {) n4 v
                }$ F0 `6 H$ @) R0 _3 @
        }. R& {4 v+ r( d) u& S7 b
        
( V( ^% C- A2 o3 N        if(State == 3)8 O* A6 D6 n, ]% G' ]( K& h0 Z
        {0 @/ N, u- ^  {, V; p* ^
                PWM1(Time);
" j" L5 Z5 o) U; g' ~% y- Y0 @# A                PWM2(Time);
, z7 \. [2 H2 I5 v  j/ @               
  [) Z& O/ s4 W1 }* T                Record_Time = cnt_1ms;+ n+ B- {8 j( l) ^8 l1 `
               
7 f) L" }8 {6 x5 e( z$ r" c6 U                State = 4;! Y! b: M9 e2 h- A# ]" A; {/ @
        }
5 t5 y, f% s1 R- ]- L; W        * G  g8 Y8 [; f
        if(State == 4)
+ ?% S- f* h/ C        {8 q( I5 a- P9 g9 `5 j3 \3 l5 i2 \9 Y
                if (cnt_1ms < Record_Time)
9 k+ n" q0 P* z4 z& ]* c: d# F                {
* }) Z" ~3 |' U( L9 B                        Delta_Time = 65536 - Record_Time + cnt_1ms;          [: d3 z* ~/ D. X' e
                }, ?, a8 {: d9 N
                else
9 V& J0 v6 [4 L1 l7 ?, a( z                {
9 o* I# V8 g) p/ T" A9 v1 m2 W, w$ x$ b                        Delta_Time = cnt_1ms - Record_Time;                6 x+ l% K$ ]5 A, H
                }
1 B% n  |+ N# ?, L2 h3 |
/ I, [3 O8 E3 j                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT& [$ X; p, Z% Z, F% P( x2 A0 k
                {  p. n, z: S! |7 ^
                        Time = Time + 100;6 {, a  K& R9 k9 g( v; ~- l2 N
                        State = 3;
& O3 E3 x8 L9 g1 Z2 @                        3 K9 A8 x% ~7 Y" s3 H& a$ Z5 E
                        if(Time == 1000)
' P0 n) F6 X8 t9 ^  ^( L: q) n                        {
) ~3 j) y  a% G% G) w( h( J                                State = 0;, S5 V' H9 ?1 s5 w* D  n" h
                        }
3 C' l. a+ J! S% e" q0 B                }
7 A9 x$ ^7 k1 Z. |2 H1 s5 R        }7 M* O( y" J7 D9 ~& S" e4 a' \. T
}
* b5 B; z2 V4 I, Z% ?5 D. Q0 g  L( P% P" G
void interrupt ISR(void)
- p  D0 @2 `& M: o/ y8 ^{- f8 y( @. l2 ]/ C" M2 W
        if(TMR4IF == 1)
) B  m( y3 q0 X% \        {
2 r9 z- d3 k4 Y" Q. S) o6 k! s/ B5 l                TMR4IF = 0;6 z/ `% @. `( n- C6 y. k
                cnt_1ms++;
8 z' G  Z1 f$ X' H                6 ^7 w/ N+ @: f5 A
        //        LATF0 = !LATF0;
& w2 Q! Y; `" j' `        }        
$ U1 F' m+ b/ o6 q: {2 R& [}

PIC16F1947原理图.pdf

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


作者: Hh0203    时间: 2016-4-29 14:21
长久的日积月累!




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