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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
6 [( v- E0 u( q3 {1 D" k2 S
& ~- K7 w! h2 C, _4 |, h/*
1 s5 W9 Y& S8 e( q8 S& X+ K( d$ Z; k7 g4 g*@Name:        PWM_led
/ G) M( _0 {; ]) A*@version  1.01 @' p. s  n  I7 @, t
*@Author        xiaopan
% [- n5 u$ G+ n5 C# Z6 N2 P$ U, k. M*@Date                2014.8.2
' n! `3 U) w$ i1 ?*/; g4 N& X$ x" K2 S0 {
, E0 Y6 Z$ n# H2 a4 m! _3 Y
#include<pic.h>
5 w1 a8 s  X8 `7 w$ A#define uint unsigned int + l' }: F' a0 [- v% c6 j9 |
#define uchar unsigned char
+ X# _- h3 I5 q
' }. H3 |7 R4 v7 Z+ o3 d#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        $ V' W6 W; w& o1 U8 E+ g
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
3 R4 {' S4 f1 b+ ^3 O
4 T9 d% T! x0 W% _* W! Tuint Time = 0;
. J$ f: u( }* _8 A4 Vuint cnt_1ms = 0;3 p+ e8 F! Y) I
uchar State = 0;6 x6 o8 Q6 X$ E5 Y: O
# ~! {1 b: ]; b
void GPIO_INIT();& `- o+ B: O1 N! M! i1 r  N
void TIMER2_INIT();
3 |4 G% _2 T& E' p. _' Bvoid TIMER4_INIT();
* |" h" U9 o" j/ Z' t/ n( q% Xvoid PWM_INIT();, m6 c3 [  a- v" H2 o/ n- }
void Control_Task();) E9 X. x- p( T. l  ]; y6 n

- T  ]% P  ?( W8 t: A- H" Y8 s1 T/*
) q4 H4 V5 D8 w* }*@function 主函数
% `5 T) n1 W% a4 {" ~*/7 P- Y+ P/ j( i! ]
void main(); w6 T1 `( k& V. `3 N; M
{
( ^1 q2 h* j& l4 S) Q, P* A  C        GPIO_INIT();
7 d! n7 S* ]) h, ]: o7 w8 G( l        PWM_INIT();9 F- v& [$ V) z+ q  _* Z% U% [
        TIMER2_INIT();                                //PWM利用TIMER2" O2 a( F! [" Q
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形* c8 y& x" f% g* b! d) U) @
        while(1)
$ F7 G6 \+ x6 `- B! E1 p0 m3 d        {
$ t2 n. R4 {* [; o' F, b                Control_Task();( _, g# w8 i& A/ W, }% ^
        }
9 w( |4 o* I1 |8 q1 L0 r  T, Z}
* T! @" Q3 @- S) E5 P4 b/*
! b+ h* [, k9 E* J- @* R$ M*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
6 T, v9 a8 k+ y# c0 i5 l*/
, C6 j, q) u" U; Zvoid GPIO_INIT()' o/ @3 U. l8 u7 ~9 m  `7 B) N
{
1 u! d; P: Z: ^: f$ _( J' O, R        TRISG = 0X00;        //设置RG口为输出
+ }# M( m$ s5 w& L        ANSELG = 0;                //设置RG口为数字量5 ]2 N9 `4 H, P' j; N
        LATG = 0;                //设置RG口为低电平
- F; I# B" F, ^' z        & y/ Y7 c. i! u: K6 n; h
        TRISF = 0;: H1 K' y; A/ e# a  }6 Q
        ANSELF = 0;
2 u. G" K* d8 f, x7 U& s! ?0 d) b        LATF = 0;
! a1 }: \& X& o! W+ Y2 H}, E1 n( v7 M+ l. k* B: q
2 g9 X7 P: G2 b# g( r. h, K
/*
( W9 d& R: C  s2 b, i! t" G% b*@定时器2初始化/ J. D. s3 `8 t' l; I! y. c
*/
9 A" \1 N9 P- m. x. yvoid TIMER2_INIT()
1 c' ]6 H( G' j3 ?3 [! X{5 |/ [/ S, B0 l# _/ T
        TMR2 = 0;
8 Y+ t( \$ u1 k" w4 ~        PR2 = 255;                //255! _; t+ J4 p" d3 w$ _! _. C
        : ^; ~8 \9 b( ]4 E4 s3 F5 f) A
        TMR2IF = 0;
# L) f" i% t& t9 C5 F' N        
0 ]" N: W) n. g' A+ C        T2CKPS0 = 1;        //1
  d8 m) E$ z0 o2 r" L& `2 P        T2CKPS1 = 0;        //06 g! c9 L, ^$ b# J) ]* b. Z
        
5 E+ z8 {7 P  |/ Q: a        TMR2ON = 1;        6 a) V: P9 i* l6 d! O
}: Q& B7 I6 B9 F: l/ C( e

0 \) \3 ^, i( J. T7 g- Z* P' {/*; f2 {8 v0 Y- y& O2 m, j+ R0 f1 I& _
*@定时器4初始化# `# K# Q  u( a
*/
9 _3 ]) r; ?( f$ }3 ^$ Y& tvoid TIMER4_INIT()
; A( H9 n) n! x% m* V; ~7 z{
3 z9 X$ ^3 j" {1 ~/ V# `        T4CON = 0x0e;                         //0000 1110$ L# c1 u( k+ D. K6 V* V
) p6 o4 q/ ?+ z  V! g) p) w
        TMR4IE = 1;
7 a% p- G8 R9 e- B. Y        TMR4IF = 0;                              $ u! [: e" g8 g  l4 O( k5 S1 O' B; t

3 L; s) [7 J- E6 S/ ~4 ~+ R) x        TMR4 = 0X00;
7 M+ N5 n2 @" i7 _, w. X        
4 V& P$ W0 X6 }( Z/ e" H        PEIE = 1;
( n7 L' `, R/ o6 P0 U        GIE = 1;) s1 i; k/ {7 j
}! V' {1 ^8 N" ~- C, h$ f# a

" R2 n1 ]: Y. W1 d
6 T- c6 G: F6 k/*
! f1 F7 m/ x9 s*@ PWM初始化- A0 Y6 h9 t3 v* ]! {
*/
. S. O: _3 N# R9 B6 V& Dvoid PWM_INIT()" z4 q# A3 C! y. R; E+ x
{
+ g+ A& w, C/ |- n% h/ W        CCP3CON = 0X0C;
8 y2 T4 p2 _7 ~$ N# v. S        CCP4CON = 0X0C;3 A' h5 j9 Z* W
        * m; O/ X1 }3 }0 v+ q: n
        CCPTMRS0 &= 0X0F;
! c' F8 M, N# ~' j& l/ O5 j        
) ]4 `5 M8 s$ C/ z8 d        TRISG = 0;4 e  o; Z# O, b) p6 U% y. V/ M
}% e- S' |7 [: j! D
6 p# r9 Z" E9 B4 Y+ a$ |# m
/*4 C) r1 p! g3 f# D5 B$ r
*@Function 主任务函数6 f8 k8 \# V7 G6 w
*/, r8 l" y/ a. G7 p+ r
void Control_Task()9 Y& g: A3 {( y6 ^* Z
{
: Y! U! h% v8 P! P) m* s        static uint Time ;# q8 W7 H9 F4 R. A) L
//        static uchar State = 0;
, z( _7 K! ]8 u4 X( X8 P        static uint Record_Time;
( U- N0 @3 c( t9 X        uint Delta_Time;
- a2 v0 Q# X+ D% [! z( M5 N        
, F$ ~0 Q! F2 }$ M) B5 p/ ^        if(State == 0)/ w. W* c0 X- R' M6 |. H& y. I
        {
0 x, [5 |' i0 i' k4 A  |                Time = 1000;# I- N5 _2 v8 j1 k3 g( [6 |
                State = 1;5 |0 C2 v! J6 z+ Z

! T2 d8 }# t. A' Z6 U        }1 t9 [9 R1 M' W1 o
        if(State == 1)  G' [. O, w* I! E& l* {
        {0 }- Z' r' V0 m/ Q/ i
                PWM1(Time);4 j, }; o# _+ l/ q# b8 e  j' A" a7 J
                PWM2(Time);3 W5 s0 u! ]) c# r
               
' y3 O' y  {1 |1 s3 a                Record_Time = cnt_1ms;! D: f0 v. l2 g# n0 B+ `4 i
               
2 |: G' X! K! y                State = 2;# X" G  o* J2 y- ^% A
        }
( s* t6 m4 P/ D- k        : i+ E: v+ J+ |. V' s
        if(State == 2): o+ i. a8 e1 w* F, }; K2 }6 c% m% N# I
        {
5 Y9 K% J9 t! w9 K( H                if (cnt_1ms < Record_Time)0 c( }$ n3 y- i! `$ L
                {0 E8 R  H, E$ M  h/ T
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        % r" b) U3 X& o
                }7 T( Y: U7 D( R$ `: n+ P' X% D
                else9 f7 @( \( F2 |' d- L
                {
* |9 @/ x6 l; C3 o( p, P% Q                        Delta_Time = cnt_1ms - Record_Time;               
3 T7 X; x0 l2 Z9 \- G' P8 A                }
* i! z; v7 T4 ], I* N5 m7 [3 Z# p* D8 G- ~+ g
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT% u# s4 S( T* l. ?) V& L* f
                {5 a  y0 i/ @0 N, F' P
                        Time = Time - 100;
( O- t5 F/ B9 _; U: ]& F* S                        State = 1;, _; X* E! `; R
                        - B6 \" i* [  Z: N% y. J) k8 X
                        if(Time == 0)
) s/ q( w' s# T) P3 p4 Q! q                        {
5 d- m0 [0 G2 O4 j" l" c0 b4 h/ r                                Time = 0;0 d" x0 ~5 O6 f5 L% T* q' ^1 n, ]
                                State = 3;
% s* e7 [' U' G% `0 V4 J- g                        }0 ~7 p1 x( j$ j. a. r) t
                }/ g! d' S, i( Y; A, Z1 T" q" C+ |" U
        }. D3 p: G9 x5 B0 r
        
. m4 k# E& ]$ m1 Z/ a# r/ h        if(State == 3)
+ ~2 k1 a! R! I; c8 ^% O, i        {- i1 g8 G# P7 ^2 ~1 p1 u
                PWM1(Time);
- \3 p0 B* z& p2 P4 J                PWM2(Time);
; B' K- Y. W% d3 w- M( Z4 y                % Z, z) Y. ]: _# y! k. O
                Record_Time = cnt_1ms;' W# x. e; {7 T8 _5 p
               
# ^1 k+ j1 q% Q' W7 n# ^$ W1 W" i! V                State = 4;
3 T+ r, x/ h( b0 ^; W3 b$ n        }, ^" |7 A! P9 y, q2 e, t. l
        
0 P+ A. {* Z) X$ E) y3 M. ]        if(State == 4)" b* A; b% H( V7 C1 e7 H
        {- B& N  A3 H1 V" b0 W- ?0 ]0 ~& ^$ K
                if (cnt_1ms < Record_Time)
  @) [$ k: Y+ \2 P                {/ o/ N: B& g* s4 [% ^
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
8 a. N2 P( W5 ]6 I                }3 B/ j0 l1 G2 d; x! T! S
                else. Z+ P/ ?: L3 e/ R- r
                {
7 @) u: M  i$ e                        Delta_Time = cnt_1ms - Record_Time;                0 V9 ?5 e4 Q5 m
                }
: g( h6 a8 s$ f. ?' v, ]7 A% q7 H+ b, L: ~2 }; u- p- }3 `( F4 z
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT! f. b' M, K- D" D' d
                {# [; c- f' q8 [1 Z/ a
                        Time = Time + 100;. [3 n7 u! r; V; r, U" l' U
                        State = 3;) a: B+ y* `9 V
                        
) n) Z& {+ e) ~: L6 V                        if(Time == 1000)2 ?! h. a; f8 D# D) T2 ]: I+ t* W
                        {
2 u0 q: L, g1 u# ~                                State = 0;
; R5 H' m# f6 ?                        }  u' L& ]1 q9 H: @: a4 q  p
                }
' o# F1 \# [4 I( @8 {( C% d0 B, e        }* ~9 J8 e  X) q% K0 f! {' i
}
3 o+ I* o4 P! S8 R, h
1 [2 p2 \) C  X: {void interrupt ISR(void)
$ f/ i. R1 C' _2 v& f- k0 W{
. F! Q( u/ Q# h/ P* K* c        if(TMR4IF == 1)
' }: d" W$ {+ N3 T4 G3 Q$ q  ?        {
9 ~  ~$ f" a- t& {9 B                TMR4IF = 0;
0 v8 w  Z( O: p1 O; k0 H                cnt_1ms++;& G% a! ?4 o- `3 r  s! t5 d
                1 o5 e7 T0 V0 {: s
        //        LATF0 = !LATF0;7 i7 u( x4 {" g- q( L( I% D8 Z% f
        }        # t, D: Z+ b  @) h
}

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-6-10 17:41 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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