找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

156

主题

543

帖子

1180

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。1 m0 R; f: }4 w& g

: `$ Y6 m  J* c# ]! G/*
, A/ r8 W. v* i; G" F9 d0 P*@Name:        PWM_led
, I6 ?8 N8 X3 g! e# ^+ h2 U*@version  1.0
( ^* q3 @8 D/ ]- a) [& K7 [*@Author        xiaopan
- }3 u, p) ^! R6 `*@Date                2014.8.2. y5 b- U2 W; i& W; |# b5 y
*/! b. C6 N* E- o% ^# a. F  @$ x

) T- h1 ?, |( {! R8 z$ P# I#include<pic.h>( `+ r+ }, `4 ?1 F, [. i: H: W- w
#define uint unsigned int
3 S6 f/ D8 Q; ^. O9 v#define uchar unsigned char
5 C- @" s  G: I( ?/ `, W2 I# U9 c# |  G/ Z
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        ; ~, V$ O- N# W
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
! Y  w# |3 I' X" t7 M! K; q& R
* ^& ~1 q9 y; y2 Fuint Time = 0;- m7 i: o) E1 D1 n- U1 M: @
uint cnt_1ms = 0;
+ W+ b( B7 ~; K6 Wuchar State = 0;( s2 \( c- p+ q; H! Z( p

$ a0 t8 Z9 ]9 P) d( b8 Hvoid GPIO_INIT();0 M0 S( q% [: z) g3 L
void TIMER2_INIT();
3 [8 W3 G) k9 W. e& Ovoid TIMER4_INIT();
0 K2 Z6 ^0 L0 c6 I0 ?6 U& O6 rvoid PWM_INIT();
, `, n2 t6 K9 e$ p3 a  gvoid Control_Task();# P! {  i8 v& \2 |. A% `
1 l: d4 p- u9 r# s
/*: R& V  s5 v! [" V4 o* F
*@function 主函数1 G4 l) ~+ _% l* b
*/* a6 L8 k! j: Q+ _6 A; R! c1 |
void main()
5 V+ x# b# P% V' e4 k{3 U; F( E6 |9 f- [5 m* D
        GPIO_INIT();  N  U, O1 W/ u/ W; h* m- j2 n
        PWM_INIT();
" f! I3 f0 P! p5 X5 g        TIMER2_INIT();                                //PWM利用TIMER2. l6 v  {4 J, G% r
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形$ s4 S/ J  m, W% a9 T
        while(1)3 t6 `3 I: j" @  `, q
        {
  F3 g, B6 p' P$ J                Control_Task();
0 U3 D( N/ v7 W: Q        }( |- T# s6 }& D) T5 P
}
9 I: W, |2 U" R/*
8 f3 R/ {$ v) P( I# F+ F0 W*@Function                IO口初始化 RG0        CCP3        RG3        CCP4, ^" R8 j9 L7 u" w
*/2 v* d, I1 h  t* t8 U
void GPIO_INIT()2 t0 O5 x) F: y  s. P9 M: P4 t. M
{
) M8 H8 c, _- @        TRISG = 0X00;        //设置RG口为输出2 {! v. m9 T9 x: G) H
        ANSELG = 0;                //设置RG口为数字量
, C. v& x' o/ j9 ]1 n        LATG = 0;                //设置RG口为低电平
! i' }8 j$ W7 p1 J( q, {        
9 i" `: \* n( a' f5 p        TRISF = 0;
( O8 o5 @) c8 u; }/ K6 S        ANSELF = 0;
/ \6 c. G3 R( d. Z& ]! k( Y6 c        LATF = 0;0 y3 a. |! Q" X$ P6 s9 B
}
+ {* X7 |: `9 N  H5 W- s) Q' d: L6 F) N% V% y
/*
: `9 y* N% K* ], ^*@定时器2初始化
% O3 R- p) @) N! }% h*/
. h$ ?* F8 r; r" U. D: G5 }/ cvoid TIMER2_INIT()
" r1 v0 K0 y( G, h% [{# p3 m" F8 D; Q2 n
        TMR2 = 0;
" `8 v" }# S7 R3 R        PR2 = 255;                //255- D, _  ]& L) ]$ C$ o( S/ e
        
5 f& W* O  r0 o7 Y4 ?$ T        TMR2IF = 0;
, J5 k4 n! A; N7 H5 |        
8 \" |' G/ Q  F9 s% o8 D! G        T2CKPS0 = 1;        //1
8 `) i; U$ L2 J7 g1 ~; q& E, \        T2CKPS1 = 0;        //0
* X7 D6 C& O+ q1 w  E3 r- M9 Y" F        & F9 \  ?8 Z: A* {
        TMR2ON = 1;        
: X% f7 s" H' W8 c6 u}/ @+ D( o- J! k. ^8 E; y: R0 ^) }$ ?0 \# p

+ `5 g- d1 M# ~- J: f; Z/*, n+ }* p, V% p: e. {) Z' r
*@定时器4初始化
7 n8 F' i+ l" y1 M0 D) j*/
; h+ @- e& S; W7 }  \- ~( Lvoid TIMER4_INIT()# r7 G; H  |+ V- y
{
. `, p& E% a6 y7 k        T4CON = 0x0e;                         //0000 1110
/ o% ^1 i  p( a) f2 i: E
! b$ k8 }' Y) J1 }' d' i8 \) O        TMR4IE = 1;
9 I/ x( Y1 Q, M  }        TMR4IF = 0;                              , y9 H! m- w: [2 L" ?2 D4 n. `6 r) y
2 Y5 H* _& S0 e* }. q+ c
        TMR4 = 0X00;& w( p9 a; a, D* m6 M
        % Z5 n( u& E  Q& @
        PEIE = 1;
0 o  R3 j. \+ n3 L7 Z, R( p7 B        GIE = 1;
4 `& L7 Z' |) k1 P9 S" l6 z}
! \4 j; A1 A6 v( x6 |" O) s  M; e
, D8 k) _  e9 z) [9 g) J1 {6 q$ V. L) k. y9 t8 p
/*
: C0 c: _8 A9 R6 q! B*@ PWM初始化
0 u; k9 X: m7 S7 @% y8 @0 l*/- {; h& e' Q& s
void PWM_INIT()+ s$ _* \, [( v# z/ j  H3 s
{! p/ F) w) ~2 e$ [/ r, [
        CCP3CON = 0X0C;
; r) C6 j3 g  b  p/ G        CCP4CON = 0X0C;8 [# Z, V* s1 N6 N
        
2 r  D" `+ T6 m7 a) _        CCPTMRS0 &= 0X0F;$ d8 n* i) B  O" h
        / ^) w( E7 N. Y& o
        TRISG = 0;
% ?2 i/ V* |* e. C# q, e, m; h}
- Y+ O9 J$ Q( u& S3 F* x$ T  n. {* S* x
! }3 |- b7 _2 W; W) B$ S6 |/*4 u: j. b3 U3 I
*@Function 主任务函数$ K6 U6 g$ b; S( S6 B3 [
*/
# n) v/ [1 X+ h: Gvoid Control_Task(). @$ h# V3 j/ ]& f
{
1 N1 o. h/ v6 S: t. n        static uint Time ;
, P+ n& ?7 S* s% I" D) S# }% i2 |//        static uchar State = 0;
- c4 O3 r/ Z1 m9 E7 v        static uint Record_Time;
6 x. I9 [# ]' X" ~        uint Delta_Time;: z1 ~' }7 `$ V* G/ }& a
        $ i; D2 b! M; a, `$ S
        if(State == 0)
4 G; v3 a% Q% R# Z' K/ ]        {' y) g7 s7 H0 @! M2 P
                Time = 1000;3 W- x$ t* g3 o. s- y
                State = 1;$ q! E7 s& z7 p. D6 A6 O8 e
) w! M5 i. S1 K3 {
        }
8 R: Y1 ]  r, s" k% J/ X        if(State == 1)
% R  A7 L5 y! \2 w( O# G        {
6 t/ F  i7 q5 T- a" C$ `, L# C                PWM1(Time);
% v" o6 Y1 A$ {8 I" ?                PWM2(Time);" E7 W$ e3 N6 \( P
                7 K2 z  m* W, n2 B
                Record_Time = cnt_1ms;: |9 M/ G% G3 Q/ k( ~
                , \) Q$ S' N+ d" U$ N
                State = 2;$ ~' B! F4 p( E5 W. ?
        }
% e$ \$ J: Q* R7 \) B1 l3 B        
; j1 @6 c9 P' F7 b- h/ x        if(State == 2)
3 Q  ?- Z2 ~4 X2 I& D        {
4 z4 c! u, q) y) P* W' S+ q                if (cnt_1ms < Record_Time)
* t* P4 y1 T4 y4 c                {
6 V) Y( D/ y/ y7 i5 u                        Delta_Time = 65536 - Record_Time + cnt_1ms;        + ?& Z+ p( h2 ^. m& ?
                }
5 C* Z. y* a* n1 M& l                else! y: [$ O! \3 u5 l5 o) J
                {
$ @  I4 q( d' T: a0 T) j                        Delta_Time = cnt_1ms - Record_Time;               
& f+ E5 J( T( J* }1 f* y- Q! \                }1 y  Q6 M1 C6 C/ b* `2 E

$ e( y/ k9 ]. h/ f( \$ N4 k                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
* f5 Z. Z' o9 N0 ]* \* `, j7 R& T                {
4 y. D+ G# b' s- K/ q6 g6 H2 I: L% M                        Time = Time - 100;: b! y+ }# J) {, b8 m5 i" W4 e
                        State = 1;# ^. ]2 q8 y3 q) E
                        
6 P1 V0 Y" O% U5 \3 p6 Y( B  }: I, Y                        if(Time == 0)# r! l4 F0 f* D
                        {
+ D' t; S: h& |: J6 q! [" ~                                Time = 0;# f) J6 b. T/ j, h
                                State = 3;
% z" m; K9 \" Y! g- c9 _6 i0 z                        }
2 o/ _) D( l/ J1 `3 D: b                }0 ~4 L7 v$ h& C
        }
+ g& e& I$ s3 t: }( I6 e0 z3 ^        
5 J; \9 m2 t! ~6 L6 |        if(State == 3)
- k2 o8 D* i' Y, |& U+ R        {2 t/ T3 [( t5 t' M: j0 l& _
                PWM1(Time);+ Q4 j9 c7 F0 d
                PWM2(Time);' l$ k* j; x1 k* F
               
* z1 V8 T6 c. m% R3 D2 }* O                Record_Time = cnt_1ms;3 D& v6 t0 R! H6 b
               
; E0 l, s5 m+ j; j8 v1 J9 s                State = 4;4 g+ ]$ [0 }* E7 l, V
        }
. F- n* q' T6 I2 o4 B" w! x        
; ?1 T# Z' E# Q! D6 {3 S/ m        if(State == 4)
) k8 ^$ l- ?; _4 }* ^$ W! b        {( r5 W* F# _: `3 c* h- I& S
                if (cnt_1ms < Record_Time)
# b3 a; t$ n3 T' u, V' e                {; N# z2 S& d' L) j& D" B
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
$ R- d, e/ Y3 X  r# |                }
% a; C8 H2 M& q3 W+ Q) s  m                else
+ f& R; u; c( c9 a+ x8 Q                {
4 X  N* A2 D3 P) e: \5 e; k                        Delta_Time = cnt_1ms - Record_Time;                9 o) R" D! y& ^* U
                }
$ |. F* M) k/ U# B' \4 v3 r. @3 p
3 T9 j5 d% V3 q: S% x8 _" n4 \' d% G                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT! L* a$ D7 K! r& L! A% G/ Y& R, s3 W
                {
4 J) k) ?9 z  B6 e$ q( X                        Time = Time + 100;: V9 u0 B: a1 Y$ j* A
                        State = 3;
5 ^6 g0 @  S/ V" M  s$ U; j! g- l                        $ K+ H. j5 m0 C. t( N8 p
                        if(Time == 1000)9 e( l1 T/ G6 a0 ^' h* Q% h
                        {, O. E5 V7 T' _8 G1 U
                                State = 0;2 o) T( i) U/ o1 P' v
                        }
8 S7 y3 P+ @6 }( d# c7 n, {/ y/ m                }1 a" j; Y. E3 W: m- _  v
        }
, h/ d) C3 Y) z* W}: R/ C5 B) s/ C9 [- u2 ^
( K, R8 p; T2 d8 z+ j7 ~. v4 ]
void interrupt ISR(void)& t8 {- j3 ], d( _$ f' q! ^: W
{
/ o$ W) U% @% T" ^% l8 j# O* s        if(TMR4IF == 1)
: i9 f$ [8 g1 Y! W: D        {" ^0 N  Z. b! h( l* }
                TMR4IF = 0;: V9 c2 s/ @4 M, z1 w) B. ?/ Y
                cnt_1ms++;0 P; J1 i. k# c2 d5 G; S
                2 y1 G, D5 _/ o4 c
        //        LATF0 = !LATF0;
! S7 E% }6 X: _. k0 `% _        }        
1 R1 d8 U" U8 W0 F) p}
1 v# @# x/ @( h9 z. c  d- N. r' ^

PIC16F1947原理图.pdf

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈; g' ?/ A' Q% W

160

主题

620

帖子

1233

积分

四级会员(40)

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

积分
1233
3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!
* a% J6 w: M8 {

157

主题

597

帖子

1239

积分

四级会员(40)

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

积分
1239
4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!& w; |! h8 p+ d) B! [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-19 06:08 , Processed in 0.057536 second(s), 35 queries , Gzip On.

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

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

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