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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
# e3 \8 d4 ?" x5 `( u# C( b1 C. U: R' I
/*
( e. T0 n: }, M*@Name:        PWM_led; }8 X( N; x7 r6 V' v
*@version  1.0
& N' R! O- Y: p$ A2 d  C) ]' n*@Author        xiaopan1 O! ^) `# {" B9 I: I
*@Date                2014.8.2
( T) u: z' {, ?5 N" F/ E; w% f, P3 ]$ j*/7 X" w) T+ S: s% |7 D% I
" O( V" o7 W$ r+ F/ n- v
#include<pic.h>3 l( h2 ~' n- F% S3 |& G" I0 S3 L  E
#define uint unsigned int 3 e' E3 {9 [# \8 L
#define uchar unsigned char
3 {- m  ?/ L5 K* U) ^9 \+ X7 T, Z" L( U' W0 J2 ]( ]
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        & [( v4 p* I$ v0 L* V  C6 l0 O
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        + u' v7 e: Q- z

) H& _( W- }/ o2 U, q7 @uint Time = 0;4 M% {; A- {& V
uint cnt_1ms = 0;' s. F1 y4 s/ T: d  b
uchar State = 0;) b! |3 k, _8 Y6 n
- J2 H7 V0 F2 q; w
void GPIO_INIT();
3 z( K4 f( D* _5 \8 ^; ~$ ~( ^void TIMER2_INIT();  p4 |! F' Y+ l, k6 |$ k( r7 |
void TIMER4_INIT();
2 h2 M6 K; _8 S5 A. Pvoid PWM_INIT();
5 _) s. x% u2 ^$ W' `void Control_Task();
8 T9 n) P3 R3 H0 p
$ j6 q* n* K7 t3 ~' c7 i/*" m# G1 }9 j  m4 g
*@function 主函数8 W- y8 S! ?. s. ^3 G. r8 I
*/5 p' V1 k. v" g3 ]
void main()% O! @3 q* M# x( W' ^8 s
{9 K; v) s7 X4 v' r
        GPIO_INIT();8 j2 B: A; R2 x$ B
        PWM_INIT();" z9 g8 A% D& e( D1 h
        TIMER2_INIT();                                //PWM利用TIMER21 c1 J' j9 \6 {: X
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
/ @0 O8 G9 z5 J# e& `: C! H        while(1)
: |( J( Z$ o9 Y* E        {& v* j, `8 A! F9 f  u3 E
                Control_Task();4 Y: d$ `. C8 |  O4 ]
        }8 l0 Z; q4 q# m+ L* x3 E0 ]
}
2 ]5 `) d% U; Z6 A" `4 o/*% I. B: J. u/ j  V3 R; r
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
- x- c7 Q  e+ Z: n: f) |4 L( ?*/$ a% I% N. g4 {
void GPIO_INIT()' P' G1 w* n% t* t: t/ M. @7 f
{
, h* F' e6 F1 l. T; A1 c$ x% U% a& t        TRISG = 0X00;        //设置RG口为输出
( X! ]4 h! W' H  E        ANSELG = 0;                //设置RG口为数字量; }' ?6 B2 O5 W
        LATG = 0;                //设置RG口为低电平
8 l1 J2 n' U1 I( Z: A/ V        
) J' n2 M3 q9 [. v8 N  r! J        TRISF = 0;
$ i1 q3 u6 Z* J! V        ANSELF = 0;
8 i5 g7 Q$ ]8 l% g# H        LATF = 0;
; A9 I9 _2 d3 p2 n9 i1 J5 S/ I}
7 E; h5 N* Q5 w( X* A8 A4 ]3 M2 U6 \' v, n
/*' L! T5 H7 r- g: J) |( O
*@定时器2初始化5 q3 k" |2 D: `& @
*/0 p& c. M( J( C4 G+ [9 m
void TIMER2_INIT()" k/ Q. p+ O6 ^( n' r9 ^
{2 _8 g4 U  Y4 N' q2 [
        TMR2 = 0;
, P& |, e4 r; f0 z8 i        PR2 = 255;                //2556 A: x+ }, F$ T0 K9 _! V1 i9 I
        
! T) [) |3 Z* `$ U% k: j        TMR2IF = 0;
7 `3 v0 {% ~' I+ ~        
* j: m& ]8 f( V$ A0 W" B  Q        T2CKPS0 = 1;        //1
' F5 @# D8 Q. [4 K5 J7 ^/ {4 @5 T        T2CKPS1 = 0;        //0! Q/ M% L$ r- I" T
        " `: L, H& {) c$ m
        TMR2ON = 1;        
+ i1 D6 w0 j, h}
3 `) x9 g, ]: j1 K$ n4 o  \: X
) `8 X$ I- ]: ^8 ^- D" O( h/*2 u( m2 T2 M1 b
*@定时器4初始化
6 l. b/ J, ^; w, ?6 W. L*/0 W3 A' {4 z0 Q: e
void TIMER4_INIT()3 C: [& A. J1 M
{
5 _, E& V( ~- @; ^0 Z$ Y' b        T4CON = 0x0e;                         //0000 1110
" W+ b! l( ?$ K9 C7 W" l7 R8 k5 l* n& B( _* r, i1 p) e
        TMR4IE = 1;
4 t2 _, O4 j. m0 p0 h        TMR4IF = 0;                              
( y* t0 t6 l& X- m& I  U' E8 U
2 E- I5 {! l' w/ v+ K        TMR4 = 0X00;9 _( I7 N0 \! h5 R
        
9 O7 _+ x) o: [7 b        PEIE = 1;. a5 e1 D3 y+ a; L! ]  [
        GIE = 1;
+ Q2 ~, |; g% B% i& L}8 }8 k+ k, x6 E
7 E; G; ]  }  B$ L' n

. t7 x  s) i* ~# C/ Q/** _5 z  {, T0 D! N0 X; R1 O
*@ PWM初始化7 ]5 s' p" ]* u2 U4 C
*/1 ]. Z, W7 K/ s+ l! {( @( O) ~
void PWM_INIT()
7 ?7 @$ ~$ t4 G, d0 d{
% ]5 _6 v) Z) k. |& x# S( p* w! c        CCP3CON = 0X0C;- L# o3 O/ d. N- A  M# R
        CCP4CON = 0X0C;
2 P) z6 z3 b  T5 a8 b        5 J9 `3 Z- L4 t' O4 @$ W
        CCPTMRS0 &= 0X0F;
% e) B/ t4 A6 |        ' e. p" P+ X0 V
        TRISG = 0;; ~4 ~7 Z- L9 {  g) x
}; ~( i8 \2 U" \# @) N3 b) `( E

" S2 I0 @- d' n9 a" A$ P( Q+ Y, x3 M$ u/*- o8 O& S; V* r* q# n! U
*@Function 主任务函数
# l3 O( a# X4 ~; G% e1 o7 e*/
  E$ u" q" N8 v# n- W0 x5 k& Tvoid Control_Task()+ P' F' Y" e0 Z, l) I' o) m
{
+ L8 Q+ B/ }. `& K5 ?# `        static uint Time ;( `# E+ J; G" v. ^: ?, M  R: x
//        static uchar State = 0;
& ^0 s& t$ ~: c% C        static uint Record_Time;
4 G6 S! f, E6 f' F) A/ b& I        uint Delta_Time;
1 P' V' y7 b9 b, x" T$ I& F        
2 Y& _) f# K$ C# G7 e        if(State == 0)
* g5 G$ Q3 J( u% l7 t        {
* N9 {9 J/ l% C% k" }* D3 G                Time = 1000;
. ?: z* @' u0 m! F& K7 r1 R0 R  N1 |                State = 1;
7 _% s  D5 c& Q8 r/ A; x' |2 _+ S
0 W. y: B+ m: K. t: H5 _        }
/ \+ T) E; v! W9 S6 j9 z        if(State == 1)
, I6 H, e3 m+ S, m9 Y        {
# [9 ^- R1 U6 h1 X( l                PWM1(Time);
; N  l, ?. P1 P% ~                PWM2(Time);9 `: g* d' R' W# v
               
# A: V( w, n: k                Record_Time = cnt_1ms;
6 G" B# d9 y2 Q& s               
! b. l% p6 m$ L$ _- X0 F# c  j" |# j                State = 2;' ~" k+ B6 c8 \4 ^  l! ~
        }
# o3 g- a! H6 H        ) C9 C6 }9 {  I" T* O2 M4 b
        if(State == 2)
# l) q: f$ k; r" c4 e0 T        {
2 w, p$ u6 N& r  m& }                if (cnt_1ms < Record_Time)
0 a" a7 \2 u8 y9 A: g$ u  Q/ M                {
1 Z% j5 _+ k' @7 A                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
6 b3 a: ?& A6 E2 i! d1 e& f                }; R5 b* i) ^. G! w$ j
                else7 Y7 \! W) D7 `7 E
                {
& M! y+ @% D( E. d3 T! }* J$ r2 _                        Delta_Time = cnt_1ms - Record_Time;               
. ], d' f4 a2 w0 j                }
! H1 K9 f' X. z/ k) h3 J2 s; P3 y" j
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
" p0 [0 @" A4 R3 i+ X% O( m                {
* w2 ?4 M" x4 o1 ~' X7 D' f                        Time = Time - 100;) g  s4 F9 l# @4 Q2 f2 x" o9 T, v6 x
                        State = 1;
* ^  n/ f* h; b2 [1 p. I                        
0 ?9 c/ F0 i  v* |9 u( K                        if(Time == 0)
8 H  ~5 M+ P1 O& D( r                        {6 a2 i( }$ H7 ?8 E6 o
                                Time = 0;
& _4 `3 o1 @& @3 j- F/ z. u                                State = 3;
' ^: `2 y( y: m5 u- Q                        }% g4 f/ @; w% i  _" ]
                }
9 l5 E  n! K( J, e        }
, S. L, o, l$ B+ a0 _, g- n        ; M0 T5 W/ P! d1 G, D; @
        if(State == 3)
  d0 C9 C- G3 [/ h& D; ?        {7 M: K$ R0 q; z2 y3 ^' I
                PWM1(Time);" ^2 b' B  W7 B: {6 @  N  z& G
                PWM2(Time);. |% y/ U' V% J
               
' d9 J" d4 M/ N/ i; T/ d8 u5 U                Record_Time = cnt_1ms;
- A% w/ T! `% X* r; D& g8 v2 _               
6 A  H8 A6 g- W& s$ T0 H$ [- X                State = 4;0 `' Q6 C; B4 f. k: z
        }
+ _" S8 }; {  p3 k+ Q1 _        " W1 i( y% |3 C
        if(State == 4)0 I) ~! H2 b7 \2 a6 ?2 ?7 N' O, o
        {) t" m; p# B4 [5 |9 f
                if (cnt_1ms < Record_Time)/ J; e3 X* u4 _5 n
                {
: O# [, l$ O6 ~2 j7 ]6 e6 @                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
! N0 e7 i+ L$ W( t                }* u5 ?) D5 Z8 k- x- p5 }: K8 L' ]
                else
1 [7 z& d2 t) S9 @$ X                {
1 Q7 N4 U" p; ?* V' D" X& H  V                        Delta_Time = cnt_1ms - Record_Time;                % r. w0 M+ A3 Y. }& l
                }" ]  ]9 g9 n5 b/ }, q/ B

# m) p% D+ ^% w6 \( a                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT7 q8 A! y5 }2 h, X3 p$ I1 s! J
                {& k! V4 Y" G( X" P1 e
                        Time = Time + 100;
4 \$ D0 p! o2 a0 [: X" d                        State = 3;
( D! [3 l3 D1 U$ h% {                        
+ E7 T7 k( m5 f/ R0 Y                        if(Time == 1000), q2 L: V6 S4 q
                        {" e* h2 Z, Y; v, g) u$ Y, @4 [8 V+ E
                                State = 0;; I% @3 r4 l0 K% P; b
                        }9 B5 |; l/ D, G# W5 Q& }* W! O
                }) M# _8 H1 X; {3 \
        }
! {" F7 j- Q8 Q! }& `3 X( H8 f' F}: U! a- T9 r; a/ `. w  A

7 r7 w3 [' F0 G' O5 C. uvoid interrupt ISR(void)1 J) ]# H1 ~3 Q/ a
{
  _4 E7 B* W% B3 G1 ^0 d        if(TMR4IF == 1)% c4 d9 ~+ u4 M
        {
6 g6 I1 V3 s* i) P$ p: g                TMR4IF = 0;( n2 G: Y# s$ I, ^
                cnt_1ms++;
: [0 v, `+ i3 Y9 q' y" @               
9 n* M3 o% x+ b+ P5 O8 F) r  C        //        LATF0 = !LATF0;: V" X/ R# L/ Z: C
        }        
& p) v- U4 A4 l4 C: h}$ @. P/ ~4 ~* m1 F3 U& }2 g; k

PIC16F1947原理图.pdf

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

该用户从未签到

2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
  Q; s& d" s8 D+ I( p

该用户从未签到

3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!
6 W5 y6 Q2 _5 }; v# b/ t2 [

该用户从未签到

4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!; U0 w* t7 q& [4 q$ x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 01:12 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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