|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
3 r- a) X. K2 d9 L
; g4 i; ^. ?6 ^/ Z1 h7 z8 P/*
, @/ J& h7 v6 ~5 w5 O; l*@Name: PWM_led/ x: K2 {# P9 L( A; }) C5 |
*@version 1.0. Y& u3 m/ ?% G3 W: ~& w5 M
*@Author xiaopan
: d& l# r# v. p T" w0 X7 u*@Date 2014.8.2" s W( x6 c5 X/ O& n8 h4 B
*/
2 ~7 I) i6 {. G
9 p+ G4 n+ X1 a) p' M4 }#include<pic.h>
+ G, ]! z/ U& H#define uint unsigned int
! F/ C% w3 D. G. V: U) S) V$ f#define uchar unsigned char# Q7 X& s4 c) @& c( x
. ]8 G% x' I7 Q1 X' G/ M8 c#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
* e' U( Y2 {; e" j! }7 S#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
( v* C% o7 M0 l/ I
$ G2 Y# j( `# r6 ruint Time = 0;
% ?* W1 M4 ]! m: |8 z0 _0 ^+ {uint cnt_1ms = 0;- ^1 V# ^8 {: R2 f6 y
uchar State = 0;
4 t+ h. L$ v0 N
5 U5 l9 `1 I: }& s% qvoid GPIO_INIT();1 G* B/ T/ A. Y2 r7 N) @ }8 ?
void TIMER2_INIT();
7 g( F9 i; I' w$ L7 D% p( gvoid TIMER4_INIT();
% P C" d5 w0 ~% v; _7 c1 L0 V- Bvoid PWM_INIT();
, M8 ?+ P' c3 J" T& @6 d4 d! p9 X2 svoid Control_Task();$ y! l5 M! ^" {3 M
( @8 M: y- v0 P! E9 L
/*
' r H: x2 _- J! H*@function 主函数" q9 `/ P% z: h4 C# R* t
*/2 C; N! G0 t" H! H
void main()( ?, a- A5 c0 `, O" f% g: A+ P
{
4 G: P& ^2 }6 }1 Q' n GPIO_INIT();' Y# @6 Q, x/ f f4 x: T
PWM_INIT();' d& z8 d# z/ A. m0 ]9 q6 _
TIMER2_INIT(); //PWM利用TIMER2
4 Z6 d7 M) B6 t0 K5 b; j B( O TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形( _, R: \3 J: B& v+ h
while(1)
% ?' Y$ k) x' X' W {9 i; K) O+ U* I9 z/ u
Control_Task();
' s, U( s( q* S# Y }+ e) b% o) n+ N, q! N
}
$ g$ H( j* q% ]6 x, J/*8 I: x; n, f- ~
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
3 a1 C' Y# t, ^3 U" b# z*/
) y9 L# @+ m* I4 w) h1 q% Lvoid GPIO_INIT(), B9 {7 ~7 L( \6 X# P' q5 ?; Y/ D
{
3 M- j0 R! O9 Y' i; X5 a5 l TRISG = 0X00; //设置RG口为输出2 `/ I9 j9 H+ ?! v' f
ANSELG = 0; //设置RG口为数字量5 L) v2 F6 {8 H, P9 `
LATG = 0; //设置RG口为低电平
3 {3 O; O% |, H& a
! i. v3 A& L4 H5 z6 P1 x# @ TRISF = 0;5 k0 v5 m7 R( X) B$ X% b6 k( S: t
ANSELF = 0;
% r6 y/ G0 s/ R/ v: n3 ?/ Z l LATF = 0;
0 {. Y H! Y: `3 u% N8 b}
" T+ U, D$ O* E4 a& D
% ~" f; z M4 }/*7 e& E; @. l( w9 L, A) Z% ~
*@定时器2初始化7 ?& r. X& \" }- d
*/
. m: r4 Q# A7 s6 j/ H2 l- Uvoid TIMER2_INIT()* D& T" E5 {# X2 o0 U. i" }1 N
{
( }, m- T o3 p* h* \5 m2 H1 r' k TMR2 = 0;' `$ _' ]! j7 s8 q; G V! {6 J
PR2 = 255; //255! O8 v( K) F' A+ Y- y0 L. u9 r2 R3 D
6 ? U( O, @1 \. \+ x5 f% p: T TMR2IF = 0;
6 F4 B) @9 E+ D- M6 p
6 ^3 G, `6 n7 I+ ^/ {" ]9 ~ T2CKPS0 = 1; //1
9 F; V7 Q/ C& t% p# h- s T2CKPS1 = 0; //04 [4 f' m7 w' ]9 g' a. O" {
7 p; G$ B3 p5 x8 n: f. L TMR2ON = 1; # S$ M" J9 n! ?* w% I1 v
}, ~, `4 C' s5 b; i
$ v6 {& F$ l4 H' X4 r" W
/*
( T% p( A" w; \' [' r9 l+ P*@定时器4初始化
1 c: F6 r" c0 d" S*/
( H( q+ Q* t, cvoid TIMER4_INIT()
1 q3 l: C, c% N$ t' J# I* `{# B7 b4 ~2 O2 g# x6 I' f
T4CON = 0x0e; //0000 1110( ]/ Y* f1 K1 M8 t0 {9 p$ F: U
2 w2 u- ?% q& y: {) P Y) ?5 ` TMR4IE = 1;4 U8 i4 M$ B' O) \0 E# H
TMR4IF = 0;
6 ^/ w' ^4 A1 \7 q2 t3 ]- |2 L, m3 Y8 B# C" _) |
TMR4 = 0X00;, H/ ]! E) n# C. V' J6 ]9 S0 h
' |. h3 p1 e8 D& W
PEIE = 1;5 `1 p) |2 h' p; E+ E% V
GIE = 1;
) ~9 W) g/ `! }: R# u}
1 G( ]% `3 J6 \ y n
: O$ @/ O: r! Q+ Z: c6 |! S* V& G4 P6 d4 b, n! v/ f
/*
6 K! O, L1 Y _8 t8 n9 n: a, ~" A*@ PWM初始化
R$ @. p3 j. t2 A' c*/
; n3 m: C* H; S1 ?) e) z( p1 hvoid PWM_INIT()
# N* C5 X$ _$ \4 N. c{9 i# _; V" k8 X" n$ t! P) j
CCP3CON = 0X0C;: }9 G. w: X2 A
CCP4CON = 0X0C;9 ^! ^+ V. B5 D- Z( i, t
: J' j# g# ~8 X CCPTMRS0 &= 0X0F;
( m( y2 [& Y/ Z+ j% w' d ! b2 _* n% @7 Y- ~, ?" u
TRISG = 0;
4 [1 B& d0 G4 z5 l/ J8 l5 f}* d5 V- X: k' e3 i
% h/ r+ G9 Z4 i4 r
/*
$ w. P) O8 @. v ~) R9 Q( m*@Function 主任务函数
+ p% e- y5 _& n& p" [*/" R. n1 v# u- [6 E
void Control_Task()' y4 Q) o+ w/ N
{8 {) t, M: X$ f. V
static uint Time ;' S% M1 ^! x! W: p; l9 f1 E8 Y! E
// static uchar State = 0;% ^: L' \7 E8 M4 E
static uint Record_Time;& m$ @" U8 e! m: X
uint Delta_Time;7 C/ e+ v- u9 H6 \7 b0 v
$ g) U' Y2 R3 B if(State == 0)
: |8 n1 Q q$ G8 }" Y# M* G R {! B2 E' X/ I$ [) `5 J! p5 n* e3 b
Time = 1000;
9 p" l$ i$ Q& M. a8 n" p3 ?. j. g2 R0 P State = 1;
% u' l! m9 D8 t V
2 @9 {, s% k; Q; I" M }% a. [/ E4 T( g# \ y8 l
if(State == 1)0 C' i/ n" s5 @7 C& q2 \* s5 p* @
{
7 P* y7 i0 T- }, w& s- i PWM1(Time);2 C/ D3 J3 Q& }% B- K3 f* U. a
PWM2(Time);1 T H4 L7 W/ P5 x+ W7 U0 ^
# Q+ R2 h/ \/ b Record_Time = cnt_1ms;# @$ n2 Y! R; `" e; \. M2 D3 L
4 K A5 I' M3 I- ~6 M& p. e0 n
State = 2;
$ L# a5 B3 O3 k }
+ {+ s& R5 v4 o7 h& t w1 | E5 }
( R' h! Z' ]1 W if(State == 2)" p- b/ d' v9 c. P s
{, o7 R5 R4 P0 J0 M* Z( m
if (cnt_1ms < Record_Time)
# V1 Z$ v3 |& L( b2 x/ C2 w- S {6 w! ^$ ~ @' p0 [2 G, @
Delta_Time = 65536 - Record_Time + cnt_1ms;
- @& q3 g/ M( e7 l* {5 B, d3 i }
" R3 j7 B6 |: C2 ^ C+ t; g; F. ^ else
7 s% B+ N* L" ^ {9 n6 ] H4 Q" x) t. O; g' z% N4 T
Delta_Time = cnt_1ms - Record_Time; * D# d% p0 E2 ?. `: G2 @; P
}
: ^ ]5 {. D9 J# o
1 C. X) S& j7 t% ?/ I6 r if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT" E0 K; H5 p' z8 R; \ x
{
2 C* a' t2 U% C' Y6 B" P- ? Time = Time - 100;
# R. c; m( N5 g+ r State = 1;
4 B3 C5 A+ t* W' h2 C2 u1 X+ g ! S$ P& n" f! y/ B9 }9 w
if(Time == 0)
& f( f- Q/ l8 h {2 G, S/ W0 c( n% E/ J
Time = 0;- d8 s# Q% y/ n/ |3 @6 }: L
State = 3;
: D, d5 q0 H$ t$ c& B }
+ d2 ^# T* I# i& Z }
( E) A5 i: k4 ?7 E- r2 S }8 K! F5 H2 H1 M
: [) {8 y. @0 D, @8 O7 t
if(State == 3)6 r5 }% w. ]/ | y5 L$ t. }
{
, B% P- m. I2 d/ R7 j& ]# ^ PWM1(Time);3 l, k1 F4 G8 g, ?/ w& E. V3 P
PWM2(Time);
( p2 h# s. i1 ~( h( | " J# Z. d4 L8 U& B6 L
Record_Time = cnt_1ms;
S+ Y# }8 u% E- P* g' o) S F ) N! Y- O8 N) w* J8 d: r3 V
State = 4;
$ V! l" b" X: D% p& E8 j' l8 [! H }; v/ y& a& }% D7 h: g9 Q
# s/ L* W1 |1 o/ _) d% T% k8 A if(State == 4)
% h. e5 @, V9 v6 N3 o {. a0 K: @- |; O* A7 U6 f; o
if (cnt_1ms < Record_Time)1 l* K9 H* B4 p5 ?
{
J2 e; {6 V3 x/ v8 h, Q0 y Delta_Time = 65536 - Record_Time + cnt_1ms;
' H( g/ g9 E* Z* `) e+ }. N9 v }
: x5 X* o5 R |1 }0 `8 I else
9 n3 b0 i; `' F# u {
# H+ k5 k5 w3 n# p5 k' _ Delta_Time = cnt_1ms - Record_Time; + n3 e9 v* Y+ v! w8 J
}5 V- Q; y# l3 h3 K# r* B
9 p2 |: `( z2 m if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT5 Y i7 O3 H- j+ Z8 G( B5 V
{ y4 c% h, W& y8 X0 s1 o
Time = Time + 100;# {$ r+ O0 I2 t
State = 3;7 n4 s V/ D8 n. u; f
: ~9 q; n5 V8 y$ E if(Time == 1000)
o( V, G- O1 w {
( ?4 u- W- y/ D3 W( D1 } State = 0;$ p( k# I6 r& p- U. y+ g. i1 D
}
/ D) C7 F7 E/ b7 ]9 o }; z9 a ]; `8 O3 [( c4 Q3 s* L7 t' Y
}
- y- M- ~) o5 J}9 ?$ }6 F7 I; N8 V& k# d" u0 |" }
. S& W1 |3 [0 ^6 m; ~7 T o
void interrupt ISR(void)4 S- c( T, w l$ ~8 D
{
* B$ U' L/ d. ` if(TMR4IF == 1)! B9 N$ _ v( ?( Q# W
{
) f+ D1 C/ p2 `* y TMR4IF = 0;
4 E3 F- X2 ~- b( v cnt_1ms++;/ Y! V K3 o) H7 K
# U' m2 p$ {- v$ H8 ~
// LATF0 = !LATF0;
1 P! a* d/ f& i } & D) F6 B9 g6 b* Z4 E2 `
}
$ O- M' {" ]* n) q' L) h8 d1 h |
|