找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 333|回复: 1
打印 上一主题 下一主题

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:/ Q: T4 u$ C1 @8 ]

7 l" ?1 i8 R5 I/*: N3 r9 [/ F: K
*@Name:        PWM_led
, x( ~% S% H( b( b0 H6 `0 J# ]*@version  1.07 G: i$ p2 W/ B: M- b
*@Author        xiaopan1 l" g6 u3 ^3 ?6 k& |
*@Date                2014.8.2
0 N: h) X2 F6 K2 W8 ~. D*/
" |5 F4 r2 J6 x- w+ P" k+ v
0 U! c* Y! u/ U1 b  J$ m#include<pic.h>
) a# Z' N8 ^+ F- R0 R5 p; k* r2 d#define uint unsigned int ! T6 |& z: P. Y7 G( Q3 q
#define uchar unsigned char
( g5 }( B( g2 ~- g) t0 Z8 D9 [1 t4 b
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        * ~4 k5 E* ~1 I# q' t+ J
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        ' ~7 o* q/ O! w- ^

) r: s4 c/ W# P' N2 Q; |1 m) _* Iuint Time = 0;  ]+ g. y  F4 z
uint cnt_1ms = 0;
; K1 d) g/ A8 y6 y4 u' auchar State = 0;, [3 k% t0 }/ w
9 t3 L; |  S& z$ E
void GPIO_INIT();
+ \' K/ Q3 z1 N$ j8 D0 Z- Tvoid TIMER2_INIT();
7 b9 W0 P' H' v. y$ O7 E& W+ Ivoid TIMER4_INIT();9 O! N1 L1 v. h" r7 i6 T  U  [
void PWM_INIT();
# ^9 T! ?$ }4 Rvoid Control_Task();6 p- S  x' G$ n. F# @( Q
% ?( e! ?6 y3 R; E8 ~
/*
7 g" a- j; x5 n) X1 |7 K6 C*@function 主函数
9 u0 a; H: H/ ^1 e7 k*/2 e2 F! R  d! T; K! p
void main()! U4 _, l  L" J# N; H
{: T, Z" c# D! ?1 s+ ^& ~
        GPIO_INIT();4 I3 ]# }% x+ @8 q1 c% @
        PWM_INIT();
% i' _/ L+ A, s# ?: I        TIMER2_INIT();                                //PWM利用TIMER2. {* d2 U, }; o& s1 X
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形8 N! \0 x1 n4 t" D/ n
        while(1). V- J( x4 H) ^& [) Q
        {, i) a2 E( P0 _/ d4 E
                Control_Task();6 c- d' a, ?! o8 t6 s
        }( Y7 ^! w9 y2 k$ U: f8 H
}  Z* z  Z8 @$ N, E$ ^' \8 N( d
/*
5 e" m# U" ^! d- E4 e# Y& z. k- e6 I*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
9 U! |# l9 l  ]' p7 }% A  ]- Z*/
0 e, R& `* K2 ^: Cvoid GPIO_INIT(). ]8 f8 j) m4 m9 |& B# T' U' T
{1 X8 E- Y* D2 S6 ]' `* g5 b7 U# K+ `
        TRISG = 0X00;        //设置RG口为输出3 u" q  b' @3 M. C
        ANSELG = 0;                //设置RG口为数字量8 G4 Q* t( t6 ]+ J1 W4 l, w; g
        LATG = 0;                //设置RG口为低电平3 o& r0 Y2 `3 ?8 ~' a% U
        / ]# U2 ^! b! ^9 Y5 @4 s: E
        TRISF = 0;& e5 l1 C$ P# k7 u3 i: v; v
        ANSELF = 0;2 z2 }" d9 c/ e0 j" i! q3 b+ X4 }/ w7 |
        LATF = 0;
. ~7 [4 i6 \7 u8 a6 z5 A8 d}
0 {0 ]. D" U0 U; m6 T
9 [$ {3 y2 I: Q, I8 o' y; [/*8 W7 E. v! }& A# H8 C% W5 }
*@定时器2初始化2 ~/ }# s  m- N8 D1 _- r
*/
& i( Q1 |' N* Y1 K' m; d4 o0 s) zvoid TIMER2_INIT()
5 p: U) \$ c; M1 S' O% `{* E4 S! M# k2 |+ I& {
        TMR2 = 0;; }  A& {. p. x
        PR2 = 255;                //255
& [( d; L5 g; M8 _  d% O! |, ~/ s        " J% B7 c5 Q* b/ R, x
        TMR2IF = 0;
5 n9 K# U  q# Y3 k! M$ x: }        
+ X  ]# o$ a3 |/ V' O4 a        T2CKPS0 = 1;        //1& x* m* r" q- o8 K' P
        T2CKPS1 = 0;        //0( e# U4 m8 _- }( x7 _0 v2 F4 g
        ; x: J, W" [8 q+ L3 O
        TMR2ON = 1;        
2 W) V0 a) s+ f+ U6 @, g}4 A$ X! T( U. V: }( }. V

* y  W. S( g1 r7 H/*& P8 e) ~' Q' I5 C
*@定时器4初始化
  l/ S/ z' `# l! z  `% d- q* N( I*/
3 _* I0 m0 U8 [! G( s* dvoid TIMER4_INIT()7 d) ?% \" E2 F1 a
{4 f, P3 K* ]9 g& |" `
        T4CON = 0x0e;                         //0000 11101 M$ J; s" H8 n
8 w$ e) X1 _% `- g+ I
        TMR4IE = 1;  j8 r$ r7 y+ G, H! t, J/ w8 T
        TMR4IF = 0;                              
+ L) S' g; {% |! ^6 i4 h# S
6 J4 Q& e# o  H; y2 k. L        TMR4 = 0X00;
6 P/ u+ ]. J; e# Z        ) Y1 L/ V8 z) `0 i7 @
        PEIE = 1;  \8 v3 v. O/ l: O
        GIE = 1;" u! h" T5 G8 u& l
}2 _( U6 _- o1 p( Y1 v

% P' t" K3 }* c4 X: N
" e! E8 y. g- C" W$ `& \/*
" p! k# f7 A* X0 N*@ PWM初始化! ?0 m( R. @* N( B( z8 q
*/' j8 E/ |6 P9 @# B6 G" r
void PWM_INIT()
) p9 _, U4 {4 _* q% O{" i; t+ i6 d/ H" @: G
        CCP3CON = 0X0C;" D- E# R) a3 O, |
        CCP4CON = 0X0C;/ D8 Y, ^4 z* R  A
        
; N$ K3 D5 S( l. r        CCPTMRS0 &= 0X0F;
7 f# w( G, E# ?$ S        
+ S: J( `: h0 u) v        TRISG = 0;
' p" f5 C9 f/ M5 D' E* m}: L; [  [: [) \0 m) u
+ e2 r* F9 i* a  R6 V  R2 a
/*' j* N, p* N8 l8 t# m8 ]( l/ l
*@Function 主任务函数
$ b, |- ~! Y' m7 a1 P*/2 H# N# c# d: P8 w
void Control_Task()
! a* z# R. o! Q( z) l' E3 H{
" q' H6 y0 g: T" n5 E1 u  \; k        static uint Time ;+ K; D" M2 [  S0 a0 r( p
//        static uchar State = 0;
. X: D& k- O+ Z) N1 s( g        static uint Record_Time;  K/ s6 A4 n8 x5 G) i& T4 e
        uint Delta_Time;
& d' ^6 n' U4 M' W/ C  c5 ^' `        % h: l* E2 n/ V  F
        if(State == 0)
8 y$ i6 h- B8 T& }; N5 _6 W        {( f( B4 s( o* g; Q& q  l
                Time = 1000;
7 m$ ^6 f  _, y% }! B) i2 D" X                State = 1;4 M) f0 r8 n1 _  M

& u! W' e8 E, b' P        }
: w# a7 n. a- `* d6 y        if(State == 1)  s; n$ T% n& _/ S
        {
7 C$ Z4 P2 S+ M/ Y                PWM1(Time);
! S: ?3 a0 y* J* D                PWM2(Time);* A- i$ `) g8 i! k1 u
               
- E8 A" e& v; @; m3 S& T# w  N                Record_Time = cnt_1ms;
1 d2 F: r- H) c' ?1 W/ z1 d* q' I8 L0 d               
' Z' \. [, C+ t2 ~' O) {/ S                State = 2;6 T! I7 c  d- e6 {- H
        }' N9 ]$ m, l8 X' z2 A
        
0 K/ C( C* v$ N2 d2 G% V' y! B        if(State == 2)  \. Y9 @" O6 }. r0 ?) k
        {, L& w- T- A# |( v; z
                if (cnt_1ms < Record_Time)7 _3 }; v* p( z" Z) f) z
                {
. ^- r5 P  O& y5 k                        Delta_Time = 65536 - Record_Time + cnt_1ms;        ; n7 m, P5 t4 Y/ X
                }* Q% S7 G" c) M6 t# D7 B
                else9 T' F* `. M) X
                {2 ~: v5 `$ w4 ?! J' Z& m
                        Delta_Time = cnt_1ms - Record_Time;                / e3 h4 T$ L+ o/ [9 H& D- u
                }
5 G6 \6 g4 ^& I- K$ l  d7 f( \
6 F* [' z$ f! q' z) ?6 f6 V0 e                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
9 q/ R$ ~2 A7 e1 b0 o( C% ~* Z                {
9 R# u+ g% I' b, y                        Time = Time - 100;" K$ G3 ]! U& K7 O: m6 P5 A  n% z
                        State = 1;$ `4 ^, q0 T; @3 E' s
                        
" A' [3 h$ t( G1 b" J* Z. G  N                        if(Time == 0)
! C5 l# R: G1 g; G                        {
1 s. e& m" K( K! [% q                                Time = 0;
+ h% k4 p) E  s5 |* k                                State = 3;
$ V7 f" O" R# w, z: Y+ R                        }, `% N2 r9 A4 O" T
                }
; S& E/ {! X/ W& k7 U        }! b- {  W; P$ |$ W$ M; S) t: }
        & I1 [' K6 Q2 `. B* [
        if(State == 3)+ s6 j: d% q9 @' V
        {
$ L  F* g' t0 a7 Q                PWM1(Time);. V% q1 A& ?* I: ~0 w
                PWM2(Time);: w% `) X( _1 y- U3 i: Q* o! [$ r
               
0 W+ l1 Q4 W8 _" d; z                Record_Time = cnt_1ms;* |* ~! a3 E* a. U
                8 i5 u3 i4 f" F. k2 y2 z8 C  h3 y
                State = 4;
8 F( o; D# |1 _. ?) b- _        }9 G! ~# z" P  Z& W7 E& g
        / g2 t7 D2 h5 z5 o, O2 r3 C
        if(State == 4)
3 H  ^. l6 B1 W- A. b6 L        {& F% U( _: B& [/ D7 V
                if (cnt_1ms < Record_Time)2 C, s4 H8 B& _0 j6 d: S" R2 i
                {
; H* a; M7 Z1 a+ V                        Delta_Time = 65536 - Record_Time + cnt_1ms;        - p1 ^+ V8 v" W6 J
                }
( m9 F6 I  i: R+ p* i; B                else
$ g7 k5 t( ~8 N                {
/ M; O) d* S' }# c$ V' \' K                        Delta_Time = cnt_1ms - Record_Time;                * N2 F% B6 z& h9 l
                }
& z; r' J# [  B4 r
+ x1 N  f* @+ W. e9 ]& E0 S: c6 Q                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
/ c/ ?- A  B) y! A4 v                {, C# ]4 y8 T" h( b, j) d$ w. N0 U
                        Time = Time + 100;* }3 g& A" |; ~
                        State = 3;/ i4 S8 q& ]7 ~/ ~+ l/ [# @
                        / X7 [% P" L$ c1 l  S- p
                        if(Time == 1000)
! X& K" E' v8 g  B& N* z, u; v                        {6 B* b# g# ?1 f
                                State = 0;" t+ l% d6 M; j  h
                        }" t0 H# s6 A. N2 x1 f' e) O4 K' k1 j
                }8 [6 O4 ?$ m( a4 }
        }6 j1 K! n: I" J. g# F" ^
}
! m$ M6 V2 }  y5 G# p
. b- p0 ~; x/ O3 Dvoid interrupt ISR(void)
" ]& D! F) d0 |& B& D+ ?{; F+ u' M& Q0 n5 U" a
        if(TMR4IF == 1)1 w6 f, i/ S, k% D  }
        {
1 {* C: A1 T2 m+ O- b5 U9 e/ s                TMR4IF = 0;3 i# ]3 E3 U1 W) {
                cnt_1ms++;
% e& {' s, c+ n               
! d; Y( y/ w$ g, n+ N        //        LATF0 = !LATF0;. t7 t0 Y. G& }# a' R: K
        }        $ c4 Z! ]; V( \
}

PIC16F1947原理图.pdf

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

159

主题

583

帖子

1229

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1229
2#
 楼主| 发表于 2016-4-29 14:21 | 只看该作者
长久的日积月累!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-5-25 05:07 , Processed in 0.059527 second(s), 34 queries , Gzip On.

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

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

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