找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
  \1 h. s& r& i+ r+ I0 z" `
; M1 X  o; x7 P! |- u% O/*0 y; M/ ~; m0 |, \. G" O# `
*@Name:        PWM_led
1 s# U' k$ @# X. S*@version  1.0
0 r8 {3 f' a  p! A*@Author        xiaopan
: s7 e( V5 j. {& L; M( C*@Date                2014.8.2
+ u0 T7 R/ N' `2 z+ o) G6 D7 d*/; B3 R! H; Z1 n
, A9 C7 f8 @; K  d* Y
#include<pic.h>
2 R) V! Z4 k9 P7 A. v9 `#define uint unsigned int : f$ f7 A! o+ B/ V& k  m) J) G
#define uchar unsigned char: |: a- H7 t# y8 S

4 F+ _! R4 n0 A  l  K: b, H4 E( r#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
5 n3 s2 s1 Q( v#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
" {- [; `5 x; H7 h6 |
' T! M; A* g3 i' Buint Time = 0;
  G/ j$ [0 d: ]# g5 B. s, X; suint cnt_1ms = 0;4 A1 [4 e0 h4 V3 s4 P
uchar State = 0;# ~! x' Z, J/ N* A

% y  ^* _2 W$ x' `$ ?" Mvoid GPIO_INIT();
! n5 U- }' v0 @& u5 e5 z) rvoid TIMER2_INIT();
# R# ]. F7 e4 E3 Dvoid TIMER4_INIT();9 K. S& G& w: Z' u$ h3 k5 S
void PWM_INIT();9 W! |. g( v6 ~1 K. `
void Control_Task();; B  ~4 k! n5 s; l' }3 G

. t6 j# q$ q  |! @/*
, S/ \7 ?& n8 u( n7 {*@function 主函数
' O$ U0 w* L! x! C) _* i1 h' _*/
! P5 i. m1 c7 ]. Q8 ivoid main()
  y1 U. S9 d4 M{
5 F6 Y; i% o& M9 `( ?. o        GPIO_INIT();
! \' x0 I6 m: O5 w' g- t; L        PWM_INIT();* s1 c/ I# q& u
        TIMER2_INIT();                                //PWM利用TIMER2& n2 w/ Y3 ^2 X# M6 ?5 T: b& ?
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形$ F8 s" K3 _5 U- A
        while(1)5 ?% z6 e4 P0 w1 m( j$ `3 E' a6 [
        {
, t4 Q9 C: Y8 [7 {' w" F; M$ F/ P, |                Control_Task();7 u( k9 ?, T6 B$ w% T# q5 Q
        }
' H- w6 f) G( Z8 [  G7 B}' d7 g! f, z% m9 ?# d3 d
/*; J2 L4 X$ s) h/ b# t: {& ~
*@Function                IO口初始化 RG0        CCP3        RG3        CCP44 @( b0 d. A: I* H/ `
*/' H, R& j, T9 ?# k* J8 Y( u
void GPIO_INIT()
$ U0 Z% j9 y/ I4 ?& v0 i/ y3 X{# C, b3 y6 n( i% h/ M  o6 A4 m* v
        TRISG = 0X00;        //设置RG口为输出
9 Q0 Z& N' ]$ L) e; ^, m        ANSELG = 0;                //设置RG口为数字量
/ z' W4 x! d. [) @; ?1 I4 c+ w        LATG = 0;                //设置RG口为低电平
" x# l5 `* c2 u: K6 f5 X) y        
' t' O" {2 L5 Y7 s  z8 G* n        TRISF = 0;; _( {0 `! m3 ]1 ?. F, z
        ANSELF = 0;
9 Y- j2 j* y9 ~8 I6 k6 y5 {        LATF = 0;; f- K* e5 `1 ^2 P
}" u' l' t& t. L9 a2 Y

, M* M" _! z! b& J8 s/*
( G7 C8 L. N: e. y2 x*@定时器2初始化
. V5 ~% q) c( i6 O- X*/
& e& e4 C, X% e5 z* n: }8 Z( o( D5 wvoid TIMER2_INIT()
9 @! h; G# i6 q* U* o7 X{0 Q" S; K& y3 T6 l
        TMR2 = 0;$ a# z" c; b, y6 h# u
        PR2 = 255;                //255
0 I& q3 f% v& D        
. s( s) `# q: q, T        TMR2IF = 0;
5 V+ \- K( z. b. G+ @        , \* i2 t# m$ G2 O: `: @" ~( W
        T2CKPS0 = 1;        //1$ c( g# S6 P. n" G/ \
        T2CKPS1 = 0;        //0
& r. ?8 Y$ w$ ^. U        
+ J  U$ g. r/ v9 o        TMR2ON = 1;        : m/ J- Q9 c5 h0 E
}: L& ?$ k+ g  |3 `0 K7 N
& e# q& G# q0 S- ?
/*! ^( x. ?& {  b  h$ S0 Y1 T. {5 P/ B
*@定时器4初始化" |  r$ ?0 o8 M4 e9 h. }1 D' l4 j
*/
' E# g1 N$ p, \5 T  Wvoid TIMER4_INIT()# y7 t- Q& j( R8 p0 R& t8 r7 [4 }
{8 o/ d1 w  C5 u- D% x
        T4CON = 0x0e;                         //0000 1110
  H- i( E# A# K! z$ m# U% j' @  g" c( U( n
        TMR4IE = 1;" v& K' M) k" j" {. h1 i. N
        TMR4IF = 0;                              
$ O' r1 j& J5 B- _* v
) I0 H9 P- v  l' f) Y% A7 U$ t2 a        TMR4 = 0X00;- y4 r6 P) C" O8 ?
        : m' H$ p9 S2 y
        PEIE = 1;
$ o2 X2 a7 m' `4 x' E- e" [        GIE = 1;
: B: a! _$ m3 Z0 Z4 p}# l$ O, T8 A0 \% L. Y4 U
5 \2 H* E% g; q- w2 w" Z* C3 E9 R
) z9 A3 @% R6 |- g" A
/*
, ~( T1 z# A: O*@ PWM初始化' K% j& S& Z2 n( v/ u# V+ ]+ d
*/
* C! V/ P- r! s2 Z! }& Yvoid PWM_INIT()* c4 @8 A! L$ `5 a. O1 Z( V
{
! r$ E2 L9 V" C3 j& H0 s        CCP3CON = 0X0C;. b, c: R0 _: E8 O+ k
        CCP4CON = 0X0C;6 a4 v( e2 E, n" J' v1 m2 X# K6 g
        
) u! G  y( Q. _$ D  I* D" L        CCPTMRS0 &= 0X0F;
# x% ?. l( M. n: e( F0 ?        & A2 N1 L8 c1 r( F
        TRISG = 0;" F! s+ O( J2 d
}! t* ~# w+ S/ H  N7 F; \$ h

9 a! G( w  J- `) k  }8 Q# I6 _1 W/*
/ X1 D$ y. H$ r' z; H- R- t*@Function 主任务函数# _6 H( L! n& B
*/* k% `; f( {! j
void Control_Task()
; U( S8 J. u, b- N- j2 c{- Y$ {4 ], x/ V+ j6 E
        static uint Time ;$ Q( T, @- |: n0 f3 a5 T
//        static uchar State = 0;3 a+ B1 F; ]* l4 t) O
        static uint Record_Time;
9 g. x" q8 a+ |. l7 y/ O        uint Delta_Time;
% F8 T# ]" T5 t6 P9 @5 z8 k% X) w        / h" ?8 @5 E" i% m
        if(State == 0)  h" H1 e9 Z0 p/ O. P
        {+ P7 q6 `! E- `! ]4 D/ `+ {
                Time = 1000;
/ o; D  _8 ^  v3 L                State = 1;
* F& x1 S: v1 s# f0 o! r8 z* |! n) R& h  T( h& ^+ F  K7 r) _/ \
        }
  D  u( U% s$ N8 H" x! T5 Z; Y        if(State == 1)
( w, |7 \: M2 A+ N; w        {
2 I" t( m# z- y7 e' z- \% N( [                PWM1(Time);3 B3 i) `9 A! }; ]/ M' c% x
                PWM2(Time);
  E* z2 X( w% M2 }                4 m7 I) m% T' H1 S( S0 M
                Record_Time = cnt_1ms;
3 Z9 q) g! `/ h               
5 ^" l% J+ n  c& O                State = 2;% P8 g* f8 k% j% b4 v. j( Q! |7 v# }
        }% }+ d- W7 h$ Z% H! g& v; H7 u/ N
        . o7 u0 ^  |0 S# s/ t% ^& d' T- ~
        if(State == 2)
+ S3 @! S% a% A8 \9 p        {1 Q" b* J* J9 a! _% y/ U5 `: @0 r
                if (cnt_1ms < Record_Time)
1 D1 m2 Q( H3 O2 v* @( f                {
, d8 g0 m' S! z                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
3 A# [- G( _4 I+ i- u' V" c                }
' f8 S' `3 Q% A4 t                else
- J9 _* ]! c/ M6 P) @! W                {
7 @2 |+ i, }" H                        Delta_Time = cnt_1ms - Record_Time;                ' a6 s0 d4 k. F1 [) k# _
                }" V: }  x7 k% C. f& Q, W

7 J0 ^: I" O$ o4 h9 _& _                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
2 g# x' @( C- A3 I& ]. A  f: K1 _                {& X/ @% ^# n- f% L
                        Time = Time - 100;3 b; l- z8 B5 `2 m
                        State = 1;; w. z3 B6 M9 r" ~* K2 b! Z8 M- O, q
                        ( {8 m- N- m5 w( D: s
                        if(Time == 0)
+ t+ V( V0 E9 E: j# ]                        {# L! F& @, ^( j; z$ F
                                Time = 0;
& T' L, h6 P8 a2 {3 e! g                                State = 3;; S* B& g& D, g( {. b  }
                        }  E7 O! {' d* L. X- M: ~
                }
$ h7 B! B: L/ M# ~        }
+ r8 }6 C. O; A2 s        
1 Q, [" n! L1 y' {" j! f        if(State == 3)9 ^' l3 s3 ]( N: ~" W2 _
        {
# m) U6 o7 ^& C2 D                PWM1(Time);
5 Z5 `0 Y0 J8 |- N% W, `                PWM2(Time);+ z7 o/ P# }. o! C& J% @( ^9 p8 q
               
, L6 U3 N8 h, {. V- _                Record_Time = cnt_1ms;
. d) i! J; V) T. ]                + q: r" M; a# O6 l! ?4 P
                State = 4;
+ `" E% o7 H# O6 I0 ^/ T' `, V3 X        }
& o/ S( _3 h1 [$ D        2 w5 `& s6 M, s8 v
        if(State == 4)
2 V# e% J, t' R1 k1 I        {' V$ v7 T: r$ `- V; v1 j  O
                if (cnt_1ms < Record_Time)
, ?# w3 F6 w- _  B7 X% Z                {. V" R" P. I0 K2 k% x
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
+ r. E. Q# j3 I2 A' ^7 n& {                }, o7 ?; O' O& C. h
                else
2 j  G2 O1 U/ h' E7 {                {4 I0 G/ b% Y: [$ v: ^
                        Delta_Time = cnt_1ms - Record_Time;                & ~2 `9 W& Z$ p7 ^
                }0 C! o& [; {/ O2 q' C

  h( Q3 I7 I( x5 B! i/ D2 {: P                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT5 p1 D; O* a  ]+ S
                {/ F* V6 E5 j( K' E1 Q8 q3 t% q
                        Time = Time + 100;) d3 X' P9 E  Y% k, p* g( T
                        State = 3;
! g$ O7 n; T0 }. x                        
- _3 O2 X& S- p4 u: `; j                        if(Time == 1000)
  Q* U7 i9 @( q' E& A0 C' Q                        {( \  E/ v; |# c. P
                                State = 0;
1 J  z  e6 X6 U( \6 R) y( B+ [                        }' O: _4 l9 O4 y* [- L. x8 L9 u0 V
                }
/ V% Z7 T' i8 l6 L5 h6 O; p6 X  `        }
' C& a  H) }2 M3 L# M! w; q) t}. U9 F6 D1 a! z

1 c2 Q) R: [: Zvoid interrupt ISR(void)% i& N' ~" N2 x+ H, o9 q
{
( Y2 Y  T5 J# a: Q! B  p* R# j        if(TMR4IF == 1)8 F- N7 E% x5 b' C8 t
        {
" z+ \/ I: ?& D% t5 _* l- C                TMR4IF = 0;& o8 `  z3 c. u, I0 B3 h; M
                cnt_1ms++;6 Y. E+ T! f5 L
               
' I4 i9 v' J6 [1 s9 D        //        LATF0 = !LATF0;
/ _" B- ?0 r( w% ^4 W1 L        }        
2 W, V& k+ K. B}

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 13:10 , Processed in 0.060573 second(s), 34 queries , Gzip On.

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

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

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