找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
# `+ @; O6 h* F) B3 O0 V3 A5 K& K4 c) N' t
/*. s: k& w; C( M4 U. Z+ V7 u" @  {6 E
*@Name:        PWM_led
/ P7 E& }  R8 Q& Z3 F*@version  1.0
) S5 ^9 h% ~; H! X*@Author        xiaopan# @4 T7 M5 N# p; H1 @' Z
*@Date                2014.8.2+ U; {. c( H) \& O# ?& V6 J& D5 T% }
*/; M. _/ m% o& `4 j6 x4 m3 _% Z

  `$ Z7 v* a7 o' Y#include<pic.h>" O/ p6 Y4 M: _: w3 i0 h2 s
#define uint unsigned int 8 C* O1 w3 D5 ^( B. W
#define uchar unsigned char
3 A8 R: n5 n5 G  w/ G1 m1 e' t  K0 u4 G- w4 B
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
9 R' n0 e. E: `7 _; \#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        1 }% z% ^" g7 z; M1 n

& M* q' |) i% @! X: j6 uuint Time = 0;
7 g$ x$ B+ \) V) a( d8 Yuint cnt_1ms = 0;, V' }" B" u( u2 {
uchar State = 0;
# E5 v" u+ L4 R+ s6 u' x
/ E5 i/ v  f: X( y( Lvoid GPIO_INIT();
8 G9 }. y( K6 ]6 u- [2 ?9 q$ _  Qvoid TIMER2_INIT();
8 @: |" j4 z$ J  h! Gvoid TIMER4_INIT();
6 a+ v, s( L5 }" H. s: z) Avoid PWM_INIT();
8 i1 |; _8 I, ~  L# k/ Y4 b4 U4 V  V# Dvoid Control_Task();9 ^- t7 @) I1 H) `" ~" b3 y6 i: o

5 Z: v6 e1 r. }* r( u: h; h/*
& a5 B8 n! a2 I  a' a: T( P. I, X6 S*@function 主函数
- h5 k5 u. D: `- k" C& i: a*/
2 D# e* n. A0 I! K8 J1 cvoid main(). y" v% K2 K) T: S/ [' L
{1 i8 R% X) Z; }( {. N/ y- X2 g
        GPIO_INIT();& ^  r# b4 k1 B/ j8 F
        PWM_INIT();& y. k5 T/ L- e
        TIMER2_INIT();                                //PWM利用TIMER2
4 @4 n& R- g# Q7 a        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
6 `; t6 Y0 D( W5 w3 S6 Q" R        while(1)
& |2 C, y6 @( U7 V4 W/ n! Q- v5 p        {
: e- y" \- r/ Y2 A' l$ U                Control_Task();3 j, k9 U/ J4 J/ {0 J4 }( s
        }& g; y/ R: R8 T! ?2 n% b0 S
}
' i: e0 _1 c! Z- s. X/*
+ A/ y+ a1 @9 \3 u*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
) P( i# z( j5 s+ P*/
/ ?% r9 \6 \. n0 \! H& u2 wvoid GPIO_INIT()
$ t* \8 U: p1 ~: z{( p" X. p0 O& m9 k1 U/ K9 p
        TRISG = 0X00;        //设置RG口为输出' e; S+ D) F1 S/ f, s3 w. w; {  C
        ANSELG = 0;                //设置RG口为数字量
" ^) x4 r; V9 l  v        LATG = 0;                //设置RG口为低电平
) U9 T8 z3 Q/ a( m, M6 {1 t7 a; i        
2 t( r/ c7 s; ]8 D: n+ [        TRISF = 0;/ u2 F: c/ M: i6 d) H9 Q
        ANSELF = 0;
9 Z6 Z* D) E) e; |        LATF = 0;
* w+ M& J0 D/ E0 N}0 @' w' G# E) s9 n& Y6 ~* j( D  u

+ [4 V% z* O) }% i. S: N6 D/ r/*
- T3 s4 C7 N# I/ G2 {8 t*@定时器2初始化* B) J" \( r; y! ^9 V
*/
# d4 n. `+ Y% q; m- q8 ~1 m. mvoid TIMER2_INIT()
' {$ r0 o( v9 j5 p! o{
! E& ^" U! d% E% T: T/ l- \        TMR2 = 0;
/ m6 v% T" z/ h7 b; ]! B* k9 u& O( b        PR2 = 255;                //2551 p# r+ P7 V1 |' U& O" E0 l4 _2 U: m
        
' o( s6 u3 d" H4 I2 D$ H& X  U        TMR2IF = 0;
* p/ M5 `' p7 v5 b        
1 W8 p- H# r1 V+ P( ?5 q. T+ L        T2CKPS0 = 1;        //1; ~3 ]4 ^( P1 J8 y+ `  @1 D
        T2CKPS1 = 0;        //08 ~9 G) U1 l0 k5 N
        
, a- {: |* v4 ~  W# u4 D        TMR2ON = 1;        
7 i# u+ Y/ o' a4 z: I, k}
3 I+ s. u& q$ m5 M) l/ L8 t, I  N% c( a  [3 l% y
/*
. E+ c9 M' X& x4 E1 n*@定时器4初始化
4 @, q9 [2 i4 A*/
/ |- ?/ O9 F* ?6 j7 M" }+ Wvoid TIMER4_INIT()
7 F1 b! N5 o) D( k. r, d3 e{
4 g, _5 i/ D* L: v        T4CON = 0x0e;                         //0000 11109 ^( [# R8 o9 Z+ x) v. C

" W- u4 h9 p1 @        TMR4IE = 1;" L8 N( ^- a0 @3 @1 }- c8 Z  a
        TMR4IF = 0;                              0 W/ c8 O7 A* h5 x" ?0 C; v

- |6 b7 B! c& V6 t5 G: [4 G        TMR4 = 0X00;) m" a& B3 G# B% f0 O
        4 P4 r3 W" a! m9 n8 x. A: |1 J
        PEIE = 1;5 K1 p2 X( P& S! c, W
        GIE = 1;% h: i% I" C, t, y& V
}  Z$ b' {# y0 P

- r, e1 M# n6 y% n6 w# J8 n9 E/ {
/*7 y1 ?& \- {6 R/ V2 Z9 m. z
*@ PWM初始化
$ W- a. c" {# v. I1 U*/) `* Z; y4 `" d& Y0 K0 e4 v
void PWM_INIT()
9 b8 W9 h! i6 r  N- N{7 E4 {) C! ?2 D% `+ O
        CCP3CON = 0X0C;( Z; ~  `/ V0 L, ?! ~0 E
        CCP4CON = 0X0C;7 j* d  w- V" _# V* C5 s/ o
        : F5 [+ M  r' [& w& m
        CCPTMRS0 &= 0X0F;& e5 W) o& C- R/ L6 z
        6 C, g2 d" E  t+ F* K, j( |
        TRISG = 0;
# q) T6 o* |6 T- L9 n8 c' @}
+ J4 ~# }. |& e: g7 {2 L# j9 C/ v# z9 O5 n# B$ X. @
/*% o2 ?7 N3 x5 R2 L0 V
*@Function 主任务函数
7 S9 ^" R) t" Q! |*/
& B4 ~  X* C. I. @6 r; g/ F9 K- Uvoid Control_Task()2 @0 J% X  w* }1 t
{, [: E. m; J% D( G# J
        static uint Time ;8 L3 m5 k/ D* }; ~' w8 }& w0 p
//        static uchar State = 0;  T) N" F9 l/ F! c
        static uint Record_Time;
6 B% I% B  D( k  ~" K' C; |6 u        uint Delta_Time;$ d4 N; L' v. i% ?
        - q  U: M1 j3 G5 k: m, P  _
        if(State == 0)
& |, r( @, S/ w& O9 Q        {" D- K- w: }4 h; c+ ~, ?6 C6 q
                Time = 1000;
* q! P3 d1 q: H4 V                State = 1;
6 h9 P* w+ s/ J# S" C2 N  {; `( M. U6 T6 ?  {0 i5 q
        }
) K# M! B$ E  d; i0 B9 [        if(State == 1)0 p' K' W, y$ ?7 y% V! @) L# E* Q
        {
; b/ q% w. m  n+ V  v' J                PWM1(Time);, S* f4 U( c; Z! z
                PWM2(Time);) q. `. f# s# @( l
               
% C) ]  N1 g( W                Record_Time = cnt_1ms;
* M% s! Q0 e% l3 x. B               
6 M8 G9 D/ Y4 ]+ c: \( I$ W                State = 2;
& n+ A) M" a9 J/ ?3 Z        }% z% n  ]  s6 Q1 o# g
        
% l/ e% \  w3 C  y        if(State == 2)
/ c* a, E) D3 z2 W* ~        {0 t( U" I! `" d* P7 K6 S8 n  w
                if (cnt_1ms < Record_Time)2 n2 i( I/ v1 y
                {3 A! _  T1 H6 q
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        8 }  B. o: }# E. T
                }9 G; a' S3 B% J0 \& x5 f. H% E+ D8 N
                else
9 ?( v% M9 N2 |- k  u! [# H" |  s0 n                {. t# H9 t- u1 H
                        Delta_Time = cnt_1ms - Record_Time;               
0 I: Q' `2 n5 }* F/ E6 h0 w. H. y                }; f1 r$ u7 t# d( d  b
# m1 {# P7 k! l2 X8 c
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
+ }% L' n! l" l$ y                {, e7 H! Y4 q; F
                        Time = Time - 100;1 k( ~) |; ?( T/ _  B- w. [5 N
                        State = 1;
5 f$ ^+ Z( e, }" r0 C5 h" ?                        8 i- z" f. G/ T2 M  [
                        if(Time == 0)- `" x6 m( R  C4 h
                        {+ F8 `7 A. p. u# Q& r
                                Time = 0;
. D5 P9 b/ J6 Q7 B! r  _2 ?: C2 E9 D                                State = 3;
/ G* W, @/ s6 `! X, P                        }4 b* S# Q& Z8 T4 B; N* L( k3 o4 b
                }
5 P1 @9 K& U% G. B$ r# E        }
# f% I) D; G' D        
8 R. l, @' i; b2 S5 G3 h5 X        if(State == 3)
" h" M' i  @: L- u2 A        {
$ @$ s% E; a1 S6 x- Y( J                PWM1(Time);3 H2 n7 ^! X2 E& y; W$ F  L. s3 h* A
                PWM2(Time);
% o* Q9 ^: k' J" r7 ~: U) r                ( C/ }" O' K3 Q) K2 u% Z5 U
                Record_Time = cnt_1ms;/ `9 [4 e' H, i7 i# f. C) W0 y
               
  l3 p! j+ `$ |' v; y                State = 4;5 f, M- Z) e5 p
        }
" V! r* c/ n/ @; ~+ B9 R% z$ p        # k9 \6 W9 X& t3 ~7 B
        if(State == 4): n' c: M4 \' P1 U
        {4 _- ?' Y9 @7 |0 A* e
                if (cnt_1ms < Record_Time)
( g+ _6 O) O$ \5 U                {
9 u* ~/ R1 h$ V- N& j                        Delta_Time = 65536 - Record_Time + cnt_1ms;          U5 B, @% ^" Y4 ^3 ]- @2 R3 Q( R
                }  z0 D6 z+ h2 J8 ?9 i
                else
  i' Z  E1 C0 J0 Q6 e                {: S" B, O' u& V* ]
                        Delta_Time = cnt_1ms - Record_Time;                & T. J- J5 N. S5 K5 G( i
                }% F, }; ?9 t3 T" z
& g( Y& h3 Q) \4 U3 V6 L) i
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
0 w% c  j3 C' X& R3 a/ q! H                {
0 l( X. V$ N7 W4 k% {  e                        Time = Time + 100;5 M! J" k( o8 A
                        State = 3;
( v/ g% v+ ?' Z% C+ s+ K                        
1 F7 E' H& h/ U5 {" }/ O                        if(Time == 1000)  J9 n3 F7 Q6 r5 u- k& K* f* q8 h
                        {" I& u/ Y0 U7 J) c2 ?
                                State = 0;
' i+ z% x, V8 ^! M4 a8 U                        }- E* V) _2 m+ A9 n2 J8 _, i4 ~
                }) ~5 E$ v0 ^' \0 a( P
        }
2 _3 [5 ~& [2 @7 l# T7 p+ L' Z}
/ t& K' V5 U% K- N& d6 N4 i, F
! K7 _3 G% Y/ F) ovoid interrupt ISR(void)* y$ A- x/ @5 p4 D7 p9 U, X
{' W" I" s; t& J$ }, e, T3 f
        if(TMR4IF == 1)
% `8 W% I2 {* q, u# U$ f+ S8 \        {
: Q% k  f  G! B% Z                TMR4IF = 0;
7 F0 e* U/ Z% c( F7 {                cnt_1ms++;1 a7 X8 r, Y- D/ f
               
  `8 u3 d& _9 Y3 i! S: c* t! u        //        LATF0 = !LATF0;
) X/ `! T1 ~/ M5 g* d6 u- U7 S        }        
& B7 }, ^0 C' X8 N}

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-2-1 16:56 , Processed in 0.060363 second(s), 34 queries , Gzip On.

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

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

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