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

利用PIC16F1947的PWM模块做了两个呼吸灯

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
3 r- a) X. K2 d9 L
; g4 i; ^. ?6 ^/ Z1 h7 z8 P/*
, @/ J& h7 v6 ~5 w5 O; l*@Name:        PWM_led/ x: K2 {# P9 L( A; }) C5 |
*@version  1.0. Y& u3 m/ ?% G3 W: ~& w5 M
*@Author        xiaopan
: d& l# r# v. p  T" w0 X7 u*@Date                2014.8.2" s  W( x6 c5 X/ O& n8 h4 B
*/
2 ~7 I) i6 {. G
9 p+ G4 n+ X1 a) p' M4 }#include<pic.h>
+ G, ]! z/ U& H#define uint unsigned int
! F/ C% w3 D. G. V: U) S) V$ f#define uchar unsigned char# Q7 X& s4 c) @& c( x

. ]8 G% x' I7 Q1 X' G/ M8 c#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
* e' U( Y2 {; e" j! }7 S#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
( v* C% o7 M0 l/ I
$ G2 Y# j( `# r6 ruint Time = 0;
% ?* W1 M4 ]! m: |8 z0 _0 ^+ {uint cnt_1ms = 0;- ^1 V# ^8 {: R2 f6 y
uchar State = 0;
4 t+ h. L$ v0 N
5 U5 l9 `1 I: }& s% qvoid GPIO_INIT();1 G* B/ T/ A. Y2 r7 N) @  }8 ?
void TIMER2_INIT();
7 g( F9 i; I' w$ L7 D% p( gvoid TIMER4_INIT();
% P  C" d5 w0 ~% v; _7 c1 L0 V- Bvoid PWM_INIT();
, M8 ?+ P' c3 J" T& @6 d4 d! p9 X2 svoid Control_Task();$ y! l5 M! ^" {3 M
( @8 M: y- v0 P! E9 L
/*
' r  H: x2 _- J! H*@function 主函数" q9 `/ P% z: h4 C# R* t
*/2 C; N! G0 t" H! H
void main()( ?, a- A5 c0 `, O" f% g: A+ P
{
4 G: P& ^2 }6 }1 Q' n        GPIO_INIT();' Y# @6 Q, x/ f  f4 x: T
        PWM_INIT();' d& z8 d# z/ A. m0 ]9 q6 _
        TIMER2_INIT();                                //PWM利用TIMER2
4 Z6 d7 M) B6 t0 K5 b; j  B( O        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形( _, R: \3 J: B& v+ h
        while(1)
% ?' Y$ k) x' X' W        {9 i; K) O+ U* I9 z/ u
                Control_Task();
' s, U( s( q* S# Y        }+ e) b% o) n+ N, q! N
}
$ g$ H( j* q% ]6 x, J/*8 I: x; n, f- ~
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
3 a1 C' Y# t, ^3 U" b# z*/
) y9 L# @+ m* I4 w) h1 q% Lvoid GPIO_INIT(), B9 {7 ~7 L( \6 X# P' q5 ?; Y/ D
{
3 M- j0 R! O9 Y' i; X5 a5 l        TRISG = 0X00;        //设置RG口为输出2 `/ I9 j9 H+ ?! v' f
        ANSELG = 0;                //设置RG口为数字量5 L) v2 F6 {8 H, P9 `
        LATG = 0;                //设置RG口为低电平
3 {3 O; O% |, H& a        
! i. v3 A& L4 H5 z6 P1 x# @        TRISF = 0;5 k0 v5 m7 R( X) B$ X% b6 k( S: t
        ANSELF = 0;
% r6 y/ G0 s/ R/ v: n3 ?/ Z  l        LATF = 0;
0 {. Y  H! Y: `3 u% N8 b}
" T+ U, D$ O* E4 a& D
% ~" f; z  M4 }/*7 e& E; @. l( w9 L, A) Z% ~
*@定时器2初始化7 ?& r. X& \" }- d
*/
. m: r4 Q# A7 s6 j/ H2 l- Uvoid TIMER2_INIT()* D& T" E5 {# X2 o0 U. i" }1 N
{
( }, m- T  o3 p* h* \5 m2 H1 r' k        TMR2 = 0;' `$ _' ]! j7 s8 q; G  V! {6 J
        PR2 = 255;                //255! O8 v( K) F' A+ Y- y0 L. u9 r2 R3 D
        
6 ?  U( O, @1 \. \+ x5 f% p: T        TMR2IF = 0;
6 F4 B) @9 E+ D- M6 p        
6 ^3 G, `6 n7 I+ ^/ {" ]9 ~        T2CKPS0 = 1;        //1
9 F; V7 Q/ C& t% p# h- s        T2CKPS1 = 0;        //04 [4 f' m7 w' ]9 g' a. O" {
        
7 p; G$ B3 p5 x8 n: f. L        TMR2ON = 1;        # S$ M" J9 n! ?* w% I1 v
}, ~, `4 C' s5 b; i
$ v6 {& F$ l4 H' X4 r" W
/*
( T% p( A" w; \' [' r9 l+ P*@定时器4初始化
1 c: F6 r" c0 d" S*/
( H( q+ Q* t, cvoid TIMER4_INIT()
1 q3 l: C, c% N$ t' J# I* `{# B7 b4 ~2 O2 g# x6 I' f
        T4CON = 0x0e;                         //0000 1110( ]/ Y* f1 K1 M8 t0 {9 p$ F: U

2 w2 u- ?% q& y: {) P  Y) ?5 `        TMR4IE = 1;4 U8 i4 M$ B' O) \0 E# H
        TMR4IF = 0;                              
6 ^/ w' ^4 A1 \7 q2 t3 ]- |2 L, m3 Y8 B# C" _) |
        TMR4 = 0X00;, H/ ]! E) n# C. V' J6 ]9 S0 h
        ' |. h3 p1 e8 D& W
        PEIE = 1;5 `1 p) |2 h' p; E+ E% V
        GIE = 1;
) ~9 W) g/ `! }: R# u}
1 G( ]% `3 J6 \  y  n
: O$ @/ O: r! Q+ Z: c6 |! S* V& G4 P6 d4 b, n! v/ f
/*
6 K! O, L1 Y  _8 t8 n9 n: a, ~" A*@ PWM初始化
  R$ @. p3 j. t2 A' c*/
; n3 m: C* H; S1 ?) e) z( p1 hvoid PWM_INIT()
# N* C5 X$ _$ \4 N. c{9 i# _; V" k8 X" n$ t! P) j
        CCP3CON = 0X0C;: }9 G. w: X2 A
        CCP4CON = 0X0C;9 ^! ^+ V. B5 D- Z( i, t
        
: J' j# g# ~8 X        CCPTMRS0 &= 0X0F;
( m( y2 [& Y/ Z+ j% w' d        ! b2 _* n% @7 Y- ~, ?" u
        TRISG = 0;
4 [1 B& d0 G4 z5 l/ J8 l5 f}* d5 V- X: k' e3 i
% h/ r+ G9 Z4 i4 r
/*
$ w. P) O8 @. v  ~) R9 Q( m*@Function 主任务函数
+ p% e- y5 _& n& p" [*/" R. n1 v# u- [6 E
void Control_Task()' y4 Q) o+ w/ N
{8 {) t, M: X$ f. V
        static uint Time ;' S% M1 ^! x! W: p; l9 f1 E8 Y! E
//        static uchar State = 0;% ^: L' \7 E8 M4 E
        static uint Record_Time;& m$ @" U8 e! m: X
        uint Delta_Time;7 C/ e+ v- u9 H6 \7 b0 v
        
$ g) U' Y2 R3 B        if(State == 0)
: |8 n1 Q  q$ G8 }" Y# M* G  R        {! B2 E' X/ I$ [) `5 J! p5 n* e3 b
                Time = 1000;
9 p" l$ i$ Q& M. a8 n" p3 ?. j. g2 R0 P                State = 1;
% u' l! m9 D8 t  V
2 @9 {, s% k; Q; I" M        }% a. [/ E4 T( g# \  y8 l
        if(State == 1)0 C' i/ n" s5 @7 C& q2 \* s5 p* @
        {
7 P* y7 i0 T- }, w& s- i                PWM1(Time);2 C/ D3 J3 Q& }% B- K3 f* U. a
                PWM2(Time);1 T  H4 L7 W/ P5 x+ W7 U0 ^
               
# Q+ R2 h/ \/ b                Record_Time = cnt_1ms;# @$ n2 Y! R; `" e; \. M2 D3 L
                4 K  A5 I' M3 I- ~6 M& p. e0 n
                State = 2;
$ L# a5 B3 O3 k        }
+ {+ s& R5 v4 o7 h& t  w1 |  E5 }        
( R' h! Z' ]1 W        if(State == 2)" p- b/ d' v9 c. P  s
        {, o7 R5 R4 P0 J0 M* Z( m
                if (cnt_1ms < Record_Time)
# V1 Z$ v3 |& L( b2 x/ C2 w- S                {6 w! ^$ ~  @' p0 [2 G, @
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
- @& q3 g/ M( e7 l* {5 B, d3 i                }
" R3 j7 B6 |: C2 ^  C+ t; g; F. ^                else
7 s% B+ N* L" ^                {9 n6 ]  H4 Q" x) t. O; g' z% N4 T
                        Delta_Time = cnt_1ms - Record_Time;                * D# d% p0 E2 ?. `: G2 @; P
                }
: ^  ]5 {. D9 J# o
1 C. X) S& j7 t% ?/ I6 r                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT" E0 K; H5 p' z8 R; \  x
                {
2 C* a' t2 U% C' Y6 B" P- ?                        Time = Time - 100;
# R. c; m( N5 g+ r                        State = 1;
4 B3 C5 A+ t* W' h2 C2 u1 X+ g                        ! S$ P& n" f! y/ B9 }9 w
                        if(Time == 0)
& f( f- Q/ l8 h                        {2 G, S/ W0 c( n% E/ J
                                Time = 0;- d8 s# Q% y/ n/ |3 @6 }: L
                                State = 3;
: D, d5 q0 H$ t$ c& B                        }
+ d2 ^# T* I# i& Z                }
( E) A5 i: k4 ?7 E- r2 S        }8 K! F5 H2 H1 M
        : [) {8 y. @0 D, @8 O7 t
        if(State == 3)6 r5 }% w. ]/ |  y5 L$ t. }
        {
, B% P- m. I2 d/ R7 j& ]# ^                PWM1(Time);3 l, k1 F4 G8 g, ?/ w& E. V3 P
                PWM2(Time);
( p2 h# s. i1 ~( h( |                " J# Z. d4 L8 U& B6 L
                Record_Time = cnt_1ms;
  S+ Y# }8 u% E- P* g' o) S  F                ) N! Y- O8 N) w* J8 d: r3 V
                State = 4;
$ V! l" b" X: D% p& E8 j' l8 [! H        }; v/ y& a& }% D7 h: g9 Q
        
# s/ L* W1 |1 o/ _) d% T% k8 A        if(State == 4)
% h. e5 @, V9 v6 N3 o        {. a0 K: @- |; O* A7 U6 f; o
                if (cnt_1ms < Record_Time)1 l* K9 H* B4 p5 ?
                {
  J2 e; {6 V3 x/ v8 h, Q0 y                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
' H( g/ g9 E* Z* `) e+ }. N9 v                }
: x5 X* o5 R  |1 }0 `8 I                else
9 n3 b0 i; `' F# u                {
# H+ k5 k5 w3 n# p5 k' _                        Delta_Time = cnt_1ms - Record_Time;                + n3 e9 v* Y+ v! w8 J
                }5 V- Q; y# l3 h3 K# r* B

9 p2 |: `( z2 m                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT5 Y  i7 O3 H- j+ Z8 G( B5 V
                {  y4 c% h, W& y8 X0 s1 o
                        Time = Time + 100;# {$ r+ O0 I2 t
                        State = 3;7 n4 s  V/ D8 n. u; f
                        
: ~9 q; n5 V8 y$ E                        if(Time == 1000)
  o( V, G- O1 w                        {
( ?4 u- W- y/ D3 W( D1 }                                State = 0;$ p( k# I6 r& p- U. y+ g. i1 D
                        }
/ D) C7 F7 E/ b7 ]9 o                }; z9 a  ]; `8 O3 [( c4 Q3 s* L7 t' Y
        }
- y- M- ~) o5 J}9 ?$ }6 F7 I; N8 V& k# d" u0 |" }
. S& W1 |3 [0 ^6 m; ~7 T  o
void interrupt ISR(void)4 S- c( T, w  l$ ~8 D
{
* B$ U' L/ d. `        if(TMR4IF == 1)! B9 N$ _  v( ?( Q# W
        {
) f+ D1 C/ p2 `* y                TMR4IF = 0;
4 E3 F- X2 ~- b( v                cnt_1ms++;/ Y! V  K3 o) H7 K
                # U' m2 p$ {- v$ H8 ~
        //        LATF0 = !LATF0;
1 P! a* d/ f& i        }        & D) F6 B9 g6 b* Z4 E2 `
}
$ O- M' {" ]* n) q' L) h8 d1 h

PIC16F1947原理图.pdf

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

该用户从未签到

2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈1 Z5 m0 G! `0 t/ z: R! O

该用户从未签到

3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!# ~) x; @: {; f2 K; d7 u& V

该用户从未签到

4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!
- k5 A, |) V# _+ f/ A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 15:05 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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