|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
# e3 \8 d4 ?" x5 `( u# C( b1 C. U: R' I
/*
( e. T0 n: }, M*@Name: PWM_led; }8 X( N; x7 r6 V' v
*@version 1.0
& N' R! O- Y: p$ A2 d C) ]' n*@Author xiaopan1 O! ^) `# {" B9 I: I
*@Date 2014.8.2
( T) u: z' {, ?5 N" F/ E; w% f, P3 ]$ j*/7 X" w) T+ S: s% |7 D% I
" O( V" o7 W$ r+ F/ n- v
#include<pic.h>3 l( h2 ~' n- F% S3 |& G" I0 S3 L E
#define uint unsigned int 3 e' E3 {9 [# \8 L
#define uchar unsigned char
3 {- m ?/ L5 K* U) ^9 \+ X7 T, Z" L( U' W0 J2 ]( ]
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 & [( v4 p* I$ v0 L* V C6 l0 O
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 + u' v7 e: Q- z
) H& _( W- }/ o2 U, q7 @uint Time = 0;4 M% {; A- {& V
uint cnt_1ms = 0;' s. F1 y4 s/ T: d b
uchar State = 0;) b! |3 k, _8 Y6 n
- J2 H7 V0 F2 q; w
void GPIO_INIT();
3 z( K4 f( D* _5 \8 ^; ~$ ~( ^void TIMER2_INIT(); p4 |! F' Y+ l, k6 |$ k( r7 |
void TIMER4_INIT();
2 h2 M6 K; _8 S5 A. Pvoid PWM_INIT();
5 _) s. x% u2 ^$ W' `void Control_Task();
8 T9 n) P3 R3 H0 p
$ j6 q* n* K7 t3 ~' c7 i/*" m# G1 }9 j m4 g
*@function 主函数8 W- y8 S! ?. s. ^3 G. r8 I
*/5 p' V1 k. v" g3 ]
void main()% O! @3 q* M# x( W' ^8 s
{9 K; v) s7 X4 v' r
GPIO_INIT();8 j2 B: A; R2 x$ B
PWM_INIT();" z9 g8 A% D& e( D1 h
TIMER2_INIT(); //PWM利用TIMER21 c1 J' j9 \6 {: X
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
/ @0 O8 G9 z5 J# e& `: C! H while(1)
: |( J( Z$ o9 Y* E {& v* j, `8 A! F9 f u3 E
Control_Task();4 Y: d$ `. C8 | O4 ]
}8 l0 Z; q4 q# m+ L* x3 E0 ]
}
2 ]5 `) d% U; Z6 A" `4 o/*% I. B: J. u/ j V3 R; r
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
- x- c7 Q e+ Z: n: f) |4 L( ?*/$ a% I% N. g4 {
void GPIO_INIT()' P' G1 w* n% t* t: t/ M. @7 f
{
, h* F' e6 F1 l. T; A1 c$ x% U% a& t TRISG = 0X00; //设置RG口为输出
( X! ]4 h! W' H E ANSELG = 0; //设置RG口为数字量; }' ?6 B2 O5 W
LATG = 0; //设置RG口为低电平
8 l1 J2 n' U1 I( Z: A/ V
) J' n2 M3 q9 [. v8 N r! J TRISF = 0;
$ i1 q3 u6 Z* J! V ANSELF = 0;
8 i5 g7 Q$ ]8 l% g# H LATF = 0;
; A9 I9 _2 d3 p2 n9 i1 J5 S/ I}
7 E; h5 N* Q5 w( X* A8 A4 ]3 M2 U6 \' v, n
/*' L! T5 H7 r- g: J) |( O
*@定时器2初始化5 q3 k" |2 D: `& @
*/0 p& c. M( J( C4 G+ [9 m
void TIMER2_INIT()" k/ Q. p+ O6 ^( n' r9 ^
{2 _8 g4 U Y4 N' q2 [
TMR2 = 0;
, P& |, e4 r; f0 z8 i PR2 = 255; //2556 A: x+ }, F$ T0 K9 _! V1 i9 I
! T) [) |3 Z* `$ U% k: j TMR2IF = 0;
7 `3 v0 {% ~' I+ ~
* j: m& ]8 f( V$ A0 W" B Q T2CKPS0 = 1; //1
' F5 @# D8 Q. [4 K5 J7 ^/ {4 @5 T T2CKPS1 = 0; //0! Q/ M% L$ r- I" T
" `: L, H& {) c$ m
TMR2ON = 1;
+ i1 D6 w0 j, h}
3 `) x9 g, ]: j1 K$ n4 o \: X
) `8 X$ I- ]: ^8 ^- D" O( h/*2 u( m2 T2 M1 b
*@定时器4初始化
6 l. b/ J, ^; w, ?6 W. L*/0 W3 A' {4 z0 Q: e
void TIMER4_INIT()3 C: [& A. J1 M
{
5 _, E& V( ~- @; ^0 Z$ Y' b T4CON = 0x0e; //0000 1110
" W+ b! l( ?$ K9 C7 W" l7 R8 k5 l* n& B( _* r, i1 p) e
TMR4IE = 1;
4 t2 _, O4 j. m0 p0 h TMR4IF = 0;
( y* t0 t6 l& X- m& I U' E8 U
2 E- I5 {! l' w/ v+ K TMR4 = 0X00;9 _( I7 N0 \! h5 R
9 O7 _+ x) o: [7 b PEIE = 1;. a5 e1 D3 y+ a; L! ] [
GIE = 1;
+ Q2 ~, |; g% B% i& L}8 }8 k+ k, x6 E
7 E; G; ] } B$ L' n
. t7 x s) i* ~# C/ Q/** _5 z {, T0 D! N0 X; R1 O
*@ PWM初始化7 ]5 s' p" ]* u2 U4 C
*/1 ]. Z, W7 K/ s+ l! {( @( O) ~
void PWM_INIT()
7 ?7 @$ ~$ t4 G, d0 d{
% ]5 _6 v) Z) k. |& x# S( p* w! c CCP3CON = 0X0C;- L# o3 O/ d. N- A M# R
CCP4CON = 0X0C;
2 P) z6 z3 b T5 a8 b 5 J9 `3 Z- L4 t' O4 @$ W
CCPTMRS0 &= 0X0F;
% e) B/ t4 A6 | ' e. p" P+ X0 V
TRISG = 0;; ~4 ~7 Z- L9 { g) x
}; ~( i8 \2 U" \# @) N3 b) `( E
" S2 I0 @- d' n9 a" A$ P( Q+ Y, x3 M$ u/*- o8 O& S; V* r* q# n! U
*@Function 主任务函数
# l3 O( a# X4 ~; G% e1 o7 e*/
E$ u" q" N8 v# n- W0 x5 k& Tvoid Control_Task()+ P' F' Y" e0 Z, l) I' o) m
{
+ L8 Q+ B/ }. `& K5 ?# ` static uint Time ;( `# E+ J; G" v. ^: ?, M R: x
// static uchar State = 0;
& ^0 s& t$ ~: c% C static uint Record_Time;
4 G6 S! f, E6 f' F) A/ b& I uint Delta_Time;
1 P' V' y7 b9 b, x" T$ I& F
2 Y& _) f# K$ C# G7 e if(State == 0)
* g5 G$ Q3 J( u% l7 t {
* N9 {9 J/ l% C% k" }* D3 G Time = 1000;
. ?: z* @' u0 m! F& K7 r1 R0 R N1 | State = 1;
7 _% s D5 c& Q8 r/ A; x' |2 _+ S
0 W. y: B+ m: K. t: H5 _ }
/ \+ T) E; v! W9 S6 j9 z if(State == 1)
, I6 H, e3 m+ S, m9 Y {
# [9 ^- R1 U6 h1 X( l PWM1(Time);
; N l, ?. P1 P% ~ PWM2(Time);9 `: g* d' R' W# v
# A: V( w, n: k Record_Time = cnt_1ms;
6 G" B# d9 y2 Q& s
! b. l% p6 m$ L$ _- X0 F# c j" |# j State = 2;' ~" k+ B6 c8 \4 ^ l! ~
}
# o3 g- a! H6 H ) C9 C6 }9 { I" T* O2 M4 b
if(State == 2)
# l) q: f$ k; r" c4 e0 T {
2 w, p$ u6 N& r m& } if (cnt_1ms < Record_Time)
0 a" a7 \2 u8 y9 A: g$ u Q/ M {
1 Z% j5 _+ k' @7 A Delta_Time = 65536 - Record_Time + cnt_1ms;
6 b3 a: ?& A6 E2 i! d1 e& f }; R5 b* i) ^. G! w$ j
else7 Y7 \! W) D7 `7 E
{
& M! y+ @% D( E. d3 T! }* J$ r2 _ Delta_Time = cnt_1ms - Record_Time;
. ], d' f4 a2 w0 j }
! H1 K9 f' X. z/ k) h3 J2 s; P3 y" j
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
" p0 [0 @" A4 R3 i+ X% O( m {
* w2 ?4 M" x4 o1 ~' X7 D' f Time = Time - 100;) g s4 F9 l# @4 Q2 f2 x" o9 T, v6 x
State = 1;
* ^ n/ f* h; b2 [1 p. I
0 ?9 c/ F0 i v* |9 u( K if(Time == 0)
8 H ~5 M+ P1 O& D( r {6 a2 i( }$ H7 ?8 E6 o
Time = 0;
& _4 `3 o1 @& @3 j- F/ z. u State = 3;
' ^: `2 y( y: m5 u- Q }% g4 f/ @; w% i _" ]
}
9 l5 E n! K( J, e }
, S. L, o, l$ B+ a0 _, g- n ; M0 T5 W/ P! d1 G, D; @
if(State == 3)
d0 C9 C- G3 [/ h& D; ? {7 M: K$ R0 q; z2 y3 ^' I
PWM1(Time);" ^2 b' B W7 B: {6 @ N z& G
PWM2(Time);. |% y/ U' V% J
' d9 J" d4 M/ N/ i; T/ d8 u5 U Record_Time = cnt_1ms;
- A% w/ T! `% X* r; D& g8 v2 _
6 A H8 A6 g- W& s$ T0 H$ [- X State = 4;0 `' Q6 C; B4 f. k: z
}
+ _" S8 }; { p3 k+ Q1 _ " W1 i( y% |3 C
if(State == 4)0 I) ~! H2 b7 \2 a6 ?2 ?7 N' O, o
{) t" m; p# B4 [5 |9 f
if (cnt_1ms < Record_Time)/ J; e3 X* u4 _5 n
{
: O# [, l$ O6 ~2 j7 ]6 e6 @ Delta_Time = 65536 - Record_Time + cnt_1ms;
! N0 e7 i+ L$ W( t }* u5 ?) D5 Z8 k- x- p5 }: K8 L' ]
else
1 [7 z& d2 t) S9 @$ X {
1 Q7 N4 U" p; ?* V' D" X& H V Delta_Time = cnt_1ms - Record_Time; % r. w0 M+ A3 Y. }& l
}" ] ]9 g9 n5 b/ }, q/ B
# m) p% D+ ^% w6 \( a if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT7 q8 A! y5 }2 h, X3 p$ I1 s! J
{& k! V4 Y" G( X" P1 e
Time = Time + 100;
4 \$ D0 p! o2 a0 [: X" d State = 3;
( D! [3 l3 D1 U$ h% {
+ E7 T7 k( m5 f/ R0 Y if(Time == 1000), q2 L: V6 S4 q
{" e* h2 Z, Y; v, g) u$ Y, @4 [8 V+ E
State = 0;; I% @3 r4 l0 K% P; b
}9 B5 |; l/ D, G# W5 Q& }* W! O
}) M# _8 H1 X; {3 \
}
! {" F7 j- Q8 Q! }& `3 X( H8 f' F}: U! a- T9 r; a/ `. w A
7 r7 w3 [' F0 G' O5 C. uvoid interrupt ISR(void)1 J) ]# H1 ~3 Q/ a
{
_4 E7 B* W% B3 G1 ^0 d if(TMR4IF == 1)% c4 d9 ~+ u4 M
{
6 g6 I1 V3 s* i) P$ p: g TMR4IF = 0;( n2 G: Y# s$ I, ^
cnt_1ms++;
: [0 v, `+ i3 Y9 q' y" @
9 n* M3 o% x+ b+ P5 O8 F) r C // LATF0 = !LATF0;: V" X/ R# L/ Z: C
}
& p) v- U4 A4 l4 C: h}$ @. P/ ~4 ~* m1 F3 U& }2 g; k
|
|