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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
5 M9 H8 o0 d- E0 T0 @& Z& q+ r# T/ n6 T( A7 v6 ?2 O
/*
2 E( j+ v5 s' E$ {/ |# X9 s5 G' i*@Name:        PWM_led
! f* _& J+ o$ N, u9 z5 b*@version  1.0
6 }- \0 u# i5 u& {% I* n*@Author        xiaopan4 E% J# W5 i3 B2 t- ^+ }: n
*@Date                2014.8.2. w, H+ o2 M) U! X4 m7 i
*/& s) c  n/ y" |5 d7 Y9 e5 N0 L4 ?
6 W, `. l8 A5 y$ ~4 O. [
#include<pic.h>& J6 [( s1 l: R- T9 G
#define uint unsigned int
# @0 [7 r, R  w: u, Y& C#define uchar unsigned char' V$ Z2 T; ~2 @! {! U( ]
4 P5 |5 X( n$ q% J% t4 G
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
- I8 q2 [; K1 F/ K#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
$ `* |+ d9 S% C9 \4 U
* d# `3 h1 \4 C( v# e3 j7 n1 Luint Time = 0;
+ V, a& j$ L1 Auint cnt_1ms = 0;' `2 W+ S* H: u) a& B7 j$ k
uchar State = 0;
' Q7 D; U9 y4 {! K
+ I: F9 w+ ]: _, |6 {/ yvoid GPIO_INIT();' N# k* E% |9 G. Q1 j
void TIMER2_INIT();, _' w" Z, H/ U
void TIMER4_INIT();
4 |1 B6 u1 p3 x8 Q2 q" Avoid PWM_INIT();
' G( G5 v, w# |% V$ s* Z4 [8 ^void Control_Task();
0 o) E/ g: [( ^/ H6 U+ D+ Q$ \; u1 q( S& d
/*. n; |3 @4 n4 N' I. J- @, G' I
*@function 主函数
) m# t- {  O& y2 Z5 ?3 u*/
( m/ u& i5 L: I. a: g7 Ovoid main()
2 T8 Z: D  E" y. V$ M$ v  L{$ Q; O" m9 y/ G9 ~2 [& O  O- d. {
        GPIO_INIT();
( Y) y3 ^2 D! g2 C, o        PWM_INIT();
7 V' p$ y. k$ y( L+ d2 a) `0 E+ Q        TIMER2_INIT();                                //PWM利用TIMER2
/ _5 K$ `0 o5 f, l3 Z4 H6 B- Q        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
! x& W2 {" P6 D) T        while(1)
9 S! A; c# F+ H9 U7 s6 T        {. B) j& O" _+ a: |3 |8 G
                Control_Task();
$ a5 y, d7 u+ A        }; q# l$ F) A3 ]7 U+ B) b
}% ?5 [7 _1 f. b" j
/*: K! R. ^  T) i' {
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
  _* E7 h# G3 H+ ^*/  W* _5 A# |$ v) {% P  s  g! `
void GPIO_INIT()
& i, {$ o& t' A. n{8 [8 S: M) j4 c, n$ e6 N" s9 Y# ?
        TRISG = 0X00;        //设置RG口为输出
) B/ }5 y- q) G0 z3 k& O9 F+ T        ANSELG = 0;                //设置RG口为数字量
! g! s( O! j0 q        LATG = 0;                //设置RG口为低电平( E/ d, z& p; K  C, J, X2 p
        
, `6 N; [5 N! q- G# T1 B        TRISF = 0;
1 s+ t" B+ g1 H% |- v/ n* O        ANSELF = 0;
2 y6 Q* T0 z5 l% {        LATF = 0;! C9 p* M, q6 P# H
}; H5 E9 z/ w( E$ M3 F

7 N* _% l2 i: _2 V; i( F* j5 o/*; S% u( K8 D! j, n7 }" S3 e4 G
*@定时器2初始化+ u4 {, i% R. D0 V
*/
7 `+ D# n5 y+ `2 O  B8 {* w8 xvoid TIMER2_INIT()" X" @/ ]0 `: ?( P( s
{( m( ~* l; W/ ^2 H
        TMR2 = 0;
- T* {5 c' p8 [8 J  k        PR2 = 255;                //255
) z/ J& \6 U3 c  U4 `$ q$ b+ a        , @/ C  A. j& a8 m4 M
        TMR2IF = 0;" V* B3 I' h; @
        3 C; T3 ]( Q( Y3 \0 s
        T2CKPS0 = 1;        //19 x" Y* ]/ W, [7 c6 l$ R
        T2CKPS1 = 0;        //0; c1 w9 [0 N1 e% E9 d/ @
        7 a/ [1 A5 Z: f: ?
        TMR2ON = 1;        
$ F- D* d! p. l6 P) c4 A: j}
+ k, N7 P: t. x  p. l3 _8 p8 O( R3 h
/*
& @  N9 p* q5 J9 O6 o, ]*@定时器4初始化
1 [% i8 j; ^: d6 @/ c*/$ s7 \% T* _& C2 p
void TIMER4_INIT()
& s& Q% Q( j, d' G1 u' a+ _% W7 d{$ q$ v8 K! ^. y
        T4CON = 0x0e;                         //0000 1110# A' Y$ y: s8 X6 a
5 H+ ^& F  `9 A1 w; l& J
        TMR4IE = 1;
( V. O; _) S8 [  z        TMR4IF = 0;                              
+ ?; q5 T; F  H; G( u9 b9 O% Z# q9 a5 u% A2 g1 {
        TMR4 = 0X00;
5 F; V, m- x4 a- \; |        : n4 z9 L/ E9 R. ]5 v% S( _+ L
        PEIE = 1;
" K/ Y& @+ I, t. ~        GIE = 1;
7 Z6 N" c1 \2 e% A}
+ O" [% j2 l* q  \- j; O* Y4 k2 k  J9 T+ b7 k' f

  B( j, z4 f) P6 R( a+ G/*
( v; G* q3 [3 R0 V; t) r*@ PWM初始化
9 R0 I" o5 |- N' ?( R*/
: y( N% ^5 y1 {6 E1 Fvoid PWM_INIT()
5 X* `* Q5 c' ]  [{( Q) u2 S% U# j0 a5 o
        CCP3CON = 0X0C;  v' w' P8 B, i3 W0 d
        CCP4CON = 0X0C;
; `8 }3 y7 q) ~: a% s        
; ?7 Z+ j( t6 r% s( s& d* w8 n3 J        CCPTMRS0 &= 0X0F;: y; v+ f$ L+ p2 p  d9 Q$ \
        ! H8 }+ E4 F( n1 w
        TRISG = 0;
- I" I! z% t# Q6 V}  r9 l8 d* Q4 C6 q

0 F8 h8 M8 l$ j1 o' C6 M/*
+ U. j: e0 ]4 c2 W*@Function 主任务函数6 Y# D$ X% }$ n- T  ?
*/
4 F- p. Q- \% L" s+ c) A; k1 hvoid Control_Task()
9 V  [8 E+ A5 s& R1 d7 |2 p8 g{( |, e! C, b+ ?4 l' E; p
        static uint Time ;
. V: b6 N1 ^1 q7 t//        static uchar State = 0;
( X: k' M4 S* C: t+ [3 N        static uint Record_Time;' H+ L1 u0 D: R; f. M2 S" S
        uint Delta_Time;
- m. N- ~& R/ l& y& s. d        
# r" m9 Z) o2 q: t# z        if(State == 0)
& W- f% d( n3 k1 Q        {
6 }. s; x" ?% U/ P: ?. }! t% i                Time = 1000;
2 o- L, L5 V1 h0 f$ f1 _                State = 1;
4 M- F6 H, ]9 i- C& [; R  I; F9 H0 |$ |$ u0 f$ z
        }
, a! G/ c1 c% \- s3 U6 C        if(State == 1)
" ?# D! o$ j3 K4 w/ A        {: ]; h8 g: Q8 u
                PWM1(Time);6 I' c7 i  a6 `) ]* _) {  i
                PWM2(Time);) K. x8 W; f5 C  z; B
               
% D# x+ z" X2 [, v3 M                Record_Time = cnt_1ms;
. C2 ~. I+ U/ c7 b) j               
7 D  ^4 K2 ?! m' v" K                State = 2;
) L, w2 }$ H8 \6 `        }
$ ?# x, d* X, D        + Q/ @" W7 f6 @
        if(State == 2)
0 D/ r, I0 \6 t1 ]        {
7 D! {8 c) U$ X4 A                if (cnt_1ms < Record_Time)
! \& W" l* }  a- g4 }                {
5 U6 o/ B/ v* o. C3 s                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
8 J6 K5 d- ]+ w: G; x3 g                }) G3 H) i) B4 U1 A( J3 w
                else
' X! V# u2 t! \. j5 l                {
  |- o0 `! t0 T% \2 z9 I0 o                        Delta_Time = cnt_1ms - Record_Time;               
7 c; Q* a2 F& }5 ?- z* y- H; |                }
4 U0 n3 w5 ]- g- a
  T" G* J+ f2 U3 e1 L* [                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT( {+ n9 t( l  ^) O7 P/ `8 n+ N& m# V
                {; a7 u/ o- Z# l" x( ?
                        Time = Time - 100;) a3 ]6 g& |/ @2 P0 p, S- l. n' \
                        State = 1;# d. v. h& c. ?; c- v8 I& s
                        / l  {; }8 i# g7 I5 G2 i4 G
                        if(Time == 0)
" [3 e& D* t' F% V# _' a0 ^& {                        {6 p- H. `5 `' f1 K
                                Time = 0;
: ~4 f: r4 T0 T6 ?: K; R                                State = 3;" o/ T0 g- d) o' Q
                        }) L0 @# w  Y$ U$ K$ g! C+ }4 I
                }/ F! b  I' ?5 A! U( ~
        }- ?# O, Y+ ?- B
        
( k  X: @  Q) [+ e        if(State == 3)
" u! N( [! h) e* f" d' d# D        {
7 X  v- @: a* ]9 i  y( {                PWM1(Time);, l0 N, K9 |, r* s& h7 J1 X- N
                PWM2(Time);1 M7 w8 Z% S+ M  j( p- }9 ^7 i
                0 J  I7 Z' ], H5 K  ?1 c. k& Z6 |5 _+ {
                Record_Time = cnt_1ms;
2 [4 ^; Q9 P" \                ' h% r" B  j/ [
                State = 4;
( L1 w  I, b7 p6 [4 Y        }+ G8 a( j) W- [% Y; c
        2 B  k: N1 e+ c: {. N
        if(State == 4)
3 ]0 Y5 s. M5 d; h        {
# M; I, E2 T* ?( _* Q                if (cnt_1ms < Record_Time)
: H6 }2 n$ y9 h9 T" `7 B! W                {
% _# z: P: c4 S4 e( g6 E                        Delta_Time = 65536 - Record_Time + cnt_1ms;        # T' P2 `: l; L* E
                }; J$ ]; A: I! W& d6 D
                else
7 ~: i5 G6 y1 u- t6 X                {9 e$ x( ^4 {1 `2 [4 k$ ~$ w0 `+ e
                        Delta_Time = cnt_1ms - Record_Time;                + R5 s! v0 |! f7 a% [9 h
                }% Q6 Z) {8 D( z- Q; |+ \% A0 d% z
3 b0 d/ w9 M* Z4 m% b
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT) o- ]% S0 A" \/ Z
                {
9 u: R, e& r- U4 b9 b                        Time = Time + 100;5 L. K  J. u9 S
                        State = 3;4 `6 I  S' b5 B5 J
                        
& W8 T; T* B" |: u3 X0 j; t                        if(Time == 1000). C/ B% ?. o) ~- y! ^
                        {
" S+ \% H7 ]$ V" I( N0 [2 s( e                                State = 0;
& R0 X: C0 v, e1 m' b7 }# K2 |                        }
* t1 L; O4 s/ A( t! a. n                }
: E1 }/ l+ Q3 l5 P, f        }/ X( [$ D5 v" Q$ t+ X
}
& w1 b: T" X( t4 @
; T2 `9 _4 T' |# tvoid interrupt ISR(void)7 |( U4 c7 h* G0 L: ~9 q8 w
{
* i. s0 N5 L( b( Y8 j. t$ ?        if(TMR4IF == 1)" [5 u, I' {6 P( m( f
        {
' `% m7 h/ F! c, \                TMR4IF = 0;
; j$ _3 M) g4 E" p                cnt_1ms++;( E6 F( Z, ~/ ~
               
; |9 I( D0 K' X0 h1 A        //        LATF0 = !LATF0;) O$ R4 g6 U  U' {4 H- W
        }        
" g; H9 p; X# z! [  I}
: W2 R5 o* }/ k+ j

PIC16F1947原理图.pdf

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

该用户从未签到

2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
5 ]& o4 U7 Q& l4 Q

该用户从未签到

3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!' E( S  `% y7 c

该用户从未签到

4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!
! n3 R5 ^& @& w, `6 I  ^( H+ P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 09:09 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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