|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
\1 h. s& r& i+ r+ I0 z" `
; M1 X o; x7 P! |- u% O/*0 y; M/ ~; m0 |, \. G" O# `
*@Name: PWM_led
1 s# U' k$ @# X. S*@version 1.0
0 r8 {3 f' a p! A*@Author xiaopan
: s7 e( V5 j. {& L; M( C*@Date 2014.8.2
+ u0 T7 R/ N' `2 z+ o) G6 D7 d*/; B3 R! H; Z1 n
, A9 C7 f8 @; K d* Y
#include<pic.h>
2 R) V! Z4 k9 P7 A. v9 `#define uint unsigned int : f$ f7 A! o+ B/ V& k m) J) G
#define uchar unsigned char: |: a- H7 t# y8 S
4 F+ _! R4 n0 A l K: b, H4 E( r#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
5 n3 s2 s1 Q( v#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
" {- [; `5 x; H7 h6 |
' T! M; A* g3 i' Buint Time = 0;
G/ j$ [0 d: ]# g5 B. s, X; suint cnt_1ms = 0;4 A1 [4 e0 h4 V3 s4 P
uchar State = 0;# ~! x' Z, J/ N* A
% y ^* _2 W$ x' `$ ?" Mvoid GPIO_INIT();
! n5 U- }' v0 @& u5 e5 z) rvoid TIMER2_INIT();
# R# ]. F7 e4 E3 Dvoid TIMER4_INIT();9 K. S& G& w: Z' u$ h3 k5 S
void PWM_INIT();9 W! |. g( v6 ~1 K. `
void Control_Task();; B ~4 k! n5 s; l' }3 G
. t6 j# q$ q |! @/*
, S/ \7 ?& n8 u( n7 {*@function 主函数
' O$ U0 w* L! x! C) _* i1 h' _*/
! P5 i. m1 c7 ]. Q8 ivoid main()
y1 U. S9 d4 M{
5 F6 Y; i% o& M9 `( ?. o GPIO_INIT();
! \' x0 I6 m: O5 w' g- t; L PWM_INIT();* s1 c/ I# q& u
TIMER2_INIT(); //PWM利用TIMER2& n2 w/ Y3 ^2 X# M6 ?5 T: b& ?
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形$ F8 s" K3 _5 U- A
while(1)5 ?% z6 e4 P0 w1 m( j$ `3 E' a6 [
{
, t4 Q9 C: Y8 [7 {' w" F; M$ F/ P, | Control_Task();7 u( k9 ?, T6 B$ w% T# q5 Q
}
' H- w6 f) G( Z8 [ G7 B}' d7 g! f, z% m9 ?# d3 d
/*; J2 L4 X$ s) h/ b# t: {& ~
*@Function IO口初始化 RG0 CCP3 RG3 CCP44 @( b0 d. A: I* H/ `
*/' H, R& j, T9 ?# k* J8 Y( u
void GPIO_INIT()
$ U0 Z% j9 y/ I4 ?& v0 i/ y3 X{# C, b3 y6 n( i% h/ M o6 A4 m* v
TRISG = 0X00; //设置RG口为输出
9 Q0 Z& N' ]$ L) e; ^, m ANSELG = 0; //设置RG口为数字量
/ z' W4 x! d. [) @; ?1 I4 c+ w LATG = 0; //设置RG口为低电平
" x# l5 `* c2 u: K6 f5 X) y
' t' O" {2 L5 Y7 s z8 G* n TRISF = 0;; _( {0 `! m3 ]1 ?. F, z
ANSELF = 0;
9 Y- j2 j* y9 ~8 I6 k6 y5 { LATF = 0;; f- K* e5 `1 ^2 P
}" u' l' t& t. L9 a2 Y
, M* M" _! z! b& J8 s/*
( G7 C8 L. N: e. y2 x*@定时器2初始化
. V5 ~% q) c( i6 O- X*/
& e& e4 C, X% e5 z* n: }8 Z( o( D5 wvoid TIMER2_INIT()
9 @! h; G# i6 q* U* o7 X{0 Q" S; K& y3 T6 l
TMR2 = 0;$ a# z" c; b, y6 h# u
PR2 = 255; //255
0 I& q3 f% v& D
. s( s) `# q: q, T TMR2IF = 0;
5 V+ \- K( z. b. G+ @ , \* i2 t# m$ G2 O: `: @" ~( W
T2CKPS0 = 1; //1$ c( g# S6 P. n" G/ \
T2CKPS1 = 0; //0
& r. ?8 Y$ w$ ^. U
+ J U$ g. r/ v9 o TMR2ON = 1; : m/ J- Q9 c5 h0 E
}: L& ?$ k+ g |3 `0 K7 N
& e# q& G# q0 S- ?
/*! ^( x. ?& { b h$ S0 Y1 T. {5 P/ B
*@定时器4初始化" | r$ ?0 o8 M4 e9 h. }1 D' l4 j
*/
' E# g1 N$ p, \5 T Wvoid TIMER4_INIT()# y7 t- Q& j( R8 p0 R& t8 r7 [4 }
{8 o/ d1 w C5 u- D% x
T4CON = 0x0e; //0000 1110
H- i( E# A# K! z$ m# U% j' @ g" c( U( n
TMR4IE = 1;" v& K' M) k" j" {. h1 i. N
TMR4IF = 0;
$ O' r1 j& J5 B- _* v
) I0 H9 P- v l' f) Y% A7 U$ t2 a TMR4 = 0X00;- y4 r6 P) C" O8 ?
: m' H$ p9 S2 y
PEIE = 1;
$ o2 X2 a7 m' `4 x' E- e" [ GIE = 1;
: B: a! _$ m3 Z0 Z4 p}# l$ O, T8 A0 \% L. Y4 U
5 \2 H* E% g; q- w2 w" Z* C3 E9 R
) z9 A3 @% R6 |- g" A
/*
, ~( T1 z# A: O*@ PWM初始化' K% j& S& Z2 n( v/ u# V+ ]+ d
*/
* C! V/ P- r! s2 Z! }& Yvoid PWM_INIT()* c4 @8 A! L$ `5 a. O1 Z( V
{
! r$ E2 L9 V" C3 j& H0 s CCP3CON = 0X0C;. b, c: R0 _: E8 O+ k
CCP4CON = 0X0C;6 a4 v( e2 E, n" J' v1 m2 X# K6 g
) u! G y( Q. _$ D I* D" L CCPTMRS0 &= 0X0F;
# x% ?. l( M. n: e( F0 ? & A2 N1 L8 c1 r( F
TRISG = 0;" F! s+ O( J2 d
}! t* ~# w+ S/ H N7 F; \$ h
9 a! G( w J- `) k }8 Q# I6 _1 W/*
/ X1 D$ y. H$ r' z; H- R- t*@Function 主任务函数# _6 H( L! n& B
*/* k% `; f( {! j
void Control_Task()
; U( S8 J. u, b- N- j2 c{- Y$ {4 ], x/ V+ j6 E
static uint Time ;$ Q( T, @- |: n0 f3 a5 T
// static uchar State = 0;3 a+ B1 F; ]* l4 t) O
static uint Record_Time;
9 g. x" q8 a+ |. l7 y/ O uint Delta_Time;
% F8 T# ]" T5 t6 P9 @5 z8 k% X) w / h" ?8 @5 E" i% m
if(State == 0) h" H1 e9 Z0 p/ O. P
{+ P7 q6 `! E- `! ]4 D/ `+ {
Time = 1000;
/ o; D _8 ^ v3 L State = 1;
* F& x1 S: v1 s# f0 o! r8 z* |! n) R& h T( h& ^+ F K7 r) _/ \
}
D u( U% s$ N8 H" x! T5 Z; Y if(State == 1)
( w, |7 \: M2 A+ N; w {
2 I" t( m# z- y7 e' z- \% N( [ PWM1(Time);3 B3 i) `9 A! }; ]/ M' c% x
PWM2(Time);
E* z2 X( w% M2 } 4 m7 I) m% T' H1 S( S0 M
Record_Time = cnt_1ms;
3 Z9 q) g! `/ h
5 ^" l% J+ n c& O State = 2;% P8 g* f8 k% j% b4 v. j( Q! |7 v# }
}% }+ d- W7 h$ Z% H! g& v; H7 u/ N
. o7 u0 ^ |0 S# s/ t% ^& d' T- ~
if(State == 2)
+ S3 @! S% a% A8 \9 p {1 Q" b* J* J9 a! _% y/ U5 `: @0 r
if (cnt_1ms < Record_Time)
1 D1 m2 Q( H3 O2 v* @( f {
, d8 g0 m' S! z Delta_Time = 65536 - Record_Time + cnt_1ms;
3 A# [- G( _4 I+ i- u' V" c }
' f8 S' `3 Q% A4 t else
- J9 _* ]! c/ M6 P) @! W {
7 @2 |+ i, }" H Delta_Time = cnt_1ms - Record_Time; ' a6 s0 d4 k. F1 [) k# _
}" V: } x7 k% C. f& Q, W
7 J0 ^: I" O$ o4 h9 _& _ if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
2 g# x' @( C- A3 I& ]. A f: K1 _ {& X/ @% ^# n- f% L
Time = Time - 100;3 b; l- z8 B5 `2 m
State = 1;; w. z3 B6 M9 r" ~* K2 b! Z8 M- O, q
( {8 m- N- m5 w( D: s
if(Time == 0)
+ t+ V( V0 E9 E: j# ] {# L! F& @, ^( j; z$ F
Time = 0;
& T' L, h6 P8 a2 {3 e! g State = 3;; S* B& g& D, g( {. b }
} E7 O! {' d* L. X- M: ~
}
$ h7 B! B: L/ M# ~ }
+ r8 }6 C. O; A2 s
1 Q, [" n! L1 y' {" j! f if(State == 3)9 ^' l3 s3 ]( N: ~" W2 _
{
# m) U6 o7 ^& C2 D PWM1(Time);
5 Z5 `0 Y0 J8 |- N% W, ` PWM2(Time);+ z7 o/ P# }. o! C& J% @( ^9 p8 q
, L6 U3 N8 h, {. V- _ Record_Time = cnt_1ms;
. d) i! J; V) T. ] + q: r" M; a# O6 l! ?4 P
State = 4;
+ `" E% o7 H# O6 I0 ^/ T' `, V3 X }
& o/ S( _3 h1 [$ D 2 w5 `& s6 M, s8 v
if(State == 4)
2 V# e% J, t' R1 k1 I {' V$ v7 T: r$ `- V; v1 j O
if (cnt_1ms < Record_Time)
, ?# w3 F6 w- _ B7 X% Z {. V" R" P. I0 K2 k% x
Delta_Time = 65536 - Record_Time + cnt_1ms;
+ r. E. Q# j3 I2 A' ^7 n& { }, o7 ?; O' O& C. h
else
2 j G2 O1 U/ h' E7 { {4 I0 G/ b% Y: [$ v: ^
Delta_Time = cnt_1ms - Record_Time; & ~2 `9 W& Z$ p7 ^
}0 C! o& [; {/ O2 q' C
h( Q3 I7 I( x5 B! i/ D2 {: P if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT5 p1 D; O* a ]+ S
{/ F* V6 E5 j( K' E1 Q8 q3 t% q
Time = Time + 100;) d3 X' P9 E Y% k, p* g( T
State = 3;
! g$ O7 n; T0 }. x
- _3 O2 X& S- p4 u: `; j if(Time == 1000)
Q* U7 i9 @( q' E& A0 C' Q {( \ E/ v; |# c. P
State = 0;
1 J z e6 X6 U( \6 R) y( B+ [ }' O: _4 l9 O4 y* [- L. x8 L9 u0 V
}
/ V% Z7 T' i8 l6 L5 h6 O; p6 X ` }
' C& a H) }2 M3 L# M! w; q) t}. U9 F6 D1 a! z
1 c2 Q) R: [: Zvoid interrupt ISR(void)% i& N' ~" N2 x+ H, o9 q
{
( Y2 Y T5 J# a: Q! B p* R# j if(TMR4IF == 1)8 F- N7 E% x5 b' C8 t
{
" z+ \/ I: ?& D% t5 _* l- C TMR4IF = 0;& o8 ` z3 c. u, I0 B3 h; M
cnt_1ms++;6 Y. E+ T! f5 L
' I4 i9 v' J6 [1 s9 D // LATF0 = !LATF0;
/ _" B- ?0 r( w% ^4 W1 L }
2 W, V& k+ K. B} |
|