|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:/ y7 n& _) c8 i6 B J% x9 ~' R; p
+ @6 B' \6 _ @7 V$ ^- Z2 ~
/*% x$ i0 S$ w+ w5 D/ o2 I! w8 N
*@Name: PWM_led
7 M4 v/ Y9 M6 V*@version 1.0
! M5 }$ p$ N$ s( S*@Author xiaopan' m$ N/ c n7 W
*@Date 2014.8.27 i; C/ ^: s* [, O+ Z# } T
*/
& N8 L/ [8 d. ?4 X0 {0 ]9 n* ` J& v
#include<pic.h>
% M7 {+ [* s; O \' C! D& G$ i. H#define uint unsigned int 1 p3 r3 i9 u3 v9 [7 W9 t0 f. `+ Y
#define uchar unsigned char. [, x8 N Q/ g0 V. E
: [0 z2 n1 ]2 L x$ [7 `#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 i9 ?3 @! A% Q5 Y
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 5 [9 Y9 S3 f2 n# d: h9 z. E9 J" Y
8 a! ]/ l7 \- ruint Time = 0;
1 `4 J+ \* Z, O4 [uint cnt_1ms = 0;$ @/ X& @$ p4 Z' z. h" l4 k, c
uchar State = 0;
3 B: c i+ M T3 L2 R: [4 n5 a8 {: k# I1 ?: D' E5 q
void GPIO_INIT();' o/ _) h1 b6 x9 H- K) L J
void TIMER2_INIT();
8 |8 m, E5 |. c$ g& y6 O8 ^+ qvoid TIMER4_INIT();
9 ~, ~! g( a& h7 `1 ]$ Dvoid PWM_INIT();
( i1 q U% M4 V U$ Fvoid Control_Task();4 @5 c; O9 V d0 D ~, Q) i; `
|0 Y( ]5 ?, u8 U# S0 a/*: R! A1 x! X A& B+ E+ u
*@function 主函数
' p* T" ~' D0 E- s" W1 W! b: V*/
1 k F, V9 w( O; Tvoid main()$ v2 E& w0 l; H3 _, b" {, _3 x! i% a
{( D" `0 n3 D: ?) x3 S! d R1 I6 }
GPIO_INIT();+ i$ m, l0 }# @
PWM_INIT();) A; z6 R9 J A$ c
TIMER2_INIT(); //PWM利用TIMER2
k" r/ L- x, ?* ~: [3 [# B TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形9 T) }5 B$ [! [1 |+ b- t
while(1): M- ~* I7 Q$ w5 y4 `
{# W3 @& J/ { V, d
Control_Task(); a C) ^( q! Y
}
& O9 ]9 O$ n' j5 v* p, u& Z; u1 F5 E}8 J+ W/ w( v4 w0 H* M9 J
/*
}( u( i2 g& P! C8 @$ R4 J5 T*@Function IO口初始化 RG0 CCP3 RG3 CCP4& A* i) r/ F/ [
*/
, A4 O3 s5 m9 R* dvoid GPIO_INIT()6 K b6 q! R6 o5 S! `) z& g' b
{9 J* @$ m" T a) u f D& t, i7 I
TRISG = 0X00; //设置RG口为输出
1 F- X3 |0 L6 q: b ANSELG = 0; //设置RG口为数字量9 f& C* T* ?* N' s: H1 M
LATG = 0; //设置RG口为低电平
. |1 U7 j5 z/ i) @
, Q1 Q! R* Y/ Y [! M' C TRISF = 0;" Z* S- d. H8 \
ANSELF = 0;
% d# v. L8 J% J' t) l5 `* S LATF = 0;& A4 b4 e: { O0 L' c O
}
; O1 u* o& e/ q# v2 \, A2 e) F v6 V( ]
/*$ [2 j& D: i0 C( g
*@定时器2初始化
" K; L% p4 n/ z+ a& _*/8 Z7 J& ]4 x. Z4 b
void TIMER2_INIT()
8 l$ V1 w/ e( f1 J5 g7 R: t{
( Z, K! g! h: d& i4 D3 S: {7 ? TMR2 = 0;
) q6 T4 ]2 G/ n e& Y" O; U PR2 = 255; //255, x: J3 ^. ?: g2 y
: L; e( U0 @" b6 @6 ` `& x4 U TMR2IF = 0;3 Z) Y+ A5 C6 c3 [8 K6 I
5 z" {# U* e2 }8 b& n
T2CKPS0 = 1; //16 P5 }/ A2 s1 p6 J& K; c4 z; z1 |
T2CKPS1 = 0; //0
$ b" H8 {5 j: @2 X% f0 j) x+ x & w# S6 W/ n" m9 ~& y
TMR2ON = 1;
9 ]5 J) m4 v. ~2 m}9 W3 h) g5 r, u6 I9 S- D
& T7 ?! k/ u1 f
/*
% c8 `5 d7 {* C+ ~*@定时器4初始化( Y6 V! b; j/ K2 A4 t% g% o k( g: [
*/9 F, c7 B) H, s9 Q( b( h- |. b; [& P
void TIMER4_INIT()9 W1 H1 ?0 B% @% S% D& E6 A
{' B$ a; y& X B6 D% x. _5 }; g4 Q s
T4CON = 0x0e; //0000 1110
. _) |6 H6 K: e8 A3 q
+ b% ^! p: D( E5 o0 n0 O S TMR4IE = 1;
3 E; l* o5 O9 ?. J TMR4IF = 0;
1 \. t( u9 i. `7 F) w) }5 |( j8 K
4 W5 M# S/ H& ~, s% G) l0 J TMR4 = 0X00;. I! t) Z2 x$ |6 Q/ Q
2 ~. w$ W0 l& }/ i6 I PEIE = 1;. j# J2 A& M0 b2 M0 f
GIE = 1;6 l: U, p, V! W6 D
}
+ @6 ?; k0 F' @$ l. S8 ^! y' F" `# J4 a5 K/ Q- Y" W
$ g) q% `) E3 q0 i2 O0 T
/*
7 h" k# V+ q0 k5 @$ b) p*@ PWM初始化
U- Z) W. u; F+ ~*/
5 g6 z& L' X* P6 J! M4 hvoid PWM_INIT()
3 E+ b1 e" p# ~, g{" H/ u% u. _% a5 L# L+ X/ ~
CCP3CON = 0X0C;
/ i3 ~9 U& I* t, N$ j" H, A4 d CCP4CON = 0X0C;
6 r! R. B7 K5 x" @
2 w' M5 C9 i6 A# }' G! B! [( Z0 b5 W2 h CCPTMRS0 &= 0X0F;
! r6 o8 @1 U7 }( v1 }3 @ " T; {9 l8 l. O( g; `' _+ _
TRISG = 0;
1 C: d# Y X$ |! v}5 q: ~! v4 o f7 d# ~* V4 `
! A$ t1 }, w* N1 A; h/*5 e( q1 S5 F, W9 r- i5 J( ^; w
*@Function 主任务函数% t: w4 P3 `+ e/ I! y: P7 r
*/
) W/ y% b! V- m1 v1 v, e8 N# evoid Control_Task()
, u! ^& _9 f& r{
0 Q4 e, u% Q& ^ static uint Time ;
4 V& {: o4 O p) C// static uchar State = 0;
* h# c6 h4 @ Y d% X7 D static uint Record_Time;. x i* W: ?; y
uint Delta_Time;
: c% ? V) O, [) ]% f 4 `* {* E$ O. D2 ]" L0 j
if(State == 0)8 P6 L2 y' Q# p
{
7 q& Y+ @3 C/ k+ P$ V+ X# k$ q Time = 1000;
R6 \2 t) M+ |, s State = 1;+ S0 z1 O. X/ \+ j
5 \1 n: b/ y; h- G: \% F8 f }
# l5 w! Y7 y0 N! e% G- s8 Y if(State == 1)& c( ?* H6 ~ E$ C4 m) S4 m
{3 O0 p+ d9 h. d1 W( `) ~6 p
PWM1(Time);3 _! \7 H; ?. E& p" t( y2 ^8 g
PWM2(Time);
1 _- H+ S7 R, m, O1 _" b ! q* ]7 ^' m8 S' X
Record_Time = cnt_1ms;6 d& B7 f% n0 y0 U+ R' \
. c8 n N# Q8 Z/ M2 q0 ` State = 2;
8 h r7 D. k6 |8 o5 e2 f+ `8 I1 N }
, G$ v& A: E9 O0 R 6 O4 h7 B" S" t0 X M
if(State == 2)
9 s1 [; B) X6 n {
1 Q' q/ @# H4 A! o4 I if (cnt_1ms < Record_Time)
7 l" }4 l |) \3 { {
' ^/ W; {8 t. U+ x Delta_Time = 65536 - Record_Time + cnt_1ms; / `. Z( R' L; g
}& V% @7 z$ h# y: O
else) O( _( }1 Y4 x3 \1 M2 T
{
5 L/ F! o4 c8 C: X7 [6 p" s1 T } Delta_Time = cnt_1ms - Record_Time;
& g) W4 h& ^) M; {5 W, M }
+ \/ S* O A% p7 ]: n+ Z! \3 d- X) {6 f; q. ~, ? U& }
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
+ Z2 L: U" }# |+ H% i; o; F0 h+ q {* i& ?8 ?. @+ }; L! l/ [
Time = Time - 100;
( Z- Q0 T1 H+ @$ A% c# D7 u# N J State = 1;
: A6 w& o, Q+ a; l/ h6 W$ L
3 Z7 G0 p# v# v if(Time == 0)3 h. f: Y$ ^) L( ]& M! _
{* C( y9 ?: Y T4 b# i7 A
Time = 0;: P( K2 H3 S: R! y( Y
State = 3;
2 j9 X2 z: V" u: o/ \ }# |, \# y# ]# z% \
}
! A1 c U0 g- ^3 r- K0 ` }2 M% |2 ] K, k) M( Z
* n- I) W+ D$ G9 @4 _. j; t, O if(State == 3)# B- l5 R7 W, H( |0 {. f
{
, U6 {6 U, Y$ v9 { PWM1(Time);9 y) D6 s# ` p
PWM2(Time);
2 O% e4 d$ D2 e5 \3 L! j! ^
) t0 O' |7 l% d( z4 A Record_Time = cnt_1ms;8 U! R; f! l ~- ^4 ]
- d3 p% _2 z/ M; }
State = 4;: y; j8 Y e# x
}
5 T# s: ~+ B" X0 c1 A, v
" t6 W' G( ~! L, |9 [ z if(State == 4)
3 N0 q! C8 k; n6 k {. P* S" z' f/ S
if (cnt_1ms < Record_Time)
, t5 b; z3 B% k {
1 w1 I; ^+ f- a Delta_Time = 65536 - Record_Time + cnt_1ms;
" q+ s9 ^- ]& |- @ }" E/ \: b+ x9 i! F6 [0 _
else1 [ A/ x0 u: c/ y# k3 D
{
0 b9 r% o! B3 N2 z* I1 h' S; f F Delta_Time = cnt_1ms - Record_Time;
. E7 a( o2 L) a5 c Q }' c6 x2 x) e7 ]- v' L/ M, u/ [
5 S! i- b; ~) q( A; Z if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT7 e3 X$ \2 [; S
{
& ^5 x! p6 W" z J% C( g Time = Time + 100;
7 p5 Z0 z/ l8 F; j5 N9 { State = 3;
2 x% S0 t2 s9 k" w " p$ r2 b- e) O
if(Time == 1000)3 ~) n1 Y# \$ N) l
{
8 q' b0 X, i: r2 \ B8 T State = 0;+ U" D8 A/ h; A/ r3 a
}/ @8 _" [, t5 p
}
7 ], L8 I1 ~$ z1 N4 } }* f+ o8 _" i2 G3 N( X
}
% O5 [3 C6 Q! X( k( H4 _/ M, u) o6 ?
void interrupt ISR(void)
4 }( O3 y3 m+ O8 u( h1 b7 U9 R" q4 u{% {) a. m6 } H* ^
if(TMR4IF == 1)
z7 F V( G7 [/ S- f {
2 Y/ a1 Y8 m' C TMR4IF = 0; N6 @( F0 P6 t; J# Y
cnt_1ms++;
. v+ q; a/ ?+ z8 J7 \! ?
& i" [7 V |8 |1 t) [6 a // LATF0 = !LATF0;% t* T( |* G% f0 d- \& L* c& @; L
} $ I- D0 N4 E$ O2 g% a, a) C4 I
} |
|