找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

156

主题

543

帖子

1180

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。! h) m7 b, T# f& B
9 Q, O" g6 Z5 I$ h# N8 u/ r) x
/*4 c  }! O1 K! T' R. p3 S; N- C
*@Name:        PWM_led: B! I! W5 Y. \$ Y% g
*@version  1.0; _) c* i2 r' I8 ^  r  e2 m( F2 _, ^
*@Author        xiaopan) G; k6 `5 I6 E5 [4 h2 b1 I
*@Date                2014.8.2" Z, h7 P  T, x7 Y$ @
*/
" \% W" ]  X0 Y2 z. e4 a) V& Q* B# d; V2 d8 ]" n9 k, n
#include<pic.h>& h* k" `! q8 X1 {/ `9 R
#define uint unsigned int
9 f9 @& @3 M3 M/ S#define uchar unsigned char
6 K- f1 T, U0 Q, m- T
* q% z: ~4 a! R' R% b4 q#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        # \' `6 x  \' {" x2 v( l0 ~" [6 `
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        * a! `  Q. D2 ]0 E2 S0 v1 e" ?2 }
) f; y% N# b6 N" ]7 }6 k  ?
uint Time = 0;
+ O% `: G' @' Y' Xuint cnt_1ms = 0;
; L# v6 e; v9 o; `uchar State = 0;! o2 g: v: W9 b+ g

) }, G4 r7 k& {" q1 N6 I! @! avoid GPIO_INIT();
: K8 T- k* i0 E5 r4 t+ ]2 N+ y! Tvoid TIMER2_INIT();
. g0 u, K# T$ m& |3 Z: F: Jvoid TIMER4_INIT();  k$ w. T/ `1 \& h4 ^- N' S0 m
void PWM_INIT();
( ]# Q' j2 s$ N" I% hvoid Control_Task();
" `: m/ p, ]3 D! r( T6 j. F0 M1 N$ ?) ?( i3 t. w. {) M: c+ D- g7 z
/*
% x6 u5 M/ }1 j& s/ H*@function 主函数
, }5 A+ F2 a1 b*/
! p$ V! ^0 r' I3 J- c6 Y0 c% Q5 o6 v8 `void main()1 e' i0 O2 J1 H% N+ f- \1 z9 o
{
( q: C+ \) M" j& G        GPIO_INIT();
* J  g' h% j& J3 V7 }        PWM_INIT();! o6 e1 {) x+ |4 X! h" i( j* [
        TIMER2_INIT();                                //PWM利用TIMER27 r' V: @; P0 ^# H2 \
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
$ B. k1 D" b0 \* V5 X        while(1)4 R! q* V# x0 i$ Q2 d
        {7 C# \+ e& K; {* G! e
                Control_Task();5 u+ K" w( f3 J$ s
        }5 N2 N* |0 x" U* t- a3 o
}
# Q3 w6 ]  h5 o& k+ S, m4 t/*5 M4 G. L9 p0 x+ l4 C/ M
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4, m2 H/ r( c! ^% f5 V
*/
* ?: C/ l; M: J( fvoid GPIO_INIT()& K' J. v- j) M( S1 `$ z
{0 t9 r3 g8 {% ^; \+ m- B
        TRISG = 0X00;        //设置RG口为输出& K. r! p& h8 d
        ANSELG = 0;                //设置RG口为数字量  j7 [4 `5 c- o: q. o; d& Z
        LATG = 0;                //设置RG口为低电平& ?% I2 B8 J( J2 N6 C
        7 \* s, \& i$ d) F' N
        TRISF = 0;# N$ h1 e+ [* c2 Q3 w1 s% A6 ]
        ANSELF = 0;
$ i# J/ l1 U0 [* B3 M        LATF = 0;
( M! T! N4 G2 o3 E6 ^& O0 @: g}9 J2 c, [$ X) t, A4 R

2 G+ c3 Q1 X) z, |/*
2 ]+ E4 N9 {# ?8 x! x7 e6 D& y; R& R*@定时器2初始化
/ E0 V2 T% F% n/ S. ~& O4 Q& M- k*/8 ~- y4 |! q. ?  N: h. N. L* N
void TIMER2_INIT()
% m7 N: g6 A0 \- M: C{0 a" r  g/ T$ S- ^
        TMR2 = 0;
( q! {. T. X6 Q, `, Q# G* A        PR2 = 255;                //2553 M9 H- C) |' F. x& h1 i
        " `4 H0 {! m& h" G; O7 g
        TMR2IF = 0;1 V+ ]/ X; O, a. s  C! e: W# i
        ( I* x. b, z: U6 _
        T2CKPS0 = 1;        //1" i/ ?* j3 b  B
        T2CKPS1 = 0;        //0
) T+ n6 Q8 _  P( J, o6 o( l( o, {        
5 \) K+ N+ D* i  n# I& D        TMR2ON = 1;        
0 s0 E. f$ f0 ?}
6 j/ F& i) K$ e: t8 a3 h
7 y# v1 A. G5 u* U' c( ~/*
9 n! M1 D9 a5 y  z* g*@定时器4初始化
+ D/ b% y% `4 Q  G( P$ I' S*/+ W3 k6 N& [; m) E* Z1 M+ D* Z
void TIMER4_INIT()
! l) r9 U' p2 |2 b% |{
  k/ i) X  H& Z1 `        T4CON = 0x0e;                         //0000 1110
( ]% c5 t; q2 s/ `& |: @% l; E7 a0 ?; V
        TMR4IE = 1;+ S$ [, x0 X  n* P" W2 O) f% M2 n
        TMR4IF = 0;                              / g2 J- V3 {  T$ R2 _5 k9 ?( i# t1 F3 o
) t6 f" A$ L+ Z4 O4 K: m
        TMR4 = 0X00;
/ ^! y) T: W, s        $ D9 `+ a' r( D* {
        PEIE = 1;2 o  c9 p7 r3 }1 O4 M5 f
        GIE = 1;/ l6 o; r) _: ^, {" L
}
1 `$ u7 V7 e# q
4 B3 K+ Z  z7 p4 p+ {$ T: m6 c( M! n+ k- [( ?
/*' w. c* b( I1 r
*@ PWM初始化
4 ]7 w# M+ S1 \0 m*/5 |! x/ Z- r0 X
void PWM_INIT(); A" W5 h) d7 D% m# ]& R8 G
{
/ H& f9 ]) Q- R% l' x3 f        CCP3CON = 0X0C;
* O2 Z$ J7 N, Q  D5 j1 y        CCP4CON = 0X0C;: C  O8 M2 a: g. H/ ^7 j7 i
        
, ?" o8 Y2 U8 A! O1 O        CCPTMRS0 &= 0X0F;
4 s" C2 x5 |/ B* @        
+ d5 Q1 T4 h- C: ~) D0 |# E        TRISG = 0;
) V6 c* o5 Y& @& W# Z$ |}
. ?. T' `3 |: e) e& s
# N3 O7 U" ^. P3 {/*
% S0 T' _8 f( b*@Function 主任务函数
) S' C) d' Z* V0 \! D*/- M$ ]: z) [) A
void Control_Task()
# Q7 q8 S! }% `! f- I6 R{- Z0 y$ X( H( f& v" p
        static uint Time ;
# Z' H. d& m& r; B$ R//        static uchar State = 0;
( g8 O1 @  B6 f3 n( s, J& e  u0 |$ x$ W        static uint Record_Time;
% \+ D$ z3 t4 ]        uint Delta_Time;& G0 y% r1 h9 i; h# ~
        
. P, q* l/ e# H9 T        if(State == 0)
3 P. h% t8 |: V- ^; j) e& D0 B& v! [        {
' D9 i! @* G2 i( I                Time = 1000;
6 z# f3 B9 V2 k5 N                State = 1;
! V4 ?5 O6 s# t" M/ U8 w6 w
. \( |8 b3 m: Q0 N        }
8 f) Z1 G  P& F/ r/ z        if(State == 1)0 J+ e: F9 g, P* @
        {0 `1 G" o, Z* E0 {9 n; ]
                PWM1(Time);3 {* ], H% T, Z) w) e' @0 n7 T
                PWM2(Time);. i0 I# b4 p* o0 c" _# u4 h
               
$ L1 [% s) {8 m8 A                Record_Time = cnt_1ms;! s" a5 }; c. J) S
                ' E/ a+ N% a' n9 H" M( `
                State = 2;) V- |* G' C6 k) Z/ J6 M! M' I  W
        }/ G5 d2 z6 Y1 c* a7 S7 i
        % u. a0 v" ~5 R  N' \; S+ _
        if(State == 2)
- E, y2 }- K! x        {
( j" Q5 X  W+ }, \+ n. ~7 f0 X                if (cnt_1ms < Record_Time)+ H  F/ ?- a1 i/ |( {5 h
                {, t4 I, }- J) j% f$ Q
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        + M! {' x' {  o  i  o1 F( o2 O
                }
( I+ A0 V0 q) o! b                else
( ?& i/ T% w. M0 M; l/ L6 M                {, \! Y- C7 I5 o/ x0 G3 F2 J
                        Delta_Time = cnt_1ms - Record_Time;                ) i- t) n, a! q& J8 Q
                }
, d* v; {3 @& z& E" o  w( _- d* [9 n0 @& D. r+ ]+ |
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT8 e0 ]: j& w- C& y1 E7 V, r2 E
                {! E# g7 z2 M: R3 J: Z. x7 @0 Y
                        Time = Time - 100;
5 O8 a# J' K/ ~. P4 K1 I2 i2 z                        State = 1;0 M  g" Z* G; j/ {
                        
6 V: K, T& H( G& N  A                        if(Time == 0)
9 T3 Z3 R6 r2 }' x% u! E                        {
( w2 v  z9 ~$ I* N4 f                                Time = 0;2 U9 x5 D7 p) a& j- c" l/ t# m3 E
                                State = 3;
* R6 o; q! Z0 ~9 j6 g! w                        }9 S+ F1 ]5 O6 T" I
                }
6 `; l4 a' H; \& a8 k8 Y8 `        }
8 T0 B5 o" r/ C6 P+ v, @        
# d1 L+ ^" U; \2 p' B$ s        if(State == 3)
$ S) z& \8 A1 n# w( E( A  R        {. a, T0 \% F8 M- ]9 E
                PWM1(Time);. W9 d7 s4 `7 z# A; \' x
                PWM2(Time);+ `' J1 G, p' v- e* }
                ) R  E5 a0 b- U1 @: R
                Record_Time = cnt_1ms;
/ U: a% c8 O# F7 Z- J7 v- e                ; c! H: i" @7 n% Y- a  j
                State = 4;7 a/ u: d. }0 \: T
        }
: c/ [! ?) F1 \7 i5 c        ( _! L& w$ K1 k% `) x8 d; ~
        if(State == 4)6 y& Y! N' x! c% v2 D
        {
0 U+ A4 Y' W5 e1 K2 u2 W  B                if (cnt_1ms < Record_Time): q. S/ N$ X& Q! I- M/ s
                {
& ^2 v( Z) x  U; K: u                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
8 k. f7 x5 H9 f, s                }
; c9 O) z' k5 X. n3 g                else- W6 g+ I. W* G( {9 ^# v' d2 i
                {
) ~4 s1 ]! h: {) P) \                        Delta_Time = cnt_1ms - Record_Time;               
, |6 i" v8 g- Y9 |" Z9 m$ ^! i                }
6 M! M) n  `/ C3 w# i, N% E/ j5 }1 x0 ~
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
+ a/ P, W8 o( ]/ u                {
" H5 e* M& {7 j! P4 Z4 F6 p                        Time = Time + 100;
' w: p5 Z( h& D. g/ i                        State = 3;! `' h1 N. q' L8 ]3 ~# ]2 g3 E! w& |& B
                        
+ G4 p3 F' P4 L# @5 _                        if(Time == 1000)
4 G0 |5 m8 n/ q" C/ i  L4 B                        {
6 h' w. h+ {% n( Z1 o) |1 X                                State = 0;; K  C. b0 D7 q; ]4 x
                        }
* D# o* A/ n2 L) U0 ^                }
( b% N- R0 B5 A& ?        }
) J0 @  l( i: ~! f# G' J9 U+ E/ J8 M}
6 O# y9 s7 f3 d* ?  y
8 f/ s. m: Q$ _' P7 \& @) y' Qvoid interrupt ISR(void)
: n- O: X" ]6 J+ Q3 o1 E" n8 n{
; f# X- c4 H& A6 C' b        if(TMR4IF == 1)! q5 n1 {/ L  c* l. K
        {3 d2 [: l! F& J0 w% T. d, j
                TMR4IF = 0;4 h3 q8 ~9 t2 x" D4 ?
                cnt_1ms++;/ y, d# i& e5 q5 m% x: k" C8 p  p7 i
                / @" B& A, K8 D( H& h7 W3 z& B& I
        //        LATF0 = !LATF0;. M7 @5 U: x# J/ B$ ^" V$ O4 a
        }        % ~) E/ R3 Y4 _, ^: X. ?
}4 q5 l! o. d  \7 j

PIC16F1947原理图.pdf

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

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

157

主题

597

帖子

1239

积分

四级会员(40)

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

积分
1239
4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!0 @4 g# l; \! x; C/ t

160

主题

620

帖子

1233

积分

四级会员(40)

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

积分
1233
3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!$ \4 y& B/ x; u

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
, g- X4 E% L$ C2 n- d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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