|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
6 [( v- E0 u( q3 {1 D" k2 S
& ~- K7 w! h2 C, _4 |, h/*
1 s5 W9 Y& S8 e( q8 S& X+ K( d$ Z; k7 g4 g*@Name: PWM_led
/ G) M( _0 {; ]) A*@version 1.01 @' p. s n I7 @, t
*@Author xiaopan
% [- n5 u$ G+ n5 C# Z6 N2 P$ U, k. M*@Date 2014.8.2
' n! `3 U) w$ i1 ?*/; g4 N& X$ x" K2 S0 {
, E0 Y6 Z$ n# H2 a4 m! _3 Y
#include<pic.h>
5 w1 a8 s X8 `7 w$ A#define uint unsigned int + l' }: F' a0 [- v% c6 j9 |
#define uchar unsigned char
+ X# _- h3 I5 q
' }. H3 |7 R4 v7 Z+ o3 d#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 $ V' W6 W; w& o1 U8 E+ g
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
3 R4 {' S4 f1 b+ ^3 O
4 T9 d% T! x0 W% _* W! Tuint Time = 0;
. J$ f: u( }* _8 A4 Vuint cnt_1ms = 0;3 p+ e8 F! Y) I
uchar State = 0;6 x6 o8 Q6 X$ E5 Y: O
# ~! {1 b: ]; b
void GPIO_INIT();& `- o+ B: O1 N! M! i1 r N
void TIMER2_INIT();
3 |4 G% _2 T& E' p. _' Bvoid TIMER4_INIT();
* |" h" U9 o" j/ Z' t/ n( q% Xvoid PWM_INIT();, m6 c3 [ a- v" H2 o/ n- }
void Control_Task();) E9 X. x- p( T. l ]; y6 n
- T ]% P ?( W8 t: A- H" Y8 s1 T/*
) q4 H4 V5 D8 w* }*@function 主函数
% `5 T) n1 W% a4 {" ~*/7 P- Y+ P/ j( i! ]
void main(); w6 T1 `( k& V. `3 N; M
{
( ^1 q2 h* j& l4 S) Q, P* A C GPIO_INIT();
7 d! n7 S* ]) h, ]: o7 w8 G( l PWM_INIT();9 F- v& [$ V) z+ q _* Z% U% [
TIMER2_INIT(); //PWM利用TIMER2" O2 a( F! [" Q
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形* c8 y& x" f% g* b! d) U) @
while(1)
$ F7 G6 \+ x6 `- B! E1 p0 m3 d {
$ t2 n. R4 {* [; o' F, b Control_Task();( _, g# w8 i& A/ W, }% ^
}
9 w( |4 o* I1 |8 q1 L0 r T, Z}
* T! @" Q3 @- S) E5 P4 b/*
! b+ h* [, k9 E* J- @* R$ M*@Function IO口初始化 RG0 CCP3 RG3 CCP4
6 T, v9 a8 k+ y# c0 i5 l*/
, C6 j, q) u" U; Zvoid GPIO_INIT()' o/ @3 U. l8 u7 ~9 m `7 B) N
{
1 u! d; P: Z: ^: f$ _( J' O, R TRISG = 0X00; //设置RG口为输出
+ }# M( m$ s5 w& L ANSELG = 0; //设置RG口为数字量5 ]2 N9 `4 H, P' j; N
LATG = 0; //设置RG口为低电平
- F; I# B" F, ^' z & y/ Y7 c. i! u: K6 n; h
TRISF = 0;: H1 K' y; A/ e# a }6 Q
ANSELF = 0;
2 u. G" K* d8 f, x7 U& s! ?0 d) b LATF = 0;
! a1 }: \& X& o! W+ Y2 H}, E1 n( v7 M+ l. k* B: q
2 g9 X7 P: G2 b# g( r. h, K
/*
( W9 d& R: C s2 b, i! t" G% b*@定时器2初始化/ J. D. s3 `8 t' l; I! y. c
*/
9 A" \1 N9 P- m. x. yvoid TIMER2_INIT()
1 c' ]6 H( G' j3 ?3 [! X{5 |/ [/ S, B0 l# _/ T
TMR2 = 0;
8 Y+ t( \$ u1 k" w4 ~ PR2 = 255; //255! _; t+ J4 p" d3 w$ _! _. C
: ^; ~8 \9 b( ]4 E4 s3 F5 f) A
TMR2IF = 0;
# L) f" i% t& t9 C5 F' N
0 ]" N: W) n. g' A+ C T2CKPS0 = 1; //1
d8 m) E$ z0 o2 r" L& `2 P T2CKPS1 = 0; //06 g! c9 L, ^$ b# J) ]* b. Z
5 E+ z8 {7 P |/ Q: a TMR2ON = 1; 6 a) V: P9 i* l6 d! O
}: Q& B7 I6 B9 F: l/ C( e
0 \) \3 ^, i( J. T7 g- Z* P' {/*; f2 {8 v0 Y- y& O2 m, j+ R0 f1 I& _
*@定时器4初始化# `# K# Q u( a
*/
9 _3 ]) r; ?( f$ }3 ^$ Y& tvoid TIMER4_INIT()
; A( H9 n) n! x% m* V; ~7 z{
3 z9 X$ ^3 j" {1 ~/ V# ` T4CON = 0x0e; //0000 1110$ L# c1 u( k+ D. K6 V* V
) p6 o4 q/ ?+ z V! g) p) w
TMR4IE = 1;
7 a% p- G8 R9 e- B. Y TMR4IF = 0; $ u! [: e" g8 g l4 O( k5 S1 O' B; t
3 L; s) [7 J- E6 S/ ~4 ~+ R) x TMR4 = 0X00;
7 M+ N5 n2 @" i7 _, w. X
4 V& P$ W0 X6 }( Z/ e" H PEIE = 1;
( n7 L' `, R/ o6 P0 U GIE = 1;) s1 i; k/ {7 j
}! V' {1 ^8 N" ~- C, h$ f# a
" R2 n1 ]: Y. W1 d
6 T- c6 G: F6 k/*
! f1 F7 m/ x9 s*@ PWM初始化- A0 Y6 h9 t3 v* ]! {
*/
. S. O: _3 N# R9 B6 V& Dvoid PWM_INIT()" z4 q# A3 C! y. R; E+ x
{
+ g+ A& w, C/ |- n% h/ W CCP3CON = 0X0C;
8 y2 T4 p2 _7 ~$ N# v. S CCP4CON = 0X0C;3 A' h5 j9 Z* W
* m; O/ X1 }3 }0 v+ q: n
CCPTMRS0 &= 0X0F;
! c' F8 M, N# ~' j& l/ O5 j
) ]4 `5 M8 s$ C/ z8 d TRISG = 0;4 e o; Z# O, b) p6 U% y. V/ M
}% e- S' |7 [: j! D
6 p# r9 Z" E9 B4 Y+ a$ |# m
/*4 C) r1 p! g3 f# D5 B$ r
*@Function 主任务函数6 f8 k8 \# V7 G6 w
*/, r8 l" y/ a. G7 p+ r
void Control_Task()9 Y& g: A3 {( y6 ^* Z
{
: Y! U! h% v8 P! P) m* s static uint Time ;# q8 W7 H9 F4 R. A) L
// static uchar State = 0;
, z( _7 K! ]8 u4 X( X8 P static uint Record_Time;
( U- N0 @3 c( t9 X uint Delta_Time;
- a2 v0 Q# X+ D% [! z( M5 N
, F$ ~0 Q! F2 }$ M) B5 p/ ^ if(State == 0)/ w. W* c0 X- R' M6 |. H& y. I
{
0 x, [5 |' i0 i' k4 A | Time = 1000;# I- N5 _2 v8 j1 k3 g( [6 |
State = 1;5 |0 C2 v! J6 z+ Z
! T2 d8 }# t. A' Z6 U }1 t9 [9 R1 M' W1 o
if(State == 1) G' [. O, w* I! E& l* {
{0 }- Z' r' V0 m/ Q/ i
PWM1(Time);4 j, }; o# _+ l/ q# b8 e j' A" a7 J
PWM2(Time);3 W5 s0 u! ]) c# r
' y3 O' y {1 |1 s3 a Record_Time = cnt_1ms;! D: f0 v. l2 g# n0 B+ `4 i
2 |: G' X! K! y State = 2;# X" G o* J2 y- ^% A
}
( s* t6 m4 P/ D- k : i+ E: v+ J+ |. V' s
if(State == 2): o+ i. a8 e1 w* F, }; K2 }6 c% m% N# I
{
5 Y9 K% J9 t! w9 K( H if (cnt_1ms < Record_Time)0 c( }$ n3 y- i! `$ L
{0 E8 R H, E$ M h/ T
Delta_Time = 65536 - Record_Time + cnt_1ms; % r" b) U3 X& o
}7 T( Y: U7 D( R$ `: n+ P' X% D
else9 f7 @( \( F2 |' d- L
{
* |9 @/ x6 l; C3 o( p, P% Q Delta_Time = cnt_1ms - Record_Time;
3 T7 X; x0 l2 Z9 \- G' P8 A }
* i! z; v7 T4 ], I* N5 m7 [3 Z# p* D8 G- ~+ g
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT% u# s4 S( T* l. ?) V& L* f
{5 a y0 i/ @0 N, F' P
Time = Time - 100;
( O- t5 F/ B9 _; U: ]& F* S State = 1;, _; X* E! `; R
- B6 \" i* [ Z: N% y. J) k8 X
if(Time == 0)
) s/ q( w' s# T) P3 p4 Q! q {
5 d- m0 [0 G2 O4 j" l" c0 b4 h/ r Time = 0;0 d" x0 ~5 O6 f5 L% T* q' ^1 n, ]
State = 3;
% s* e7 [' U' G% `0 V4 J- g }0 ~7 p1 x( j$ j. a. r) t
}/ g! d' S, i( Y; A, Z1 T" q" C+ |" U
}. D3 p: G9 x5 B0 r
. m4 k# E& ]$ m1 Z/ a# r/ h if(State == 3)
+ ~2 k1 a! R! I; c8 ^% O, i {- i1 g8 G# P7 ^2 ~1 p1 u
PWM1(Time);
- \3 p0 B* z& p2 P4 J PWM2(Time);
; B' K- Y. W% d3 w- M( Z4 y % Z, z) Y. ]: _# y! k. O
Record_Time = cnt_1ms;' W# x. e; {7 T8 _5 p
# ^1 k+ j1 q% Q' W7 n# ^$ W1 W" i! V State = 4;
3 T+ r, x/ h( b0 ^; W3 b$ n }, ^" |7 A! P9 y, q2 e, t. l
0 P+ A. {* Z) X$ E) y3 M. ] if(State == 4)" b* A; b% H( V7 C1 e7 H
{- B& N A3 H1 V" b0 W- ?0 ]0 ~& ^$ K
if (cnt_1ms < Record_Time)
@) [$ k: Y+ \2 P {/ o/ N: B& g* s4 [% ^
Delta_Time = 65536 - Record_Time + cnt_1ms;
8 a. N2 P( W5 ]6 I }3 B/ j0 l1 G2 d; x! T! S
else. Z+ P/ ?: L3 e/ R- r
{
7 @) u: M i$ e Delta_Time = cnt_1ms - Record_Time; 0 V9 ?5 e4 Q5 m
}
: g( h6 a8 s$ f. ?' v, ]7 A% q7 H+ b, L: ~2 }; u- p- }3 `( F4 z
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT! f. b' M, K- D" D' d
{# [; c- f' q8 [1 Z/ a
Time = Time + 100;. [3 n7 u! r; V; r, U" l' U
State = 3;) a: B+ y* `9 V
) n) Z& {+ e) ~: L6 V if(Time == 1000)2 ?! h. a; f8 D# D) T2 ]: I+ t* W
{
2 u0 q: L, g1 u# ~ State = 0;
; R5 H' m# f6 ? } u' L& ]1 q9 H: @: a4 q p
}
' o# F1 \# [4 I( @8 {( C% d0 B, e }* ~9 J8 e X) q% K0 f! {' i
}
3 o+ I* o4 P! S8 R, h
1 [2 p2 \) C X: {void interrupt ISR(void)
$ f/ i. R1 C' _2 v& f- k0 W{
. F! Q( u/ Q# h/ P* K* c if(TMR4IF == 1)
' }: d" W$ {+ N3 T4 G3 Q$ q ? {
9 ~ ~$ f" a- t& {9 B TMR4IF = 0;
0 v8 w Z( O: p1 O; k0 H cnt_1ms++;& G% a! ?4 o- `3 r s! t5 d
1 o5 e7 T0 V0 {: s
// LATF0 = !LATF0;7 i7 u( x4 {" g- q( L( I% D8 Z% f
} # t, D: Z+ b @) h
} |
|