|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
8 J6 j' j' ]' K) B
3 K* K$ I( R1 l4 `. |3 r: {/** B# `5 [1 x3 V ^! s
*@Name: PWM_led5 _- E$ ~1 j6 A. z
*@version 1.0
8 l# l3 d5 W, R8 D0 Y. C! Q*@Author xiaopan
1 m# V9 r( T d. r9 k6 j*@Date 2014.8.2
) z( y& x& ]6 e9 W*/* ]4 e2 T3 q5 ]( e; r2 O$ Y5 [# a
( l/ I. L& S0 Y q7 r M
#include<pic.h>, g# ]$ g0 e* B i, _: Z
#define uint unsigned int
# O# K5 w! Z7 k+ n# p: P* t6 W3 ]#define uchar unsigned char
- Q: e' N& r0 g
: ^, I2 g. |# E9 u4 X m# [#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 . D, ?7 o2 }* `& p
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 " T6 g8 e' V4 a! [: j/ ^
0 ]% D! F5 ]1 l/ t( X# R& z L
uint Time = 0;8 X; R) R7 k9 o2 {, b( c: `
uint cnt_1ms = 0;2 q2 o# p( a& s: A; `1 c! R; M/ I2 s. ?
uchar State = 0;
* v+ O/ s% M$ L6 K1 V5 T/ N; |3 b L! ~1 U# z
void GPIO_INIT();6 x8 b5 C4 V0 l. y1 O
void TIMER2_INIT();+ x- F( n$ T) K1 y e
void TIMER4_INIT();3 C* a' N& z+ n0 x9 ~" @
void PWM_INIT();* Z) `, I& ], U4 E+ D. ^
void Control_Task();
8 y S: K; A+ e3 v( w- i; S; g. \
4 `3 H7 l* {' U( R+ }/*
9 Q# W7 [0 g8 F; b1 I2 n6 A*@function 主函数0 T1 \# ~+ x1 C2 P" j/ {8 [
*/2 ]- A I" N1 t/ o
void main()
- y( h- h: k( [0 k{* c j2 R& h3 O- n* M
GPIO_INIT();
5 M( V/ ? j0 Q' ]: w& }! g# x PWM_INIT();4 h$ V, L' E( }$ x* r# W4 c) d* t
TIMER2_INIT(); //PWM利用TIMER2! j+ l+ A: ]5 v6 ~
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形0 c$ g6 @" q# F/ b- C1 G
while(1)
3 c8 D( @: e" L: E {+ m5 {+ a ~, [& R
Control_Task();
7 C0 Q f% R. u6 V4 U }# `, j+ ? \) v6 ^: N9 |
}
* N9 ~& b, u3 o B( {5 N! @/*& C3 Q; w' W" g
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
! i$ f9 o2 l, h) r; B. D" {9 n*/6 D3 O. L1 t3 {" m( E: H
void GPIO_INIT()) h) ` m8 f" J
{
! V; V `) {5 c( y6 q0 a% ^ TRISG = 0X00; //设置RG口为输出2 s3 X" h" W+ F6 _
ANSELG = 0; //设置RG口为数字量" M, V8 E* h" ? D+ m
LATG = 0; //设置RG口为低电平
* d; S& @4 R8 n" \
) H5 d4 k* `$ Z" G6 G" [5 n) L: R TRISF = 0;4 D. k8 q% N9 q" f
ANSELF = 0;3 E- |8 N- p( a4 X X4 |6 i/ J
LATF = 0;
% V% g1 I* {" P}: x! w0 j/ Q7 F$ A4 o
- s- n, o( E' d* B
/*( B: }. {8 R0 @/ `' j
*@定时器2初始化
8 F" H; ~7 u7 Q0 G*/
3 Q- T! f* D; n8 l5 Ovoid TIMER2_INIT()
+ t" G3 Y* N8 j: k# S+ M; F- f{
& O7 W( `" d0 x- |7 Z0 S1 v TMR2 = 0;! T" x/ ~5 K3 T& `% ^3 g
PR2 = 255; //255; E( N) g8 c4 [" G0 I2 x' v& n
, ~. ], s) Z% j1 w& I \
TMR2IF = 0;3 Y7 U( J% K. F/ }" k+ S
" Q5 o, U6 I' A6 f+ Y4 [. O. Q4 Q T2CKPS0 = 1; //13 I- ?/ y% I. v/ q
T2CKPS1 = 0; //0/ f. K# ?, U) \4 D8 d$ A4 V# I) V
, s' L! e, t6 \) k2 ~- s3 E
TMR2ON = 1;
7 _; A% _7 T% k" |}5 ~0 q- u, \9 j' Q1 z7 S @
9 p+ R4 f4 h4 R* J, W* `6 g
/*$ j$ ?1 H2 U/ r; Z. e0 u% f
*@定时器4初始化
# j. L! G* i$ U*/
+ f0 d! \, v- Q4 {0 H8 w. j3 s9 w+ ~void TIMER4_INIT(). W5 ~2 j; b$ p
{3 n4 e/ f7 i' j. {+ S
T4CON = 0x0e; //0000 11104 M9 N5 W$ M+ Y. T- b: K
# R/ f: x& x D( M, _5 a1 q TMR4IE = 1;
) B+ R; ^; I; z, b# P- U TMR4IF = 0;
4 d: r9 t5 `5 K7 [ f; p* C* t3 T+ \# V. ^! n0 V* U
TMR4 = 0X00;
! F" e! Y8 @" _* M1 t ; e+ B7 H, f |' @3 F' _" I
PEIE = 1;) u' O9 Y! ]! k# g
GIE = 1;
+ ^- g* p _- v}
$ G6 Y- U6 x8 |' j& p, [
# V9 b: `! P5 _5 L
# ^2 a$ U" r' F" @. \2 B. \/*
" f: {& l" l; F! m/ N' `*@ PWM初始化
$ H5 V' E5 T0 |0 J) }# s*// \ d7 E) W( l* K
void PWM_INIT()2 H6 l; m, u7 {4 f1 R9 I
{' ?5 n+ P$ G: ~/ r2 L$ ~4 u
CCP3CON = 0X0C;
) V' W- ^/ O& g/ I CCP4CON = 0X0C;
. n3 b# d: w" l' S: I3 K) ?% z9 n
9 [9 ~+ w% w6 Z3 y% B9 Z CCPTMRS0 &= 0X0F;9 S! b' ?' l3 O2 ^: n% e
0 O$ H6 J$ a/ h# a TRISG = 0;, t8 Y* }$ c( ?4 i
}3 E: `" d1 ]$ E' \* b
' Z; B( L' {: S
/*( Z4 n$ I" F( @, g) s, }
*@Function 主任务函数. O" \3 W: d- G' m, f5 Q% M
*/) q" n* B6 A9 J/ j4 b
void Control_Task()
+ [5 N6 ]: M' u) M! V{2 V1 N0 u- n" ?
static uint Time ;
* c4 U. A" | E9 b. q, \// static uchar State = 0;4 B- V# m) ^! B ]! O8 G% C
static uint Record_Time;/ t1 r) a! o& H/ h
uint Delta_Time;. L9 e+ \9 \) G: }
. F& A; Y. [' D
if(State == 0)
/ R$ W( k5 c( { e0 _% j% h {
$ G' n0 Q$ l' Y# G5 P0 b6 }+ S0 y- _ Time = 1000;
3 y0 V8 X! L6 c: V State = 1;! H& Q' M/ l2 ^+ C( o$ v% ^/ o
, {* f8 K, r+ Q: s! S }! A1 Y2 a" L* ?9 P% b) S; v
if(State == 1), `* K2 l! x+ F$ k g) |
{
. t ~ u i4 R, C9 t& u5 W$ t PWM1(Time);
) k* z; O" W! `* F3 T PWM2(Time);! z1 b5 m' \4 i0 R& d! Q7 N
, G( r- U, |# S- u Record_Time = cnt_1ms;: a! F9 I" A2 J" ^/ g: ?! L
( n v7 G5 ?1 R9 n# J6 H
State = 2;" B8 q3 _# \$ {2 b/ [+ O9 F
}! j5 q/ E8 g( _3 V2 g# ?
' W: I9 U8 {4 ?
if(State == 2)
1 ]( S, s) s& C& _( \ {
% @8 @! D1 h2 b if (cnt_1ms < Record_Time)
4 b; O# S) o8 g: \" U% S {6 O9 }+ Z5 c: {6 }, a" ?
Delta_Time = 65536 - Record_Time + cnt_1ms; 9 `. T5 s- F! b& u6 u* X
}
) U6 D; y% }! _. V; t0 B else
" W) D; g$ D8 K9 i! ~ {* v" r: _% H2 y
Delta_Time = cnt_1ms - Record_Time;
8 u6 ^7 A7 h7 b/ \3 \/ t8 f' c }
" C7 h/ t1 D; E# A' i0 ?. y* I
/ k$ O* c2 l" ]2 v; N, w+ k S* ^ if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT9 O6 H3 m# s/ }0 o$ k( a- J
{
; Q/ A( L6 y1 H# p Time = Time - 100;
" F) Z$ D0 v/ v% X State = 1;! G" H' Z+ |* b
! B9 H/ G- ~& n7 p+ t" n# Z
if(Time == 0)
# X5 x0 W) m6 T {
, a1 `/ I( B/ H4 @ Time = 0;4 `: A/ m1 X4 ^5 y
State = 3;. j) U! H2 G4 t3 v+ U; C8 T, d
}
5 X) z# B! P, M7 A, r: l" \ }
X, w8 E7 d5 ]4 a3 u# Z; J1 |9 T }
- X5 h5 o: C( X$ m
8 Z1 s! w# p2 Y! h if(State == 3)
& t3 W4 y/ o4 F7 N' A6 d; A {
# i' ]; { q3 \, B PWM1(Time);
5 O3 g' C S- l PWM2(Time);
* \- z5 i+ s- q7 [0 N* i5 M * Y' o& H' Q6 I Q" U8 q, S
Record_Time = cnt_1ms;
8 K- T" t9 m' O( S, U# ^+ f" t 4 [1 C6 [6 f& @# H: J8 e4 n
State = 4;
0 v8 T4 B/ G5 J4 R& K2 V }
/ v& Z$ W+ X& x& ? " L1 G9 `' u% M8 F& ~
if(State == 4) G: U: c$ q. I+ T" p: B* {$ E
{! |3 F- L9 b" J2 \3 M2 E0 V
if (cnt_1ms < Record_Time): p$ n |2 I; I$ r, W
{
2 E5 B6 {# U3 Q9 I6 k$ @ Delta_Time = 65536 - Record_Time + cnt_1ms;
; q! Y& u+ j: z+ n* g }0 s. P# _) k1 q7 c
else
, u0 |+ I: P3 V; r9 i6 J {
8 z+ G3 H' D3 y, m# y4 |! x( u( T Delta_Time = cnt_1ms - Record_Time; % N, j& y' v j. c9 Z) e
}
) x: a$ x1 {; S
9 f+ C/ g2 ?% x) S. I. C$ P4 w' }) y if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT1 P0 ]; u5 ?; D ~5 X, t4 E3 F
{
# x; G$ p" T( C3 }, j; g; D Time = Time + 100;
1 d0 m1 _. K0 o State = 3;3 |" q9 z; f2 p3 ? y( ~2 M8 p
/ S6 k& l4 c: [2 O; ] if(Time == 1000)
. N; A2 T( L0 ?- r& r* [4 j/ T) Y {2 t# ^* [# \9 x8 S, t
State = 0;
3 n! `, o; d8 F }
# {9 l( W# ^# V' S. I: t3 t }
' h: S+ o+ u5 x- Q, w& G% { }
$ s+ @, v! I0 o) D9 e) y}; E, q0 s9 f% _/ S& E2 v& D
# n1 i2 ^6 |7 q$ L1 d6 L# Q
void interrupt ISR(void)
* E7 ]9 |% F7 ]4 k$ ^{
3 G/ G4 E1 \' d8 w, K1 l if(TMR4IF == 1)
1 [, |( e: \+ x {4 F2 X7 ?- ^8 p/ o
TMR4IF = 0;
4 w, w+ r4 D5 n cnt_1ms++;% V' C V+ w/ i1 J+ y0 |
( K- f: c+ C& ^5 v // LATF0 = !LATF0;! A0 g* q: o1 S4 X2 M o% q
}
: _1 \) ~* ?, ^; z% a/ d; f/ D}
7 a' g( ?4 C e, P' C |
|