|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。1 m0 R; f: }4 w& g
: `$ Y6 m J* c# ]! G/*
, A/ r8 W. v* i; G" F9 d0 P*@Name: PWM_led
, I6 ?8 N8 X3 g! e# ^+ h2 U*@version 1.0
( ^* q3 @8 D/ ]- a) [& K7 [*@Author xiaopan
- }3 u, p) ^! R6 `*@Date 2014.8.2. y5 b- U2 W; i& W; |# b5 y
*/! b. C6 N* E- o% ^# a. F @$ x
) T- h1 ?, |( {! R8 z$ P# I#include<pic.h>( `+ r+ }, `4 ?1 F, [. i: H: W- w
#define uint unsigned int
3 S6 f/ D8 Q; ^. O9 v#define uchar unsigned char
5 C- @" s G: I( ?/ `, W2 I# U9 c# | G/ Z
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 ; ~, V$ O- N# W
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
! Y w# |3 I' X" t7 M! K; q& R
* ^& ~1 q9 y; y2 Fuint Time = 0;- m7 i: o) E1 D1 n- U1 M: @
uint cnt_1ms = 0;
+ W+ b( B7 ~; K6 Wuchar State = 0;( s2 \( c- p+ q; H! Z( p
$ a0 t8 Z9 ]9 P) d( b8 Hvoid GPIO_INIT();0 M0 S( q% [: z) g3 L
void TIMER2_INIT();
3 [8 W3 G) k9 W. e& Ovoid TIMER4_INIT();
0 K2 Z6 ^0 L0 c6 I0 ?6 U& O6 rvoid PWM_INIT();
, `, n2 t6 K9 e$ p3 a gvoid Control_Task();# P! { i8 v& \2 |. A% `
1 l: d4 p- u9 r# s
/*: R& V s5 v! [" V4 o* F
*@function 主函数1 G4 l) ~+ _% l* b
*/* a6 L8 k! j: Q+ _6 A; R! c1 |
void main()
5 V+ x# b# P% V' e4 k{3 U; F( E6 |9 f- [5 m* D
GPIO_INIT(); N U, O1 W/ u/ W; h* m- j2 n
PWM_INIT();
" f! I3 f0 P! p5 X5 g TIMER2_INIT(); //PWM利用TIMER2. l6 v {4 J, G% r
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形$ s4 S/ J m, W% a9 T
while(1)3 t6 `3 I: j" @ `, q
{
F3 g, B6 p' P$ J Control_Task();
0 U3 D( N/ v7 W: Q }( |- T# s6 }& D) T5 P
}
9 I: W, |2 U" R/*
8 f3 R/ {$ v) P( I# F+ F0 W*@Function IO口初始化 RG0 CCP3 RG3 CCP4, ^" R8 j9 L7 u" w
*/2 v* d, I1 h t* t8 U
void GPIO_INIT()2 t0 O5 x) F: y s. P9 M: P4 t. M
{
) M8 H8 c, _- @ TRISG = 0X00; //设置RG口为输出2 {! v. m9 T9 x: G) H
ANSELG = 0; //设置RG口为数字量
, C. v& x' o/ j9 ]1 n LATG = 0; //设置RG口为低电平
! i' }8 j$ W7 p1 J( q, {
9 i" `: \* n( a' f5 p TRISF = 0;
( O8 o5 @) c8 u; }/ K6 S ANSELF = 0;
/ \6 c. G3 R( d. Z& ]! k( Y6 c LATF = 0;0 y3 a. |! Q" X$ P6 s9 B
}
+ {* X7 |: `9 N H5 W- s) Q' d: L6 F) N% V% y
/*
: `9 y* N% K* ], ^*@定时器2初始化
% O3 R- p) @) N! }% h*/
. h$ ?* F8 r; r" U. D: G5 }/ cvoid TIMER2_INIT()
" r1 v0 K0 y( G, h% [{# p3 m" F8 D; Q2 n
TMR2 = 0;
" `8 v" }# S7 R3 R PR2 = 255; //255- D, _ ]& L) ]$ C$ o( S/ e
5 f& W* O r0 o7 Y4 ?$ T TMR2IF = 0;
, J5 k4 n! A; N7 H5 |
8 \" |' G/ Q F9 s% o8 D! G T2CKPS0 = 1; //1
8 `) i; U$ L2 J7 g1 ~; q& E, \ T2CKPS1 = 0; //0
* X7 D6 C& O+ q1 w E3 r- M9 Y" F & F9 \ ?8 Z: A* {
TMR2ON = 1;
: X% f7 s" H' W8 c6 u}/ @+ D( o- J! k. ^8 E; y: R0 ^) }$ ?0 \# p
+ `5 g- d1 M# ~- J: f; Z/*, n+ }* p, V% p: e. {) Z' r
*@定时器4初始化
7 n8 F' i+ l" y1 M0 D) j*/
; h+ @- e& S; W7 } \- ~( Lvoid TIMER4_INIT()# r7 G; H |+ V- y
{
. `, p& E% a6 y7 k T4CON = 0x0e; //0000 1110
/ o% ^1 i p( a) f2 i: E
! b$ k8 }' Y) J1 }' d' i8 \) O TMR4IE = 1;
9 I/ x( Y1 Q, M } TMR4IF = 0; , y9 H! m- w: [2 L" ?2 D4 n. `6 r) y
2 Y5 H* _& S0 e* }. q+ c
TMR4 = 0X00;& w( p9 a; a, D* m6 M
% Z5 n( u& E Q& @
PEIE = 1;
0 o R3 j. \+ n3 L7 Z, R( p7 B GIE = 1;
4 `& L7 Z' |) k1 P9 S" l6 z}
! \4 j; A1 A6 v( x6 |" O) s M; e
, D8 k) _ e9 z) [9 g) J1 {6 q$ V. L) k. y9 t8 p
/*
: C0 c: _8 A9 R6 q! B*@ PWM初始化
0 u; k9 X: m7 S7 @% y8 @0 l*/- {; h& e' Q& s
void PWM_INIT()+ s$ _* \, [( v# z/ j H3 s
{! p/ F) w) ~2 e$ [/ r, [
CCP3CON = 0X0C;
; r) C6 j3 g b p/ G CCP4CON = 0X0C;8 [# Z, V* s1 N6 N
2 r D" `+ T6 m7 a) _ CCPTMRS0 &= 0X0F;$ d8 n* i) B O" h
/ ^) w( E7 N. Y& o
TRISG = 0;
% ?2 i/ V* |* e. C# q, e, m; h}
- Y+ O9 J$ Q( u& S3 F* x$ T n. {* S* x
! }3 |- b7 _2 W; W) B$ S6 |/*4 u: j. b3 U3 I
*@Function 主任务函数$ K6 U6 g$ b; S( S6 B3 [
*/
# n) v/ [1 X+ h: Gvoid Control_Task(). @$ h# V3 j/ ]& f
{
1 N1 o. h/ v6 S: t. n static uint Time ;
, P+ n& ?7 S* s% I" D) S# }% i2 |// static uchar State = 0;
- c4 O3 r/ Z1 m9 E7 v static uint Record_Time;
6 x. I9 [# ]' X" ~ uint Delta_Time;: z1 ~' }7 `$ V* G/ }& a
$ i; D2 b! M; a, `$ S
if(State == 0)
4 G; v3 a% Q% R# Z' K/ ] {' y) g7 s7 H0 @! M2 P
Time = 1000;3 W- x$ t* g3 o. s- y
State = 1;$ q! E7 s& z7 p. D6 A6 O8 e
) w! M5 i. S1 K3 {
}
8 R: Y1 ] r, s" k% J/ X if(State == 1)
% R A7 L5 y! \2 w( O# G {
6 t/ F i7 q5 T- a" C$ `, L# C PWM1(Time);
% v" o6 Y1 A$ {8 I" ? PWM2(Time);" E7 W$ e3 N6 \( P
7 K2 z m* W, n2 B
Record_Time = cnt_1ms;: |9 M/ G% G3 Q/ k( ~
, \) Q$ S' N+ d" U$ N
State = 2;$ ~' B! F4 p( E5 W. ?
}
% e$ \$ J: Q* R7 \) B1 l3 B
; j1 @6 c9 P' F7 b- h/ x if(State == 2)
3 Q ?- Z2 ~4 X2 I& D {
4 z4 c! u, q) y) P* W' S+ q if (cnt_1ms < Record_Time)
* t* P4 y1 T4 y4 c {
6 V) Y( D/ y/ y7 i5 u Delta_Time = 65536 - Record_Time + cnt_1ms; + ?& Z+ p( h2 ^. m& ?
}
5 C* Z. y* a* n1 M& l else! y: [$ O! \3 u5 l5 o) J
{
$ @ I4 q( d' T: a0 T) j Delta_Time = cnt_1ms - Record_Time;
& f+ E5 J( T( J* }1 f* y- Q! \ }1 y Q6 M1 C6 C/ b* `2 E
$ e( y/ k9 ]. h/ f( \$ N4 k if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
* f5 Z. Z' o9 N0 ]* \* `, j7 R& T {
4 y. D+ G# b' s- K/ q6 g6 H2 I: L% M Time = Time - 100;: b! y+ }# J) {, b8 m5 i" W4 e
State = 1;# ^. ]2 q8 y3 q) E
6 P1 V0 Y" O% U5 \3 p6 Y( B }: I, Y if(Time == 0)# r! l4 F0 f* D
{
+ D' t; S: h& |: J6 q! [" ~ Time = 0;# f) J6 b. T/ j, h
State = 3;
% z" m; K9 \" Y! g- c9 _6 i0 z }
2 o/ _) D( l/ J1 `3 D: b }0 ~4 L7 v$ h& C
}
+ g& e& I$ s3 t: }( I6 e0 z3 ^
5 J; \9 m2 t! ~6 L6 | if(State == 3)
- k2 o8 D* i' Y, |& U+ R {2 t/ T3 [( t5 t' M: j0 l& _
PWM1(Time);+ Q4 j9 c7 F0 d
PWM2(Time);' l$ k* j; x1 k* F
* z1 V8 T6 c. m% R3 D2 }* O Record_Time = cnt_1ms;3 D& v6 t0 R! H6 b
; E0 l, s5 m+ j; j8 v1 J9 s State = 4;4 g+ ]$ [0 }* E7 l, V
}
. F- n* q' T6 I2 o4 B" w! x
; ?1 T# Z' E# Q! D6 {3 S/ m if(State == 4)
) k8 ^$ l- ?; _4 }* ^$ W! b {( r5 W* F# _: `3 c* h- I& S
if (cnt_1ms < Record_Time)
# b3 a; t$ n3 T' u, V' e {; N# z2 S& d' L) j& D" B
Delta_Time = 65536 - Record_Time + cnt_1ms;
$ R- d, e/ Y3 X r# | }
% a; C8 H2 M& q3 W+ Q) s m else
+ f& R; u; c( c9 a+ x8 Q {
4 X N* A2 D3 P) e: \5 e; k Delta_Time = cnt_1ms - Record_Time; 9 o) R" D! y& ^* U
}
$ |. F* M) k/ U# B' \4 v3 r. @3 p
3 T9 j5 d% V3 q: S% x8 _" n4 \' d% G if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT! L* a$ D7 K! r& L! A% G/ Y& R, s3 W
{
4 J) k) ?9 z B6 e$ q( X Time = Time + 100;: V9 u0 B: a1 Y$ j* A
State = 3;
5 ^6 g0 @ S/ V" M s$ U; j! g- l $ K+ H. j5 m0 C. t( N8 p
if(Time == 1000)9 e( l1 T/ G6 a0 ^' h* Q% h
{, O. E5 V7 T' _8 G1 U
State = 0;2 o) T( i) U/ o1 P' v
}
8 S7 y3 P+ @6 }( d# c7 n, {/ y/ m }1 a" j; Y. E3 W: m- _ v
}
, h/ d) C3 Y) z* W}: R/ C5 B) s/ C9 [- u2 ^
( K, R8 p; T2 d8 z+ j7 ~. v4 ]
void interrupt ISR(void)& t8 {- j3 ], d( _$ f' q! ^: W
{
/ o$ W) U% @% T" ^% l8 j# O* s if(TMR4IF == 1)
: i9 f$ [8 g1 Y! W: D {" ^0 N Z. b! h( l* }
TMR4IF = 0;: V9 c2 s/ @4 M, z1 w) B. ?/ Y
cnt_1ms++;0 P; J1 i. k# c2 d5 G; S
2 y1 G, D5 _/ o4 c
// LATF0 = !LATF0;
! S7 E% }6 X: _. k0 `% _ }
1 R1 d8 U" U8 W0 F) p}
1 v# @# x/ @( h9 z. c d- N. r' ^ |
|