EDA365电子工程师网
标题:
利用PIC16F1947的PWM模块做了两个呼吸灯
[打印本页]
作者:
Dedy01
时间:
2016-7-2 14:38
标题:
利用PIC16F1947的PWM模块做了两个呼吸灯
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
: S- A( |: \! {
* d4 D7 A+ N7 m3 [
/*
6 Z6 H0 z7 \8 R% k2 G
*@Name: PWM_led
9 F" [! B D' r" I+ h s
*@version 1.0
3 V, A; Z9 Z0 q4 p. V
*@Author xiaopan
+ | O+ E& [7 D: X$ V' f
*@Date 2014.8.2
- _3 I& ?* E. G" n2 F
*/
4 M( y+ m# P7 ~) H7 G; l( p4 D( N: i {
, L8 t) g2 n& J9 c0 N
#include<pic.h>
; g* L7 }( `, l$ O5 L0 H" A
#define uint unsigned int
6 B% X4 w$ U7 h4 z3 y
#define uchar unsigned char
5 c+ L/ Q% q( b2 Z! O
9 S5 \8 q! O: B% }
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
% Y+ a% j$ F* P- F2 U$ N
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
& h0 f. d) | w4 p3 T& O
2 [8 Y w% D1 s0 M
uint Time = 0;
2 V6 g+ }! E( U- I9 b
uint cnt_1ms = 0;
& P- f6 R1 i9 i) g
uchar State = 0;
# M: p- r3 Q+ S* W- Y
, x' @$ t3 y+ d) t- U9 b' P q, e
void GPIO_INIT();
7 R5 i! N) g a0 _9 ]
void TIMER2_INIT();
* J: [+ X* I% f* I
void TIMER4_INIT();
8 w0 d, h s, w$ [$ @) d9 t
void PWM_INIT();
' I* b* [2 R# E2 d
void Control_Task();
/ J: |! a' i6 w! p8 y# R& a9 u: O
6 ]+ `- k' E7 F$ ?: v+ ^0 S
/*
: ?2 L' Q8 H* C% d: N l. Y
*@function 主函数
$ _; i: h& Q ]& ^, w
*/
3 {+ L9 I: Q. b
void main()
3 ]5 N; C% D0 j, X7 f7 P6 ~8 r
{
) V7 o* S- ?( u" C8 P6 b
GPIO_INIT();
& W1 r( {3 ^3 M: V/ P+ b7 V
PWM_INIT();
) q; Y) I+ _- l$ @7 G/ O" W
TIMER2_INIT(); //PWM利用TIMER2
. s" T. o+ m$ [0 X: L+ R/ w
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
$ L$ d% A' P2 u3 D* |- y) I- g. P
while(1)
_8 O% o! F3 v" X* d
{
9 T* t U, N) {9 @8 A) H7 l
Control_Task();
; x- I+ f. O% @) m6 o& p& b' C$ j
}
* s Y( m( S! `9 D
}
3 Q- u4 A+ n7 z5 H* s" i
/*
3 d/ P% w; W9 Z8 n
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
& ~* _3 r* ]: P4 ^, y8 @
*/
. V5 I0 Q2 P' ], J Y: J- }
void GPIO_INIT()
# T& U2 A: |0 \9 ^
{
# r- x1 C: q0 Q, z: t( l
TRISG = 0X00; //设置RG口为输出
, D- ~+ T- F7 ]7 j F. Z+ G% z
ANSELG = 0; //设置RG口为数字量
6 }' y% y, i9 i6 C
LATG = 0; //设置RG口为低电平
$ j6 i/ g D; Y' ]' e( D- Q
8 h$ H! K4 |. v3 W% A7 K! l
TRISF = 0;
9 A1 ]& h$ e u$ t, I! S; J
ANSELF = 0;
$ o! D* N. E* A$ m
LATF = 0;
' c0 ]: I* f0 K0 z. y
}
( X$ Q! d# }7 W$ x5 f6 Z4 u8 M2 k
0 h7 j! W3 h8 r, L4 y3 F$ F" P- k# h8 z6 E
/*
% W G z' d8 ~& ?$ A5 g4 o
*@定时器2初始化
% q5 l: |6 _; e G# \ w' G
*/
! I! I" r& H! g9 v0 k( l
void TIMER2_INIT()
3 v+ B6 R6 w3 B2 d
{
9 E& J2 L% i8 D6 k
TMR2 = 0;
9 |% }" j# u) w6 ?
PR2 = 255; //255
# U8 T- i4 A8 M7 X7 y6 e
! o# y0 V$ l7 j8 |6 B; g9 C, t
TMR2IF = 0;
2 o" j' X) y1 W* L4 [0 L) Q
' v& l3 }7 E9 c
T2CKPS0 = 1; //1
6 R+ ]/ w/ n' f) t T( z. d+ f$ r7 y
T2CKPS1 = 0; //0
' I. f9 Q+ M. g e
& \4 i' w* _) K& `: G
TMR2ON = 1;
; h% w: ], |6 x Y% B K
}
7 @ V9 e. B0 x1 E6 q0 P
9 O6 t9 U7 e6 n' @& ^1 x
/*
8 ~- h* r1 }+ w. T$ E8 x- w d2 u6 e
*@定时器4初始化
% e, {# Z; Y7 ~# i% b$ ~
*/
. D* g" T( O j; c3 F
void TIMER4_INIT()
& d, J% l S* K
{
! g3 M4 F3 C- |8 o: l
T4CON = 0x0e; //0000 1110
_) t0 J# L6 w! K9 ]8 d
4 R) P3 u' R9 Y* k3 W4 _- t
TMR4IE = 1;
- K# h+ C! K7 X; m; `
TMR4IF = 0;
" l# V- R& ?1 S& R# w# @3 L" k
: a5 i4 I+ r1 t0 P0 o
TMR4 = 0X00;
1 n7 v. g5 a! J% r: B
* s! e% q2 [5 e4 B' v
PEIE = 1;
2 g, H) K! ~& z7 r
GIE = 1;
$ a! ]4 ^/ c5 [3 U
}
" q M. W' ^! y @" s! E
- {! V/ B& b W: D
0 h# h/ ]4 N$ y
/*
* N3 F; U% `- Q7 M
*@ PWM初始化
2 u, H9 D1 L2 Q8 Z0 i% t
*/
5 X$ R' K- p9 o; k5 n. }
void PWM_INIT()
! U% q" O) B5 S
{
- A# N' a/ x3 \, [" m" Q' N5 G
CCP3CON = 0X0C;
3 b, F; j! l6 L2 s2 |& ~3 l
CCP4CON = 0X0C;
- X$ V( X6 c6 m
6 X2 P+ j$ b1 j a4 {: Y
CCPTMRS0 &= 0X0F;
% Q, L* X8 k2 }& o4 s
: i7 F0 Y- T4 O0 F* h; t
TRISG = 0;
+ J! N+ `& E* U4 ?- C2 f
}
6 s3 Z9 C( ~% d* K% A
9 X" ^2 L5 M" w# g3 x) }/ `
/*
0 u0 F( Z8 R0 z! s4 _
*@Function 主任务函数
5 ` f+ @4 _6 V+ V
*/
# P& n. l, N' ^: O7 L& f
void Control_Task()
, \! p" Y" G/ a1 E3 r
{
$ M! h) u2 Y, G) t3 p7 Q/ ^
static uint Time ;
' N6 }5 h5 ]4 x; E
// static uchar State = 0;
6 e0 i) q5 O$ J; g* G
static uint Record_Time;
9 o! E {: V' W7 I M& U5 i
uint Delta_Time;
6 j$ g& [+ Y N+ d4 `/ l
5 ~9 d4 n t$ R( L
if(State == 0)
+ o0 z/ l9 v6 {* H( Q
{
& Y; ]5 z" n! ~, L# Y; p( x$ C
Time = 1000;
4 Y% [) D' q4 E' ~# c2 @
State = 1;
: I9 o @& N+ p8 @7 Z. L7 H
! C; |' b4 Z- ~/ `
}
) @3 A! s4 ?" u4 R
if(State == 1)
2 j$ z G) j' ]1 b* M
{
! E2 P; m+ b, S0 z# W3 D+ r9 R
PWM1(Time);
" r2 j, F. Q d C! Z. X
PWM2(Time);
$ u" ~, w( G( ^: ^4 b {* ?
( l" H0 f# T% v/ h
Record_Time = cnt_1ms;
1 R; N W( ?+ u0 C* R' Z4 g
( \! M. g/ U) a3 k% N" B
State = 2;
2 r/ T G, u* T0 p0 W* @, Q3 j
}
' K% Y+ K7 f: q7 r3 @
: s, ?/ [( e7 y6 Q$ {4 E4 `
if(State == 2)
8 G" _3 q; q# [
{
1 ]7 w4 ]! G8 K
if (cnt_1ms < Record_Time)
3 A8 ], A4 z$ _; ?
{
% I, q/ R$ Z" k( T3 K, K
Delta_Time = 65536 - Record_Time + cnt_1ms;
9 T0 r8 s1 z p1 H v m3 W
}
9 q4 G% K6 K$ m4 n1 d: o
else
7 a7 Z: s+ O7 F: Q9 i5 W! @
{
+ S2 a3 H- Y% ^
Delta_Time = cnt_1ms - Record_Time;
+ S) U' x1 u" g( ^
}
$ T. w+ {: \& j! Z1 F
$ M' Z0 N' e$ s8 ?" i/ }1 ~6 |/ I
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
" m3 b/ r# d- W
{
4 n3 b/ k& s' D: b% B& J2 U
Time = Time - 100;
8 `, Q4 q" B+ W2 Q5 k
State = 1;
9 t) }1 p. Q# z
" B( K( w$ ]" z, @9 u
if(Time == 0)
/ ^, ~7 H5 {& X: `/ d2 {! i# e
{
- i3 d: a U) \
Time = 0;
/ O5 y6 C3 k1 v1 n' V; y i: h
State = 3;
0 J- r, W; c) H" ^/ K3 b, }
}
, E. I, \; Y/ J4 p; R
}
/ _. O2 |8 T% {3 T, y( _
}
+ v! M3 ~# N+ ]
' f3 i! @8 F5 I" D( l% n& y4 K( i
if(State == 3)
; P6 @4 |6 l6 R3 W0 Q- t5 j
{
- c! X' ?5 _: A- e% K0 O9 A9 L
PWM1(Time);
6 T V" C3 w c3 P8 O$ H5 P- s( k
PWM2(Time);
% N: v/ W7 i: z @
7 X; g. z6 A/ ?" u6 Y8 X/ G
Record_Time = cnt_1ms;
" a: R0 q+ w) K
% [- F r. g. z- E# B1 `" E
State = 4;
6 B" D$ m8 Y0 ~0 ` S0 J& X' j
}
+ s4 q+ p+ Z! I' c% @) D
! G8 m$ z9 Y/ D8 t
if(State == 4)
4 H- T F/ v% P5 P
{
% W# @& C, Z' T3 E' C) l
if (cnt_1ms < Record_Time)
2 x6 s/ @: B3 d
{
/ E- q3 N) B9 n1 x' I6 O
Delta_Time = 65536 - Record_Time + cnt_1ms;
0 X) z* l4 ]) Z* O
}
" N4 S* U# r# O$ {0 P0 ~; {- u; H
else
+ U9 `- T5 O" R5 B- y& ?; [4 D3 F
{
; e! t X' O+ C; y4 e* _2 T
Delta_Time = cnt_1ms - Record_Time;
3 w( C8 H3 k8 }" I
}
& T; x: l! R8 |2 W0 a5 w
6 r; R% ? x; q. Y M9 G3 V
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
6 R# T U% T; I
{
& G, U, \% R9 i5 J; s v- d
Time = Time + 100;
7 C# }' V' W0 x+ |1 f
State = 3;
/ w( R! u& \: {& Z5 r/ T$ D: R8 K
1 i& L' ?( T, C7 A$ G9 C) N
if(Time == 1000)
+ `+ K4 s3 G# T8 `8 [
{
8 a/ u) P% D2 ]7 h W9 j: u
State = 0;
" }) W1 P! B% r0 a7 ^/ M
}
3 O% z0 S# C0 |+ L7 V% f3 J" h
}
- f1 I( w; r: L% A" g$ v$ O4 ` v. \
}
! J) } K- X$ ^7 W3 Q
}
9 X' `: X- D' J% P% j
( @8 l0 P- X! O l$ y
void interrupt ISR(void)
: {; Z9 U( S- r, d/ @, G" y7 V
{
( z" Z1 k' `# U: y0 V& _
if(TMR4IF == 1)
/ I$ z/ t5 ^( T" W2 o
{
& R) ]5 N4 J! [( l# H
TMR4IF = 0;
9 t" q$ c+ G4 h) G' d: K- E; A" o
cnt_1ms++;
5 S) r7 u" @3 M" Z+ f4 ~7 I
# E5 z6 z; i9 f3 I4 y5 A
// LATF0 = !LATF0;
; c& S; _5 n+ Y
}
" T4 |3 \( c3 `1 J9 b/ t- O
}
! u4 A! f: |, X/ x
PIC16F1947原理图.pdf
2016-7-2 14:37 上传
点击文件名下载附件
下载积分: 威望 -5
533.08 KB, 下载次数: 0, 下载积分: 威望 -5
作者:
Wenghezhong
时间:
2016-7-4 14:27
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
3 `0 h- ]8 b- i% [1 A2 U. U
作者:
yhg-lee
时间:
2016-7-4 14:30
楼主辛苦了!
# D$ J. \( C# q$ I6 B w% B
作者:
xuzwg
时间:
2016-7-4 14:42
路过捧场,谢谢分享!
+ d/ j( q. u) M/ Z3 L' r
欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/)
Powered by Discuz! X3.2