|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:/ Q: T4 u$ C1 @8 ]
7 l" ?1 i8 R5 I/*: N3 r9 [/ F: K
*@Name: PWM_led
, x( ~% S% H( b( b0 H6 `0 J# ]*@version 1.07 G: i$ p2 W/ B: M- b
*@Author xiaopan1 l" g6 u3 ^3 ?6 k& |
*@Date 2014.8.2
0 N: h) X2 F6 K2 W8 ~. D*/
" |5 F4 r2 J6 x- w+ P" k+ v
0 U! c* Y! u/ U1 b J$ m#include<pic.h>
) a# Z' N8 ^+ F- R0 R5 p; k* r2 d#define uint unsigned int ! T6 |& z: P. Y7 G( Q3 q
#define uchar unsigned char
( g5 }( B( g2 ~- g) t0 Z8 D9 [1 t4 b
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 * ~4 k5 E* ~1 I# q' t+ J
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 ' ~7 o* q/ O! w- ^
) r: s4 c/ W# P' N2 Q; |1 m) _* Iuint Time = 0; ]+ g. y F4 z
uint cnt_1ms = 0;
; K1 d) g/ A8 y6 y4 u' auchar State = 0;, [3 k% t0 }/ w
9 t3 L; | S& z$ E
void GPIO_INIT();
+ \' K/ Q3 z1 N$ j8 D0 Z- Tvoid TIMER2_INIT();
7 b9 W0 P' H' v. y$ O7 E& W+ Ivoid TIMER4_INIT();9 O! N1 L1 v. h" r7 i6 T U [
void PWM_INIT();
# ^9 T! ?$ }4 Rvoid Control_Task();6 p- S x' G$ n. F# @( Q
% ?( e! ?6 y3 R; E8 ~
/*
7 g" a- j; x5 n) X1 |7 K6 C*@function 主函数
9 u0 a; H: H/ ^1 e7 k*/2 e2 F! R d! T; K! p
void main()! U4 _, l L" J# N; H
{: T, Z" c# D! ?1 s+ ^& ~
GPIO_INIT();4 I3 ]# }% x+ @8 q1 c% @
PWM_INIT();
% i' _/ L+ A, s# ?: I TIMER2_INIT(); //PWM利用TIMER2. {* d2 U, }; o& s1 X
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形8 N! \0 x1 n4 t" D/ n
while(1). V- J( x4 H) ^& [) Q
{, i) a2 E( P0 _/ d4 E
Control_Task();6 c- d' a, ?! o8 t6 s
}( Y7 ^! w9 y2 k$ U: f8 H
} Z* z Z8 @$ N, E$ ^' \8 N( d
/*
5 e" m# U" ^! d- E4 e# Y& z. k- e6 I*@Function IO口初始化 RG0 CCP3 RG3 CCP4
9 U! |# l9 l ]' p7 }% A ]- Z*/
0 e, R& `* K2 ^: Cvoid GPIO_INIT(). ]8 f8 j) m4 m9 |& B# T' U' T
{1 X8 E- Y* D2 S6 ]' `* g5 b7 U# K+ `
TRISG = 0X00; //设置RG口为输出3 u" q b' @3 M. C
ANSELG = 0; //设置RG口为数字量8 G4 Q* t( t6 ]+ J1 W4 l, w; g
LATG = 0; //设置RG口为低电平3 o& r0 Y2 `3 ?8 ~' a% U
/ ]# U2 ^! b! ^9 Y5 @4 s: E
TRISF = 0;& e5 l1 C$ P# k7 u3 i: v; v
ANSELF = 0;2 z2 }" d9 c/ e0 j" i! q3 b+ X4 }/ w7 |
LATF = 0;
. ~7 [4 i6 \7 u8 a6 z5 A8 d}
0 {0 ]. D" U0 U; m6 T
9 [$ {3 y2 I: Q, I8 o' y; [/*8 W7 E. v! }& A# H8 C% W5 }
*@定时器2初始化2 ~/ }# s m- N8 D1 _- r
*/
& i( Q1 |' N* Y1 K' m; d4 o0 s) zvoid TIMER2_INIT()
5 p: U) \$ c; M1 S' O% `{* E4 S! M# k2 |+ I& {
TMR2 = 0;; } A& {. p. x
PR2 = 255; //255
& [( d; L5 g; M8 _ d% O! |, ~/ s " J% B7 c5 Q* b/ R, x
TMR2IF = 0;
5 n9 K# U q# Y3 k! M$ x: }
+ X ]# o$ a3 |/ V' O4 a T2CKPS0 = 1; //1& x* m* r" q- o8 K' P
T2CKPS1 = 0; //0( e# U4 m8 _- }( x7 _0 v2 F4 g
; x: J, W" [8 q+ L3 O
TMR2ON = 1;
2 W) V0 a) s+ f+ U6 @, g}4 A$ X! T( U. V: }( }. V
* y W. S( g1 r7 H/*& P8 e) ~' Q' I5 C
*@定时器4初始化
l/ S/ z' `# l! z `% d- q* N( I*/
3 _* I0 m0 U8 [! G( s* dvoid TIMER4_INIT()7 d) ?% \" E2 F1 a
{4 f, P3 K* ]9 g& |" `
T4CON = 0x0e; //0000 11101 M$ J; s" H8 n
8 w$ e) X1 _% `- g+ I
TMR4IE = 1; j8 r$ r7 y+ G, H! t, J/ w8 T
TMR4IF = 0;
+ L) S' g; {% |! ^6 i4 h# S
6 J4 Q& e# o H; y2 k. L TMR4 = 0X00;
6 P/ u+ ]. J; e# Z ) Y1 L/ V8 z) `0 i7 @
PEIE = 1; \8 v3 v. O/ l: O
GIE = 1;" u! h" T5 G8 u& l
}2 _( U6 _- o1 p( Y1 v
% P' t" K3 }* c4 X: N
" e! E8 y. g- C" W$ `& \/*
" p! k# f7 A* X0 N*@ PWM初始化! ?0 m( R. @* N( B( z8 q
*/' j8 E/ |6 P9 @# B6 G" r
void PWM_INIT()
) p9 _, U4 {4 _* q% O{" i; t+ i6 d/ H" @: G
CCP3CON = 0X0C;" D- E# R) a3 O, |
CCP4CON = 0X0C;/ D8 Y, ^4 z* R A
; N$ K3 D5 S( l. r CCPTMRS0 &= 0X0F;
7 f# w( G, E# ?$ S
+ S: J( `: h0 u) v TRISG = 0;
' p" f5 C9 f/ M5 D' E* m}: L; [ [: [) \0 m) u
+ e2 r* F9 i* a R6 V R2 a
/*' j* N, p* N8 l8 t# m8 ]( l/ l
*@Function 主任务函数
$ b, |- ~! Y' m7 a1 P*/2 H# N# c# d: P8 w
void Control_Task()
! a* z# R. o! Q( z) l' E3 H{
" q' H6 y0 g: T" n5 E1 u \; k static uint Time ;+ K; D" M2 [ S0 a0 r( p
// static uchar State = 0;
. X: D& k- O+ Z) N1 s( g static uint Record_Time; K/ s6 A4 n8 x5 G) i& T4 e
uint Delta_Time;
& d' ^6 n' U4 M' W/ C c5 ^' ` % h: l* E2 n/ V F
if(State == 0)
8 y$ i6 h- B8 T& }; N5 _6 W {( f( B4 s( o* g; Q& q l
Time = 1000;
7 m$ ^6 f _, y% }! B) i2 D" X State = 1;4 M) f0 r8 n1 _ M
& u! W' e8 E, b' P }
: w# a7 n. a- `* d6 y if(State == 1) s; n$ T% n& _/ S
{
7 C$ Z4 P2 S+ M/ Y PWM1(Time);
! S: ?3 a0 y* J* D PWM2(Time);* A- i$ `) g8 i! k1 u
- E8 A" e& v; @; m3 S& T# w N Record_Time = cnt_1ms;
1 d2 F: r- H) c' ?1 W/ z1 d* q' I8 L0 d
' Z' \. [, C+ t2 ~' O) {/ S State = 2;6 T! I7 c d- e6 {- H
}' N9 ]$ m, l8 X' z2 A
0 K/ C( C* v$ N2 d2 G% V' y! B if(State == 2) \. Y9 @" O6 }. r0 ?) k
{, L& w- T- A# |( v; z
if (cnt_1ms < Record_Time)7 _3 }; v* p( z" Z) f) z
{
. ^- r5 P O& y5 k Delta_Time = 65536 - Record_Time + cnt_1ms; ; n7 m, P5 t4 Y/ X
}* Q% S7 G" c) M6 t# D7 B
else9 T' F* `. M) X
{2 ~: v5 `$ w4 ?! J' Z& m
Delta_Time = cnt_1ms - Record_Time; / e3 h4 T$ L+ o/ [9 H& D- u
}
5 G6 \6 g4 ^& I- K$ l d7 f( \
6 F* [' z$ f! q' z) ?6 f6 V0 e if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
9 q/ R$ ~2 A7 e1 b0 o( C% ~* Z {
9 R# u+ g% I' b, y Time = Time - 100;" K$ G3 ]! U& K7 O: m6 P5 A n% z
State = 1;$ `4 ^, q0 T; @3 E' s
" A' [3 h$ t( G1 b" J* Z. G N if(Time == 0)
! C5 l# R: G1 g; G {
1 s. e& m" K( K! [% q Time = 0;
+ h% k4 p) E s5 |* k State = 3;
$ V7 f" O" R# w, z: Y+ R }, `% N2 r9 A4 O" T
}
; S& E/ {! X/ W& k7 U }! b- { W; P$ |$ W$ M; S) t: }
& I1 [' K6 Q2 `. B* [
if(State == 3)+ s6 j: d% q9 @' V
{
$ L F* g' t0 a7 Q PWM1(Time);. V% q1 A& ?* I: ~0 w
PWM2(Time);: w% `) X( _1 y- U3 i: Q* o! [$ r
0 W+ l1 Q4 W8 _" d; z Record_Time = cnt_1ms;* |* ~! a3 E* a. U
8 i5 u3 i4 f" F. k2 y2 z8 C h3 y
State = 4;
8 F( o; D# |1 _. ?) b- _ }9 G! ~# z" P Z& W7 E& g
/ g2 t7 D2 h5 z5 o, O2 r3 C
if(State == 4)
3 H ^. l6 B1 W- A. b6 L {& F% U( _: B& [/ D7 V
if (cnt_1ms < Record_Time)2 C, s4 H8 B& _0 j6 d: S" R2 i
{
; H* a; M7 Z1 a+ V Delta_Time = 65536 - Record_Time + cnt_1ms; - p1 ^+ V8 v" W6 J
}
( m9 F6 I i: R+ p* i; B else
$ g7 k5 t( ~8 N {
/ M; O) d* S' }# c$ V' \' K Delta_Time = cnt_1ms - Record_Time; * N2 F% B6 z& h9 l
}
& z; r' J# [ B4 r
+ x1 N f* @+ W. e9 ]& E0 S: c6 Q if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
/ c/ ?- A B) y! A4 v {, C# ]4 y8 T" h( b, j) d$ w. N0 U
Time = Time + 100;* }3 g& A" |; ~
State = 3;/ i4 S8 q& ]7 ~/ ~+ l/ [# @
/ X7 [% P" L$ c1 l S- p
if(Time == 1000)
! X& K" E' v8 g B& N* z, u; v {6 B* b# g# ?1 f
State = 0;" t+ l% d6 M; j h
}" t0 H# s6 A. N2 x1 f' e) O4 K' k1 j
}8 [6 O4 ?$ m( a4 }
}6 j1 K! n: I" J. g# F" ^
}
! m$ M6 V2 } y5 G# p
. b- p0 ~; x/ O3 Dvoid interrupt ISR(void)
" ]& D! F) d0 |& B& D+ ?{; F+ u' M& Q0 n5 U" a
if(TMR4IF == 1)1 w6 f, i/ S, k% D }
{
1 {* C: A1 T2 m+ O- b5 U9 e/ s TMR4IF = 0;3 i# ]3 E3 U1 W) {
cnt_1ms++;
% e& {' s, c+ n
! d; Y( y/ w$ g, n+ N // LATF0 = !LATF0;. t7 t0 Y. G& }# a' R: K
} $ c4 Z! ]; V( \
} |
|