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

[PIC经验] 利用PIC16F1947的PWM模块做了两个呼吸灯

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-4-29 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:/ y7 n& _) c8 i6 B  J% x9 ~' R; p
+ @6 B' \6 _  @7 V$ ^- Z2 ~
/*% x$ i0 S$ w+ w5 D/ o2 I! w8 N
*@Name:        PWM_led
7 M4 v/ Y9 M6 V*@version  1.0
! M5 }$ p$ N$ s( S*@Author        xiaopan' m$ N/ c  n7 W
*@Date                2014.8.27 i; C/ ^: s* [, O+ Z# }  T
*/
& N8 L/ [8 d. ?4 X0 {0 ]9 n* `  J& v
#include<pic.h>
% M7 {+ [* s; O  \' C! D& G$ i. H#define uint unsigned int 1 p3 r3 i9 u3 v9 [7 W9 t0 f. `+ Y
#define uchar unsigned char. [, x8 N  Q/ g0 V. E

: [0 z2 n1 ]2 L  x$ [7 `#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1          i9 ?3 @! A% Q5 Y
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        5 [9 Y9 S3 f2 n# d: h9 z. E9 J" Y

8 a! ]/ l7 \- ruint Time = 0;
1 `4 J+ \* Z, O4 [uint cnt_1ms = 0;$ @/ X& @$ p4 Z' z. h" l4 k, c
uchar State = 0;
3 B: c  i+ M  T3 L2 R: [4 n5 a8 {: k# I1 ?: D' E5 q
void GPIO_INIT();' o/ _) h1 b6 x9 H- K) L  J
void TIMER2_INIT();
8 |8 m, E5 |. c$ g& y6 O8 ^+ qvoid TIMER4_INIT();
9 ~, ~! g( a& h7 `1 ]$ Dvoid PWM_INIT();
( i1 q  U% M4 V  U$ Fvoid Control_Task();4 @5 c; O9 V  d0 D  ~, Q) i; `

  |0 Y( ]5 ?, u8 U# S0 a/*: R! A1 x! X  A& B+ E+ u
*@function 主函数
' p* T" ~' D0 E- s" W1 W! b: V*/
1 k  F, V9 w( O; Tvoid main()$ v2 E& w0 l; H3 _, b" {, _3 x! i% a
{( D" `0 n3 D: ?) x3 S! d  R1 I6 }
        GPIO_INIT();+ i$ m, l0 }# @
        PWM_INIT();) A; z6 R9 J  A$ c
        TIMER2_INIT();                                //PWM利用TIMER2
  k" r/ L- x, ?* ~: [3 [# B        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形9 T) }5 B$ [! [1 |+ b- t
        while(1): M- ~* I7 Q$ w5 y4 `
        {# W3 @& J/ {  V, d
                Control_Task();  a  C) ^( q! Y
        }
& O9 ]9 O$ n' j5 v* p, u& Z; u1 F5 E}8 J+ W/ w( v4 w0 H* M9 J
/*
  }( u( i2 g& P! C8 @$ R4 J5 T*@Function                IO口初始化 RG0        CCP3        RG3        CCP4& A* i) r/ F/ [
*/
, A4 O3 s5 m9 R* dvoid GPIO_INIT()6 K  b6 q! R6 o5 S! `) z& g' b
{9 J* @$ m" T  a) u  f  D& t, i7 I
        TRISG = 0X00;        //设置RG口为输出
1 F- X3 |0 L6 q: b        ANSELG = 0;                //设置RG口为数字量9 f& C* T* ?* N' s: H1 M
        LATG = 0;                //设置RG口为低电平
. |1 U7 j5 z/ i) @        
, Q1 Q! R* Y/ Y  [! M' C        TRISF = 0;" Z* S- d. H8 \
        ANSELF = 0;
% d# v. L8 J% J' t) l5 `* S        LATF = 0;& A4 b4 e: {  O0 L' c  O
}
; O1 u* o& e/ q# v2 \, A2 e) F  v6 V( ]
/*$ [2 j& D: i0 C( g
*@定时器2初始化
" K; L% p4 n/ z+ a& _*/8 Z7 J& ]4 x. Z4 b
void TIMER2_INIT()
8 l$ V1 w/ e( f1 J5 g7 R: t{
( Z, K! g! h: d& i4 D3 S: {7 ?        TMR2 = 0;
) q6 T4 ]2 G/ n  e& Y" O; U        PR2 = 255;                //255, x: J3 ^. ?: g2 y
        
: L; e( U0 @" b6 @6 `  `& x4 U        TMR2IF = 0;3 Z) Y+ A5 C6 c3 [8 K6 I
        5 z" {# U* e2 }8 b& n
        T2CKPS0 = 1;        //16 P5 }/ A2 s1 p6 J& K; c4 z; z1 |
        T2CKPS1 = 0;        //0
$ b" H8 {5 j: @2 X% f0 j) x+ x        & w# S6 W/ n" m9 ~& y
        TMR2ON = 1;        
9 ]5 J) m4 v. ~2 m}9 W3 h) g5 r, u6 I9 S- D
& T7 ?! k/ u1 f
/*
% c8 `5 d7 {* C+ ~*@定时器4初始化( Y6 V! b; j/ K2 A4 t% g% o  k( g: [
*/9 F, c7 B) H, s9 Q( b( h- |. b; [& P
void TIMER4_INIT()9 W1 H1 ?0 B% @% S% D& E6 A
{' B$ a; y& X  B6 D% x. _5 }; g4 Q  s
        T4CON = 0x0e;                         //0000 1110
. _) |6 H6 K: e8 A3 q
+ b% ^! p: D( E5 o0 n0 O  S        TMR4IE = 1;
3 E; l* o5 O9 ?. J        TMR4IF = 0;                              
1 \. t( u9 i. `7 F) w) }5 |( j8 K
4 W5 M# S/ H& ~, s% G) l0 J        TMR4 = 0X00;. I! t) Z2 x$ |6 Q/ Q
        
2 ~. w$ W0 l& }/ i6 I        PEIE = 1;. j# J2 A& M0 b2 M0 f
        GIE = 1;6 l: U, p, V! W6 D
}
+ @6 ?; k0 F' @$ l. S8 ^! y' F" `# J4 a5 K/ Q- Y" W
$ g) q% `) E3 q0 i2 O0 T
/*
7 h" k# V+ q0 k5 @$ b) p*@ PWM初始化
  U- Z) W. u; F+ ~*/
5 g6 z& L' X* P6 J! M4 hvoid PWM_INIT()
3 E+ b1 e" p# ~, g{" H/ u% u. _% a5 L# L+ X/ ~
        CCP3CON = 0X0C;
/ i3 ~9 U& I* t, N$ j" H, A4 d        CCP4CON = 0X0C;
6 r! R. B7 K5 x" @        
2 w' M5 C9 i6 A# }' G! B! [( Z0 b5 W2 h        CCPTMRS0 &= 0X0F;
! r6 o8 @1 U7 }( v1 }3 @        " T; {9 l8 l. O( g; `' _+ _
        TRISG = 0;
1 C: d# Y  X$ |! v}5 q: ~! v4 o  f7 d# ~* V4 `

! A$ t1 }, w* N1 A; h/*5 e( q1 S5 F, W9 r- i5 J( ^; w
*@Function 主任务函数% t: w4 P3 `+ e/ I! y: P7 r
*/
) W/ y% b! V- m1 v1 v, e8 N# evoid Control_Task()
, u! ^& _9 f& r{
0 Q4 e, u% Q& ^        static uint Time ;
4 V& {: o4 O  p) C//        static uchar State = 0;
* h# c6 h4 @  Y  d% X7 D        static uint Record_Time;. x  i* W: ?; y
        uint Delta_Time;
: c% ?  V) O, [) ]% f        4 `* {* E$ O. D2 ]" L0 j
        if(State == 0)8 P6 L2 y' Q# p
        {
7 q& Y+ @3 C/ k+ P$ V+ X# k$ q                Time = 1000;
  R6 \2 t) M+ |, s                State = 1;+ S0 z1 O. X/ \+ j

5 \1 n: b/ y; h- G: \% F8 f        }
# l5 w! Y7 y0 N! e% G- s8 Y        if(State == 1)& c( ?* H6 ~  E$ C4 m) S4 m
        {3 O0 p+ d9 h. d1 W( `) ~6 p
                PWM1(Time);3 _! \7 H; ?. E& p" t( y2 ^8 g
                PWM2(Time);
1 _- H+ S7 R, m, O1 _" b                ! q* ]7 ^' m8 S' X
                Record_Time = cnt_1ms;6 d& B7 f% n0 y0 U+ R' \
               
. c8 n  N# Q8 Z/ M2 q0 `                State = 2;
8 h  r7 D. k6 |8 o5 e2 f+ `8 I1 N        }
, G$ v& A: E9 O0 R        6 O4 h7 B" S" t0 X  M
        if(State == 2)
9 s1 [; B) X6 n        {
1 Q' q/ @# H4 A! o4 I                if (cnt_1ms < Record_Time)
7 l" }4 l  |) \3 {                {
' ^/ W; {8 t. U+ x                        Delta_Time = 65536 - Record_Time + cnt_1ms;        / `. Z( R' L; g
                }& V% @7 z$ h# y: O
                else) O( _( }1 Y4 x3 \1 M2 T
                {
5 L/ F! o4 c8 C: X7 [6 p" s1 T  }                        Delta_Time = cnt_1ms - Record_Time;               
& g) W4 h& ^) M; {5 W, M                }
+ \/ S* O  A% p7 ]: n+ Z! \3 d- X) {6 f; q. ~, ?  U& }
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
+ Z2 L: U" }# |+ H% i; o; F0 h+ q                {* i& ?8 ?. @+ }; L! l/ [
                        Time = Time - 100;
( Z- Q0 T1 H+ @$ A% c# D7 u# N  J                        State = 1;
: A6 w& o, Q+ a; l/ h6 W$ L                        
3 Z7 G0 p# v# v                        if(Time == 0)3 h. f: Y$ ^) L( ]& M! _
                        {* C( y9 ?: Y  T4 b# i7 A
                                Time = 0;: P( K2 H3 S: R! y( Y
                                State = 3;
2 j9 X2 z: V" u: o/ \                        }# |, \# y# ]# z% \
                }
! A1 c  U0 g- ^3 r- K0 `        }2 M% |2 ]  K, k) M( Z
        
* n- I) W+ D$ G9 @4 _. j; t, O        if(State == 3)# B- l5 R7 W, H( |0 {. f
        {
, U6 {6 U, Y$ v9 {                PWM1(Time);9 y) D6 s# `  p
                PWM2(Time);
2 O% e4 d$ D2 e5 \3 L! j! ^               
) t0 O' |7 l% d( z4 A                Record_Time = cnt_1ms;8 U! R; f! l  ~- ^4 ]
                - d3 p% _2 z/ M; }
                State = 4;: y; j8 Y  e# x
        }
5 T# s: ~+ B" X0 c1 A, v        
" t6 W' G( ~! L, |9 [  z        if(State == 4)
3 N0 q! C8 k; n6 k        {. P* S" z' f/ S
                if (cnt_1ms < Record_Time)
, t5 b; z3 B% k                {
1 w1 I; ^+ f- a                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
" q+ s9 ^- ]& |- @                }" E/ \: b+ x9 i! F6 [0 _
                else1 [  A/ x0 u: c/ y# k3 D
                {
0 b9 r% o! B3 N2 z* I1 h' S; f  F                        Delta_Time = cnt_1ms - Record_Time;               
. E7 a( o2 L) a5 c  Q                }' c6 x2 x) e7 ]- v' L/ M, u/ [

5 S! i- b; ~) q( A; Z                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT7 e3 X$ \2 [; S
                {
& ^5 x! p6 W" z  J% C( g                        Time = Time + 100;
7 p5 Z0 z/ l8 F; j5 N9 {                        State = 3;
2 x% S0 t2 s9 k" w                        " p$ r2 b- e) O
                        if(Time == 1000)3 ~) n1 Y# \$ N) l
                        {
8 q' b0 X, i: r2 \  B8 T                                State = 0;+ U" D8 A/ h; A/ r3 a
                        }/ @8 _" [, t5 p
                }
7 ], L8 I1 ~$ z1 N4 }        }* f+ o8 _" i2 G3 N( X
}
% O5 [3 C6 Q! X( k( H4 _/ M, u) o6 ?
void interrupt ISR(void)
4 }( O3 y3 m+ O8 u( h1 b7 U9 R" q4 u{% {) a. m6 }  H* ^
        if(TMR4IF == 1)
  z7 F  V( G7 [/ S- f        {
2 Y/ a1 Y8 m' C                TMR4IF = 0;  N6 @( F0 P6 t; J# Y
                cnt_1ms++;
. v+ q; a/ ?+ z8 J7 \! ?               
& i" [7 V  |8 |1 t) [6 a        //        LATF0 = !LATF0;% t* T( |* G% f0 d- \& L* c& @; L
        }        $ I- D0 N4 E$ O2 g% a, a) C4 I
}

PIC16F1947原理图.pdf

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

该用户从未签到

2#
 楼主| 发表于 2016-4-29 14:21 | 只看该作者
长久的日积月累!

该用户从未签到

3#
发表于 2018-11-6 10:08 | 只看该作者
感谢分享经验。正在学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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