EDA365电子工程师网
标题:
[PIC经验] 利用PIC16F1947的PWM模块做了两个呼吸灯
[打印本页]
作者:
Hh0203
时间:
2016-4-29 14:20
标题:
[PIC经验] 利用PIC16F1947的PWM模块做了两个呼吸灯
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
! G1 W1 O% j3 m# k/ m0 b
$ U2 ` b* M0 w4 l. |; a6 y
/*
$ I& ^- Y/ B9 \( a
*@Name: PWM_led
+ t0 N, d' p! K0 ?' T: K2 B
*@version 1.0
* T8 d( d+ V9 q) s6 b( X
*@Author xiaopan
6 o$ Z j- W6 u$ G# g
*@Date 2014.8.2
* M6 D$ ~9 M! z. S: S/ A7 e
*/
! F7 T& q6 E# O* n. ]
: L% v9 e/ N, C, v5 R: ]7 F& q6 @: y
#include<pic.h>
3 B8 y8 I1 v6 s0 j3 c3 H' d
#define uint unsigned int
% _8 H4 b. _3 G
#define uchar unsigned char
! r; e) ?8 n) w; [4 n
9 o! z2 ]; b, p3 K% x% d3 e* P
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
* H8 S: P: |& y$ M" F
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
0 v& J7 ^, K* [1 g$ \ l+ ]
( C7 j2 f3 N; v; Z
uint Time = 0;
7 K9 b, p, ]2 J: F- w7 b8 p! w
uint cnt_1ms = 0;
; F1 Z2 e$ M0 K9 W2 [' d
uchar State = 0;
5 E! |1 Y J9 m: F' z0 P1 n
! W8 c( N7 G r0 v* o( l, a; O% M
void GPIO_INIT();
' X7 d o4 ^+ `5 _ l
void TIMER2_INIT();
: u% ~* Z, u8 F/ A% L* W
void TIMER4_INIT();
/ ~! n8 @, |& G- ]4 H. ^7 y
void PWM_INIT();
- F1 K# E" p8 ?8 G1 \7 `
void Control_Task();
# s& Q6 k+ U" ~9 L
# {2 f3 \0 Q7 {3 p0 Q2 |; ~) P# _7 L9 Y
/*
8 J' x: X+ r$ ^5 q
*@function 主函数
# h) F2 P" D: b7 ~3 N
*/
$ m; D& n9 `& h0 y* W
void main()
9 Z7 t) x" g: F' j2 m* @& N( B
{
4 [! u4 ]) }- R/ M
GPIO_INIT();
( n+ ?$ ~1 V3 V+ [3 x. [
PWM_INIT();
& u# q( i0 t4 Y& s' u
TIMER2_INIT(); //PWM利用TIMER2
4 r5 W9 C8 \9 F
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
8 w; `+ {: x- D$ g% z' e+ M9 A
while(1)
5 z. Z# c m/ g& J# M
{
( t6 E/ w- b4 S# s+ W+ N# X& s& C! w
Control_Task();
0 @8 g% N9 {; ~ o' S% ^) }2 u
}
9 q/ ^) U2 h' E0 M9 c
}
# s8 L4 s9 ] @$ B% b
/*
- c" `; D" Z5 G) d2 g
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
% U, M! R. y# v" F: F: p7 p
*/
5 I" E) z F) {! D7 H
void GPIO_INIT()
/ }: z* _. v* q, W* P
{
" h+ [. Y& A- Z3 N0 C
TRISG = 0X00; //设置RG口为输出
6 ^8 D1 Q e/ |, Y
ANSELG = 0; //设置RG口为数字量
9 Y1 k9 n# q( x; J
LATG = 0; //设置RG口为低电平
, E9 P/ d# X% w) E9 l1 z
. f( _ K# j6 d
TRISF = 0;
7 z, i5 L' z( N6 z
ANSELF = 0;
* m) @, ]4 \% ~# q* J: @
LATF = 0;
8 ]+ d% n1 T8 T6 C2 c B
}
0 u, u! f$ i7 N2 z1 U7 X
, S. l6 D. v5 g9 J, s( M' s
/*
- [! o, W% |" q- G: \
*@定时器2初始化
% t, k4 R, s! c2 k' {2 i
*/
) e, l; v# u+ P
void TIMER2_INIT()
6 t: D# H7 u9 h- n' v" Q% g
{
. D* p( C1 n. |! y9 |
TMR2 = 0;
$ n. I& V" l R J# d
PR2 = 255; //255
' X: N* r% M+ N
& |! _6 o5 I/ S) w, _7 T, G
TMR2IF = 0;
* g! ]# ~: s+ U3 `
! A! R8 N) b! n! M
T2CKPS0 = 1; //1
* I4 I# k; [7 S) L
T2CKPS1 = 0; //0
' r( j) B! S; s6 Z7 x5 ~7 m
2 Y, ?4 W) t; S) o
TMR2ON = 1;
% ~+ h+ r& j+ J _, A
}
6 A8 z8 ~9 L( \
: d9 P u3 j7 l* R
/*
8 h1 V, s+ e- V' h) m% V5 D
*@定时器4初始化
- m) y+ K6 Q' \8 l% d
*/
+ T/ r! D( Y9 U1 x
void TIMER4_INIT()
5 u: L9 m$ B3 V" }+ e) [
{
' Q9 R' \" {# E& x5 t7 b; q
T4CON = 0x0e; //0000 1110
/ k( E( y9 E5 F" t9 U7 ^( I
: Z! F6 C5 e# k: i! X
TMR4IE = 1;
' t [# k, V! W6 E+ u
TMR4IF = 0;
5 `: _# r1 Z5 d& Y
7 C9 |- Z" S; ]' ~' W% E/ c: o
TMR4 = 0X00;
Q+ K* `, t8 H
/ f% o6 N( P, d/ ~9 i+ A* ?' O
PEIE = 1;
! A6 L( U# N4 q
GIE = 1;
9 Y1 N6 q' d5 X% G5 b
}
3 r$ y, m- K' w- r [1 \$ h
) z/ W1 G1 l4 X/ _& }
2 C9 _4 k3 D5 g' d5 ?9 i9 Y
/*
" m7 J6 z: U W( [# h, F+ ]5 i, h
*@ PWM初始化
( j0 {5 c; j+ M1 R
*/
7 U! V% v+ `, R1 r/ Y0 Q7 W
void PWM_INIT()
' w2 t% Z( E: J! p3 |6 o) E6 E
{
0 u' M$ l7 o2 N( U/ w& c
CCP3CON = 0X0C;
1 S& F: }* O" C' N b) f( o7 ^
CCP4CON = 0X0C;
8 ], O3 r6 p3 E7 ^9 y G) `
. n' N! K! T; U% x; e
CCPTMRS0 &= 0X0F;
- D4 I: O" C* ?+ V
5 n: \3 E7 S. ^* k, j4 ]
TRISG = 0;
% i) W* v& U* ^% Y" L
}
+ O9 r0 y% k$ D1 z- t# z
/ A; D( }% [) S$ y
/*
9 e, z/ s: H( Z7 A3 N8 }
*@Function 主任务函数
$ W9 Z2 ?: v4 I: Q( K* d# k! L8 @+ m
*/
" X8 i8 o2 L1 P: @4 u
void Control_Task()
: c* ]! B( e) u; b) X
{
6 _6 r' Y5 E4 o5 `& e/ r
static uint Time ;
5 t9 y* b6 n# m4 {9 u
// static uchar State = 0;
: K& I/ N& @ M% u
static uint Record_Time;
9 [3 E3 Y& ~: i
uint Delta_Time;
: _7 k& v. g5 Z6 {- l) l& c( H
$ W+ I, v& J" E2 {; q4 f- T
if(State == 0)
. I2 k, F7 n2 L8 f
{
7 K+ }% W% X) Y# r7 C
Time = 1000;
2 N) a! q9 f. g- p1 `& y5 W- Z
State = 1;
" m$ @5 V3 {0 M
* k! O$ N1 a$ c; A+ g
}
7 r- I1 B; y7 q0 @) l! c
if(State == 1)
9 g4 T- M* l& E* k
{
, y x I+ S3 `# V* \8 T e
PWM1(Time);
; g2 y: J/ n# h: R3 M
PWM2(Time);
8 p* [1 w3 r3 h4 |. A, B3 J% I2 o) P
! J( I; F4 O7 F
Record_Time = cnt_1ms;
: k% b8 u+ b9 o! ?. ?" v
5 N* f" E/ n5 N6 S+ P8 L/ F
State = 2;
e" a: e0 [0 P
}
! q4 z, ?3 B4 y9 m+ q
" a, a& R' |+ W, ?6 \
if(State == 2)
% N( Y0 _) r6 {4 {7 c
{
+ x( x3 g+ F8 @- f3 A# A
if (cnt_1ms < Record_Time)
1 |- m I" y0 t0 F
{
: F) {; Y/ ?) T: i6 M0 c1 p& M7 n
Delta_Time = 65536 - Record_Time + cnt_1ms;
* U: k5 \, ?# h+ R) }! J! y
}
i7 Y3 |8 h# ~6 y& \
else
z" M& E+ p" h/ [2 w& Q6 N
{
6 B6 h5 ]7 z, L* L' C+ D
Delta_Time = cnt_1ms - Record_Time;
# ~- k% D- [6 O3 Y* y& @! @2 X: a0 ]& y
}
5 b8 N0 p1 ] ^0 A3 Z9 a. |8 {
) |6 d. z6 G' q$ D H* B9 Z
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
; A* R, C2 f" t2 M, ^5 H
{
; E: C2 B2 S( a# I
Time = Time - 100;
0 s6 F, ]3 @+ j2 U; J( B
State = 1;
9 N" u( P; i9 _0 h
6 W8 Z9 @) n& ^. Y; T+ o
if(Time == 0)
" Z2 Y8 P% j, P( z# Z/ w% _4 D
{
5 x+ ~2 \9 ]! y Q; [
Time = 0;
' L7 Z+ H& `& B/ A& D2 a: U' w: Y
State = 3;
- H9 ?2 k ]! v+ e" o# X1 t/ b
}
$ t/ {+ T8 V, D/ {) n4 v
}
$ F0 `6 H$ @) R0 _3 @
}
. R& {4 v+ r( d) u& S7 b
( V( ^% C- A2 o3 N
if(State == 3)
8 O* A6 D6 n, ]% G' ]( K& h0 Z
{
0 @/ N, u- ^ {, V; p* ^
PWM1(Time);
" j" L5 Z5 o) U; g' ~% y- Y0 @# A
PWM2(Time);
, z7 \. [2 H2 I5 v j/ @
[) Z& O/ s4 W1 }* T
Record_Time = cnt_1ms;
+ n+ B- {8 j( l) ^8 l1 `
7 f) L" }8 {6 x5 e( z$ r" c6 U
State = 4;
! Y! b: M9 e2 h- A# ]" A; {/ @
}
5 t5 y, f% s1 R- ]- L; W
* G g8 Y8 [; f
if(State == 4)
+ ?% S- f* h/ C
{
8 q( I5 a- P9 g9 `5 j3 \3 l5 i2 \9 Y
if (cnt_1ms < Record_Time)
9 k+ n" q0 P* z4 z& ]* c: d# F
{
* }) Z" ~3 |' U( L9 B
Delta_Time = 65536 - Record_Time + cnt_1ms;
[: d3 z* ~/ D. X' e
}
, ?, a8 {: d9 N
else
9 V& J0 v6 [4 L1 l7 ?, a( z
{
9 o* I# V8 g) p/ T" A9 v1 m2 W, w$ x$ b
Delta_Time = cnt_1ms - Record_Time;
6 x+ l% K$ ]5 A, H
}
1 B% n |+ N# ?, L2 h3 |
/ I, [3 O8 E3 j
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
& [$ X; p, Z% Z, F% P( x2 A0 k
{
p. n, z: S! |7 ^
Time = Time + 100;
6 {, a K& R9 k9 g( v; ~- l2 N
State = 3;
& O3 E3 x8 L9 g1 Z2 @
3 K9 A8 x% ~7 Y" s3 H& a$ Z5 E
if(Time == 1000)
' P0 n) F6 X8 t9 ^ ^( L: q) n
{
) ~3 j) y a% G% G) w( h( J
State = 0;
, S5 V' H9 ?1 s5 w* D n" h
}
3 C' l. a+ J! S% e" q0 B
}
7 A9 x$ ^7 k1 Z. |2 H1 s5 R
}
7 M* O( y" J7 D9 ~& S" e4 a' \. T
}
* b5 B; z2 V4 I, Z% ?
5 D. Q0 g L( P% P" G
void interrupt ISR(void)
- p D0 @2 `& M: o/ y8 ^
{
- f8 y( @. l2 ]/ C" M2 W
if(TMR4IF == 1)
) B m( y3 q0 X% \
{
2 r9 z- d3 k4 Y" Q. S) o6 k! s/ B5 l
TMR4IF = 0;
6 z/ `% @. `( n- C6 y. k
cnt_1ms++;
8 z' G Z1 f$ X' H
6 ^7 w/ N+ @: f5 A
// LATF0 = !LATF0;
& w2 Q! Y; `" j' `
}
$ U1 F' m+ b/ o6 q: {2 R& [
}
PIC16F1947原理图.pdf
2016-4-29 14:20 上传
点击文件名下载附件
下载积分: 威望 -5
533.08 KB, 下载次数: 5, 下载积分: 威望 -5
作者:
Hh0203
时间:
2016-4-29 14:21
长久的日积月累!
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2