|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
$ _8 t1 f% K, l( y& ]' {8 x) k0 [
/*3 N- U u6 G1 x- t4 e0 u/ }5 `
*@Name: PWM_led
' ], E4 q" w. F5 Z9 ]*@version 1.04 n% |$ G. `" k' T& X/ K
*@Author xiaopan9 {; x3 m$ I' T8 Z4 S
*@Date 2014.8.2
3 G: j4 W8 e0 g# m*/5 r \7 R# d' i$ _- w/ W' I
$ O7 T" u* P6 ~4 u9 F6 y
#include<pic.h>
8 B$ W. g0 [7 H; W' b' L& Q( }* S#define uint unsigned int
, z2 D! M1 Z p2 I( O& y" t#define uchar unsigned char
$ E' i0 _' g* ?
; Q( ^5 l# j6 H" Q. m F#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
8 ~. v1 t" {; p$ ]5 c#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
% P6 l. m _ f, `. k- v- m
! Q" {7 W& M; c( l. R$ Buint Time = 0;% \6 T" G" { x3 h/ a) r
uint cnt_1ms = 0;
+ [: [1 h* B4 A) c- ^/ luchar State = 0;
- [9 F5 V1 {( M: T8 D7 i& B
- X6 t9 O' D0 m2 ^void GPIO_INIT();
: d$ y7 P4 u: m! B$ Lvoid TIMER2_INIT();: Q% [3 k% x3 ~& w7 |
void TIMER4_INIT();$ l( E6 l! [4 G3 G1 ?: e$ S
void PWM_INIT();
) u6 G1 S1 e) D$ hvoid Control_Task();7 a# N5 ~* B) T& N
3 u( h; ^" Z/ {$ k, y
/*
2 b4 V& ?' k; t8 h# t" q*@function 主函数5 w! D" _2 q- E$ g* s" E( L
*/
8 M5 O4 b( z1 f7 A) }" N$ Gvoid main()1 ~9 F2 J: ~+ T1 v( l! i2 R
{
8 e# y! u- C$ S" h- x GPIO_INIT();
! `6 \5 F! F9 V. b( R9 D) i& @ PWM_INIT();1 N% z, {3 f* D. m+ V4 O/ @, n5 G
TIMER2_INIT(); //PWM利用TIMER26 l4 x! K" |$ m- z' O
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形) e9 l2 W6 o% k% l
while(1)
+ G1 l- Y( Z7 M6 @ V( e9 m {
( N6 G c/ b/ ^3 C* W- R3 n Control_Task();, T) c/ u# Y! b8 F
}
- d) R! m4 ?2 X6 s3 K6 j; ~/ c}
, U3 j* J" |! ^& N: f/*
. w" E6 _9 T7 G; ]*@Function IO口初始化 RG0 CCP3 RG3 CCP4, L0 g/ S: A" X* W
*/
& k% ?& n L1 N8 x( Yvoid GPIO_INIT()5 i4 o' \3 L* t0 d5 K- @
{
9 H; p- k& b) h! E x5 |, _ TRISG = 0X00; //设置RG口为输出0 d4 R& K& O8 J- x. w+ q2 Q2 Q
ANSELG = 0; //设置RG口为数字量3 j/ E8 {2 A& s6 d
LATG = 0; //设置RG口为低电平: G% u& Q9 t/ {5 _6 @4 H
" b2 x/ p9 ~) @) O
TRISF = 0;
. A4 i4 T- H* M' \' R ANSELF = 0;7 ]/ b2 Z5 t: Z0 | n+ X! g8 k
LATF = 0;
$ X+ C7 A+ H [' |. ~- c: t}
; n* \- q% P- e6 v2 q s, Q& L
& R0 ^- w5 L) V/*
9 s# ` `2 n6 J' r*@定时器2初始化/ R) }6 N1 }3 O/ A( ~
*/7 v/ d/ @% h: M8 _2 x: G: K
void TIMER2_INIT()
- z+ Y# n3 N9 d3 J- G! L+ j# A{3 U9 X. y2 T' x( y2 \! W4 |# ]8 a
TMR2 = 0;
) W4 P/ b: ^) Z5 v" q# S; Q: g PR2 = 255; //255
& L- W _) ^9 v8 o5 L. s
: P2 K2 D) U7 t; I. @7 q% ~) u" L TMR2IF = 0;
6 J& k9 a9 L0 {; v' b5 {
- J- [: M3 c) ?1 l4 E T2CKPS0 = 1; //1" {7 `) L9 O6 }. i# i+ s8 s+ Q3 M( u
T2CKPS1 = 0; //08 `# g3 ?& L y& A1 \5 _# Z1 F
% t) ^: v& s" s' n% a: _0 o, T2 M# f TMR2ON = 1; $ l7 s" m! r0 }4 }+ p& Y i
}
. p" ~" I K2 U6 B
3 Y2 J Q; w f) t9 T) ^( c/*7 M) i. O" a, P7 r! `( z
*@定时器4初始化
& u2 y( y- Q! H1 D8 v* w8 g% ?1 ?. O*/
0 Q, R5 Y3 x# r6 g6 Zvoid TIMER4_INIT()
5 R! s" k, q& @# I3 @# T{
& U9 v# g8 S/ A9 `9 ^) Y T4CON = 0x0e; //0000 1110
& R) H1 D/ P9 b4 l. m, m2 ], R D$ Y/ o* A) V
TMR4IE = 1;
1 u- v: [9 P# E6 e7 _& `- }1 P TMR4IF = 0;
: ]5 S/ R9 M5 U" F$ D5 x8 M0 K$ z& \+ c* e0 [( U- B
TMR4 = 0X00;
5 c& D; m- o4 A; T5 f% q2 y. D 6 s4 {- H% J" I1 H9 u
PEIE = 1;
0 p% P/ j" o, [3 G1 W& t8 k% K1 ^0 X GIE = 1;' r5 y7 C8 m2 D b8 Y0 N
}" C2 x: P, W& g% {) {6 p
; X _7 m2 }' m: J- w/ j
' ?( |& T& [* W2 ^
/*
9 h8 L0 A) @2 K*@ PWM初始化6 v) v: X/ @! M/ k% E- |
*/% G2 u; {) [; f! b5 e% z
void PWM_INIT()) Y& a# E4 w! o
{
" {0 ]4 y. ?8 a) x7 v L& f6 e( f, w CCP3CON = 0X0C;
?+ X4 L. \* \& W1 M& Z8 M CCP4CON = 0X0C;
- M$ _6 p9 {0 w g$ G; I ' s; d: b$ z1 \" b
CCPTMRS0 &= 0X0F;% {, O* b6 O1 m/ T) V) B6 C
2 `7 J/ {$ |& @0 K TRISG = 0;7 f% c( R( I" S: K
}( c' U: J- W9 P) |' d
6 E, z, B, A/ t0 k$ |, h8 z2 E
/*
8 L9 Y' b X2 f! o# i*@Function 主任务函数4 `/ i! l0 \1 N) j% T# M9 m
*/+ H! |' J. j5 _# S; X5 Y
void Control_Task()1 w% ?4 r3 h9 x$ L% W3 }" g( O' g; [4 a
{$ M: P( j2 Y" {. T
static uint Time ;7 h, @1 A: f: M& e: D# R D
// static uchar State = 0;
* i' Z5 m& n* z7 n7 Y8 z static uint Record_Time;; u; L) W' m9 U4 e
uint Delta_Time;
& j! W% |0 ^2 p" b8 i
0 M- d& o, p" h* k if(State == 0)
: {( C6 }0 \+ } {
, V1 I. [: q2 }- v# V4 [ Time = 1000;
I' A' H \- X1 x6 Q9 M% x State = 1;$ S- m; b6 E- t7 W) l
7 E0 @; N E: a; c
} F, v+ N- Q4 B
if(State == 1)3 g! U/ ^9 i8 ?2 ?+ X5 A( N& m
{
, E2 h0 `) |; W1 V( G PWM1(Time);
( M3 H) K& S# q% S. ]8 c3 y PWM2(Time);
, }. C. o4 K! a7 Y9 [3 B3 w 5 ~" |. ]. b8 ]; g1 g7 f, ]
Record_Time = cnt_1ms;( P# j$ h$ ^, Q0 I% X; p
$ e3 k! W9 V s2 J: H6 U" A
State = 2;
/ U+ E' i7 c$ [6 \4 M' q. a }4 d+ f; |4 ~9 ^+ t/ z4 _
0 A5 [; D* n5 }3 V
if(State == 2)
) n0 z) R# a( L- j, V {4 e4 m7 I3 ^" `0 {8 [$ ?, T; H
if (cnt_1ms < Record_Time)5 ^% o+ x# d& G9 }' k% V
{
0 ]# x# v4 I# S+ O' o, V5 [3 } Delta_Time = 65536 - Record_Time + cnt_1ms;
, |2 S2 m0 c& s! \+ {1 Q' B }
& L$ [. L- i) [% _# L, E else
$ [2 A& C q& j* {% I# `) O {
. K3 B4 G. _9 o% B9 E6 A Delta_Time = cnt_1ms - Record_Time; ! P5 c! I+ b: z4 e$ \) J
}
& g' ^6 N3 ^' Z$ r+ {8 x* d- s7 ]. F$ z! i
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
1 N8 L4 @- j" W {
; Z/ N# X% P3 i5 k, O Time = Time - 100;
: F' _ g2 n% N State = 1;
" s' Y# D$ B+ Q6 O# z 9 w0 V2 L7 N! }
if(Time == 0)% [ U" Y* \- i
{
% E, ^% B5 t \ U Time = 0;
6 l( L0 [) k" d3 l( {' u3 g: } State = 3;* x& Q( t$ C; w+ M, d$ Y, a
}
2 _) a0 x+ c8 q' x }
$ H: M& i, l7 m2 a) t1 r; [: O- j }9 l3 E) g1 J/ M9 E! a
w2 e, J$ l# L: B
if(State == 3)
. c# i1 }6 e/ M, U, q6 U {
/ \; W* W1 b: O. x t PWM1(Time);# L1 ~6 R! l' T. `
PWM2(Time);
1 q/ G( A- G! L/ j# Y
2 E- g/ ]; ]2 B8 p: K" p# e Record_Time = cnt_1ms;
5 f( z/ z. G! z# z- l1 N* o% q & J$ B7 H ]9 B3 _& R
State = 4;% T; |. h; i! H7 N
}
1 `* G" a. n* h* O 0 v7 a! g w) q- v
if(State == 4) E+ J. A- M) L7 `5 O# v4 W+ Z
{
9 \+ ~% b1 b& g, @, Q1 k. f( e: h1 W if (cnt_1ms < Record_Time)
' @; k% W( |7 ^8 \ {
" k( n5 A' t6 _* ] Delta_Time = 65536 - Record_Time + cnt_1ms; " e# J9 K' k* S5 W9 k
}
1 v+ O/ G, n3 v% U6 h% ~0 [ else
2 v+ q1 [( H; o4 Z" ~& C {- c: _& `- ^$ I; R' e# r4 g2 H
Delta_Time = cnt_1ms - Record_Time;
7 P9 g& @! Y( K }
i r; c [% P7 N2 U5 z& _' K# q7 g5 a3 e, c
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT0 l5 d3 l/ b( A. n6 |
{ B2 F6 z( E5 B- U" T4 h
Time = Time + 100;) h% D0 o% \1 n' n' ^/ \
State = 3;. X; l: r$ |# i" e
( ?2 C- [' j+ I6 G+ u" R4 c- p( w if(Time == 1000)- \9 u( Z" Z" r& S& A
{
8 R3 r. S6 {+ B; {4 q. A0 \) G& p! x State = 0;3 |$ n+ m! U7 @0 w
}5 p v( L2 A% l* s0 f$ |: Q4 I
}6 l6 P9 V) u. r9 q% J8 ^, Z
}
( o: F( |+ c! F3 T, e6 P" \}4 s+ Y8 }9 Y! L
* {, n9 [; x1 d9 jvoid interrupt ISR(void)
3 r" u2 O X3 ^; L. Y! p* D{
6 q% U' S4 c9 M4 }7 Q5 Z& F8 X if(TMR4IF == 1)
- q0 c! F1 `# p) e {( {" ]1 M N! n0 o+ @) b! N2 k# X
TMR4IF = 0;. O+ z* I7 Z) K5 F7 j
cnt_1ms++;* l1 L& m- W7 i. v4 ]) a
& P/ V m7 C" Y6 t // LATF0 = !LATF0;0 Y. h( A' X8 g6 R) A9 ?
} 4 d! b6 s0 b& e# G& c' J
} |
|