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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
$ _8 t1 f% K, l( y& ]' {8 x) k0 [
/*3 N- U  u6 G1 x- t4 e0 u/ }5 `
*@Name:        PWM_led
' ], E4 q" w. F5 Z9 ]*@version  1.04 n% |$ G. `" k' T& X/ K
*@Author        xiaopan9 {; x3 m$ I' T8 Z4 S
*@Date                2014.8.2
3 G: j4 W8 e0 g# m*/5 r  \7 R# d' i$ _- w/ W' I
$ O7 T" u* P6 ~4 u9 F6 y
#include<pic.h>
8 B$ W. g0 [7 H; W' b' L& Q( }* S#define uint unsigned int
, z2 D! M1 Z  p2 I( O& y" t#define uchar unsigned char
$ E' i0 _' g* ?
; Q( ^5 l# j6 H" Q. m  F#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
8 ~. v1 t" {; p$ ]5 c#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
% P6 l. m  _  f, `. k- v- m
! Q" {7 W& M; c( l. R$ Buint Time = 0;% \6 T" G" {  x3 h/ a) r
uint cnt_1ms = 0;
+ [: [1 h* B4 A) c- ^/ luchar State = 0;
- [9 F5 V1 {( M: T8 D7 i& B
- X6 t9 O' D0 m2 ^void GPIO_INIT();
: d$ y7 P4 u: m! B$ Lvoid TIMER2_INIT();: Q% [3 k% x3 ~& w7 |
void TIMER4_INIT();$ l( E6 l! [4 G3 G1 ?: e$ S
void PWM_INIT();
) u6 G1 S1 e) D$ hvoid Control_Task();7 a# N5 ~* B) T& N
3 u( h; ^" Z/ {$ k, y
/*
2 b4 V& ?' k; t8 h# t" q*@function 主函数5 w! D" _2 q- E$ g* s" E( L
*/
8 M5 O4 b( z1 f7 A) }" N$ Gvoid main()1 ~9 F2 J: ~+ T1 v( l! i2 R
{
8 e# y! u- C$ S" h- x        GPIO_INIT();
! `6 \5 F! F9 V. b( R9 D) i& @        PWM_INIT();1 N% z, {3 f* D. m+ V4 O/ @, n5 G
        TIMER2_INIT();                                //PWM利用TIMER26 l4 x! K" |$ m- z' O
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形) e9 l2 W6 o% k% l
        while(1)
+ G1 l- Y( Z7 M6 @  V( e9 m        {
( N6 G  c/ b/ ^3 C* W- R3 n                Control_Task();, T) c/ u# Y! b8 F
        }
- d) R! m4 ?2 X6 s3 K6 j; ~/ c}
, U3 j* J" |! ^& N: f/*
. w" E6 _9 T7 G; ]*@Function                IO口初始化 RG0        CCP3        RG3        CCP4, L0 g/ S: A" X* W
*/
& k% ?& n  L1 N8 x( Yvoid GPIO_INIT()5 i4 o' \3 L* t0 d5 K- @
{
9 H; p- k& b) h! E  x5 |, _        TRISG = 0X00;        //设置RG口为输出0 d4 R& K& O8 J- x. w+ q2 Q2 Q
        ANSELG = 0;                //设置RG口为数字量3 j/ E8 {2 A& s6 d
        LATG = 0;                //设置RG口为低电平: G% u& Q9 t/ {5 _6 @4 H
        " b2 x/ p9 ~) @) O
        TRISF = 0;
. A4 i4 T- H* M' \' R        ANSELF = 0;7 ]/ b2 Z5 t: Z0 |  n+ X! g8 k
        LATF = 0;
$ X+ C7 A+ H  [' |. ~- c: t}
; n* \- q% P- e6 v2 q  s, Q& L
& R0 ^- w5 L) V/*
9 s# `  `2 n6 J' r*@定时器2初始化/ R) }6 N1 }3 O/ A( ~
*/7 v/ d/ @% h: M8 _2 x: G: K
void TIMER2_INIT()
- z+ Y# n3 N9 d3 J- G! L+ j# A{3 U9 X. y2 T' x( y2 \! W4 |# ]8 a
        TMR2 = 0;
) W4 P/ b: ^) Z5 v" q# S; Q: g        PR2 = 255;                //255
& L- W  _) ^9 v8 o5 L. s        
: P2 K2 D) U7 t; I. @7 q% ~) u" L        TMR2IF = 0;
6 J& k9 a9 L0 {; v' b5 {        
- J- [: M3 c) ?1 l4 E        T2CKPS0 = 1;        //1" {7 `) L9 O6 }. i# i+ s8 s+ Q3 M( u
        T2CKPS1 = 0;        //08 `# g3 ?& L  y& A1 \5 _# Z1 F
        
% t) ^: v& s" s' n% a: _0 o, T2 M# f        TMR2ON = 1;        $ l7 s" m! r0 }4 }+ p& Y  i
}
. p" ~" I  K2 U6 B
3 Y2 J  Q; w  f) t9 T) ^( c/*7 M) i. O" a, P7 r! `( z
*@定时器4初始化
& u2 y( y- Q! H1 D8 v* w8 g% ?1 ?. O*/
0 Q, R5 Y3 x# r6 g6 Zvoid TIMER4_INIT()
5 R! s" k, q& @# I3 @# T{
& U9 v# g8 S/ A9 `9 ^) Y        T4CON = 0x0e;                         //0000 1110
& R) H1 D/ P9 b4 l. m, m2 ], R  D$ Y/ o* A) V
        TMR4IE = 1;
1 u- v: [9 P# E6 e7 _& `- }1 P        TMR4IF = 0;                              
: ]5 S/ R9 M5 U" F$ D5 x8 M0 K$ z& \+ c* e0 [( U- B
        TMR4 = 0X00;
5 c& D; m- o4 A; T5 f% q2 y. D        6 s4 {- H% J" I1 H9 u
        PEIE = 1;
0 p% P/ j" o, [3 G1 W& t8 k% K1 ^0 X        GIE = 1;' r5 y7 C8 m2 D  b8 Y0 N
}" C2 x: P, W& g% {) {6 p
; X  _7 m2 }' m: J- w/ j
' ?( |& T& [* W2 ^
/*
9 h8 L0 A) @2 K*@ PWM初始化6 v) v: X/ @! M/ k% E- |
*/% G2 u; {) [; f! b5 e% z
void PWM_INIT()) Y& a# E4 w! o
{
" {0 ]4 y. ?8 a) x7 v  L& f6 e( f, w        CCP3CON = 0X0C;
  ?+ X4 L. \* \& W1 M& Z8 M        CCP4CON = 0X0C;
- M$ _6 p9 {0 w  g$ G; I        ' s; d: b$ z1 \" b
        CCPTMRS0 &= 0X0F;% {, O* b6 O1 m/ T) V) B6 C
        
2 `7 J/ {$ |& @0 K        TRISG = 0;7 f% c( R( I" S: K
}( c' U: J- W9 P) |' d
6 E, z, B, A/ t0 k$ |, h8 z2 E
/*
8 L9 Y' b  X2 f! o# i*@Function 主任务函数4 `/ i! l0 \1 N) j% T# M9 m
*/+ H! |' J. j5 _# S; X5 Y
void Control_Task()1 w% ?4 r3 h9 x$ L% W3 }" g( O' g; [4 a
{$ M: P( j2 Y" {. T
        static uint Time ;7 h, @1 A: f: M& e: D# R  D
//        static uchar State = 0;
* i' Z5 m& n* z7 n7 Y8 z        static uint Record_Time;; u; L) W' m9 U4 e
        uint Delta_Time;
& j! W% |0 ^2 p" b8 i        
0 M- d& o, p" h* k        if(State == 0)
: {( C6 }0 \+ }        {
, V1 I. [: q2 }- v# V4 [                Time = 1000;
  I' A' H  \- X1 x6 Q9 M% x                State = 1;$ S- m; b6 E- t7 W) l
7 E0 @; N  E: a; c
        }  F, v+ N- Q4 B
        if(State == 1)3 g! U/ ^9 i8 ?2 ?+ X5 A( N& m
        {
, E2 h0 `) |; W1 V( G                PWM1(Time);
( M3 H) K& S# q% S. ]8 c3 y                PWM2(Time);
, }. C. o4 K! a7 Y9 [3 B3 w                5 ~" |. ]. b8 ]; g1 g7 f, ]
                Record_Time = cnt_1ms;( P# j$ h$ ^, Q0 I% X; p
                $ e3 k! W9 V  s2 J: H6 U" A
                State = 2;
/ U+ E' i7 c$ [6 \4 M' q. a        }4 d+ f; |4 ~9 ^+ t/ z4 _
        0 A5 [; D* n5 }3 V
        if(State == 2)
) n0 z) R# a( L- j, V        {4 e4 m7 I3 ^" `0 {8 [$ ?, T; H
                if (cnt_1ms < Record_Time)5 ^% o+ x# d& G9 }' k% V
                {
0 ]# x# v4 I# S+ O' o, V5 [3 }                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
, |2 S2 m0 c& s! \+ {1 Q' B                }
& L$ [. L- i) [% _# L, E                else
$ [2 A& C  q& j* {% I# `) O                {
. K3 B4 G. _9 o% B9 E6 A                        Delta_Time = cnt_1ms - Record_Time;                ! P5 c! I+ b: z4 e$ \) J
                }
& g' ^6 N3 ^' Z$ r+ {8 x* d- s7 ]. F$ z! i
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
1 N8 L4 @- j" W                {
; Z/ N# X% P3 i5 k, O                        Time = Time - 100;
: F' _  g2 n% N                        State = 1;
" s' Y# D$ B+ Q6 O# z                        9 w0 V2 L7 N! }
                        if(Time == 0)% [  U" Y* \- i
                        {
% E, ^% B5 t  \  U                                Time = 0;
6 l( L0 [) k" d3 l( {' u3 g: }                                State = 3;* x& Q( t$ C; w+ M, d$ Y, a
                        }
2 _) a0 x+ c8 q' x                }
$ H: M& i, l7 m2 a) t1 r; [: O- j        }9 l3 E) g1 J/ M9 E! a
          w2 e, J$ l# L: B
        if(State == 3)
. c# i1 }6 e/ M, U, q6 U        {
/ \; W* W1 b: O. x  t                PWM1(Time);# L1 ~6 R! l' T. `
                PWM2(Time);
1 q/ G( A- G! L/ j# Y               
2 E- g/ ]; ]2 B8 p: K" p# e                Record_Time = cnt_1ms;
5 f( z/ z. G! z# z- l1 N* o% q                & J$ B7 H  ]9 B3 _& R
                State = 4;% T; |. h; i! H7 N
        }
1 `* G" a. n* h* O        0 v7 a! g  w) q- v
        if(State == 4)  E+ J. A- M) L7 `5 O# v4 W+ Z
        {
9 \+ ~% b1 b& g, @, Q1 k. f( e: h1 W                if (cnt_1ms < Record_Time)
' @; k% W( |7 ^8 \                {
" k( n5 A' t6 _* ]                        Delta_Time = 65536 - Record_Time + cnt_1ms;        " e# J9 K' k* S5 W9 k
                }
1 v+ O/ G, n3 v% U6 h% ~0 [                else
2 v+ q1 [( H; o4 Z" ~& C                {- c: _& `- ^$ I; R' e# r4 g2 H
                        Delta_Time = cnt_1ms - Record_Time;               
7 P9 g& @! Y( K                }
  i  r; c  [% P7 N2 U5 z& _' K# q7 g5 a3 e, c
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT0 l5 d3 l/ b( A. n6 |
                {  B2 F6 z( E5 B- U" T4 h
                        Time = Time + 100;) h% D0 o% \1 n' n' ^/ \
                        State = 3;. X; l: r$ |# i" e
                        
( ?2 C- [' j+ I6 G+ u" R4 c- p( w                        if(Time == 1000)- \9 u( Z" Z" r& S& A
                        {
8 R3 r. S6 {+ B; {4 q. A0 \) G& p! x                                State = 0;3 |$ n+ m! U7 @0 w
                        }5 p  v( L2 A% l* s0 f$ |: Q4 I
                }6 l6 P9 V) u. r9 q% J8 ^, Z
        }
( o: F( |+ c! F3 T, e6 P" \}4 s+ Y8 }9 Y! L

* {, n9 [; x1 d9 jvoid interrupt ISR(void)
3 r" u2 O  X3 ^; L. Y! p* D{
6 q% U' S4 c9 M4 }7 Q5 Z& F8 X        if(TMR4IF == 1)
- q0 c! F1 `# p) e        {( {" ]1 M  N! n0 o+ @) b! N2 k# X
                TMR4IF = 0;. O+ z* I7 Z) K5 F7 j
                cnt_1ms++;* l1 L& m- W7 i. v4 ]) a
               
& P/ V  m7 C" Y6 t        //        LATF0 = !LATF0;0 Y. h( A' X8 g6 R) A9 ?
        }        4 d! b6 s0 b& e# G& c' J
}

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-11-6 16:33 , Processed in 0.187500 second(s), 26 queries , Gzip On.

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

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

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