|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。! h) m7 b, T# f& B
9 Q, O" g6 Z5 I$ h# N8 u/ r) x
/*4 c }! O1 K! T' R. p3 S; N- C
*@Name: PWM_led: B! I! W5 Y. \$ Y% g
*@version 1.0; _) c* i2 r' I8 ^ r e2 m( F2 _, ^
*@Author xiaopan) G; k6 `5 I6 E5 [4 h2 b1 I
*@Date 2014.8.2" Z, h7 P T, x7 Y$ @
*/
" \% W" ] X0 Y2 z. e4 a) V& Q* B# d; V2 d8 ]" n9 k, n
#include<pic.h>& h* k" `! q8 X1 {/ `9 R
#define uint unsigned int
9 f9 @& @3 M3 M/ S#define uchar unsigned char
6 K- f1 T, U0 Q, m- T
* q% z: ~4 a! R' R% b4 q#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 # \' `6 x \' {" x2 v( l0 ~" [6 `
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 * a! ` Q. D2 ]0 E2 S0 v1 e" ?2 }
) f; y% N# b6 N" ]7 }6 k ?
uint Time = 0;
+ O% `: G' @' Y' Xuint cnt_1ms = 0;
; L# v6 e; v9 o; `uchar State = 0;! o2 g: v: W9 b+ g
) }, G4 r7 k& {" q1 N6 I! @! avoid GPIO_INIT();
: K8 T- k* i0 E5 r4 t+ ]2 N+ y! Tvoid TIMER2_INIT();
. g0 u, K# T$ m& |3 Z: F: Jvoid TIMER4_INIT(); k$ w. T/ `1 \& h4 ^- N' S0 m
void PWM_INIT();
( ]# Q' j2 s$ N" I% hvoid Control_Task();
" `: m/ p, ]3 D! r( T6 j. F0 M1 N$ ?) ?( i3 t. w. {) M: c+ D- g7 z
/*
% x6 u5 M/ }1 j& s/ H*@function 主函数
, }5 A+ F2 a1 b*/
! p$ V! ^0 r' I3 J- c6 Y0 c% Q5 o6 v8 `void main()1 e' i0 O2 J1 H% N+ f- \1 z9 o
{
( q: C+ \) M" j& G GPIO_INIT();
* J g' h% j& J3 V7 } PWM_INIT();! o6 e1 {) x+ |4 X! h" i( j* [
TIMER2_INIT(); //PWM利用TIMER27 r' V: @; P0 ^# H2 \
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
$ B. k1 D" b0 \* V5 X while(1)4 R! q* V# x0 i$ Q2 d
{7 C# \+ e& K; {* G! e
Control_Task();5 u+ K" w( f3 J$ s
}5 N2 N* |0 x" U* t- a3 o
}
# Q3 w6 ] h5 o& k+ S, m4 t/*5 M4 G. L9 p0 x+ l4 C/ M
*@Function IO口初始化 RG0 CCP3 RG3 CCP4, m2 H/ r( c! ^% f5 V
*/
* ?: C/ l; M: J( fvoid GPIO_INIT()& K' J. v- j) M( S1 `$ z
{0 t9 r3 g8 {% ^; \+ m- B
TRISG = 0X00; //设置RG口为输出& K. r! p& h8 d
ANSELG = 0; //设置RG口为数字量 j7 [4 `5 c- o: q. o; d& Z
LATG = 0; //设置RG口为低电平& ?% I2 B8 J( J2 N6 C
7 \* s, \& i$ d) F' N
TRISF = 0;# N$ h1 e+ [* c2 Q3 w1 s% A6 ]
ANSELF = 0;
$ i# J/ l1 U0 [* B3 M LATF = 0;
( M! T! N4 G2 o3 E6 ^& O0 @: g}9 J2 c, [$ X) t, A4 R
2 G+ c3 Q1 X) z, |/*
2 ]+ E4 N9 {# ?8 x! x7 e6 D& y; R& R*@定时器2初始化
/ E0 V2 T% F% n/ S. ~& O4 Q& M- k*/8 ~- y4 |! q. ? N: h. N. L* N
void TIMER2_INIT()
% m7 N: g6 A0 \- M: C{0 a" r g/ T$ S- ^
TMR2 = 0;
( q! {. T. X6 Q, `, Q# G* A PR2 = 255; //2553 M9 H- C) |' F. x& h1 i
" `4 H0 {! m& h" G; O7 g
TMR2IF = 0;1 V+ ]/ X; O, a. s C! e: W# i
( I* x. b, z: U6 _
T2CKPS0 = 1; //1" i/ ?* j3 b B
T2CKPS1 = 0; //0
) T+ n6 Q8 _ P( J, o6 o( l( o, {
5 \) K+ N+ D* i n# I& D TMR2ON = 1;
0 s0 E. f$ f0 ?}
6 j/ F& i) K$ e: t8 a3 h
7 y# v1 A. G5 u* U' c( ~/*
9 n! M1 D9 a5 y z* g*@定时器4初始化
+ D/ b% y% `4 Q G( P$ I' S*/+ W3 k6 N& [; m) E* Z1 M+ D* Z
void TIMER4_INIT()
! l) r9 U' p2 |2 b% |{
k/ i) X H& Z1 ` T4CON = 0x0e; //0000 1110
( ]% c5 t; q2 s/ `& |: @% l; E7 a0 ?; V
TMR4IE = 1;+ S$ [, x0 X n* P" W2 O) f% M2 n
TMR4IF = 0; / g2 J- V3 { T$ R2 _5 k9 ?( i# t1 F3 o
) t6 f" A$ L+ Z4 O4 K: m
TMR4 = 0X00;
/ ^! y) T: W, s $ D9 `+ a' r( D* {
PEIE = 1;2 o c9 p7 r3 }1 O4 M5 f
GIE = 1;/ l6 o; r) _: ^, {" L
}
1 `$ u7 V7 e# q
4 B3 K+ Z z7 p4 p+ {$ T: m6 c( M! n+ k- [( ?
/*' w. c* b( I1 r
*@ PWM初始化
4 ]7 w# M+ S1 \0 m*/5 |! x/ Z- r0 X
void PWM_INIT(); A" W5 h) d7 D% m# ]& R8 G
{
/ H& f9 ]) Q- R% l' x3 f CCP3CON = 0X0C;
* O2 Z$ J7 N, Q D5 j1 y CCP4CON = 0X0C;: C O8 M2 a: g. H/ ^7 j7 i
, ?" o8 Y2 U8 A! O1 O CCPTMRS0 &= 0X0F;
4 s" C2 x5 |/ B* @
+ d5 Q1 T4 h- C: ~) D0 |# E TRISG = 0;
) V6 c* o5 Y& @& W# Z$ |}
. ?. T' `3 |: e) e& s
# N3 O7 U" ^. P3 {/*
% S0 T' _8 f( b*@Function 主任务函数
) S' C) d' Z* V0 \! D*/- M$ ]: z) [) A
void Control_Task()
# Q7 q8 S! }% `! f- I6 R{- Z0 y$ X( H( f& v" p
static uint Time ;
# Z' H. d& m& r; B$ R// static uchar State = 0;
( g8 O1 @ B6 f3 n( s, J& e u0 |$ x$ W static uint Record_Time;
% \+ D$ z3 t4 ] uint Delta_Time;& G0 y% r1 h9 i; h# ~
. P, q* l/ e# H9 T if(State == 0)
3 P. h% t8 |: V- ^; j) e& D0 B& v! [ {
' D9 i! @* G2 i( I Time = 1000;
6 z# f3 B9 V2 k5 N State = 1;
! V4 ?5 O6 s# t" M/ U8 w6 w
. \( |8 b3 m: Q0 N }
8 f) Z1 G P& F/ r/ z if(State == 1)0 J+ e: F9 g, P* @
{0 `1 G" o, Z* E0 {9 n; ]
PWM1(Time);3 {* ], H% T, Z) w) e' @0 n7 T
PWM2(Time);. i0 I# b4 p* o0 c" _# u4 h
$ L1 [% s) {8 m8 A Record_Time = cnt_1ms;! s" a5 }; c. J) S
' E/ a+ N% a' n9 H" M( `
State = 2;) V- |* G' C6 k) Z/ J6 M! M' I W
}/ G5 d2 z6 Y1 c* a7 S7 i
% u. a0 v" ~5 R N' \; S+ _
if(State == 2)
- E, y2 }- K! x {
( j" Q5 X W+ }, \+ n. ~7 f0 X if (cnt_1ms < Record_Time)+ H F/ ?- a1 i/ |( {5 h
{, t4 I, }- J) j% f$ Q
Delta_Time = 65536 - Record_Time + cnt_1ms; + M! {' x' { o i o1 F( o2 O
}
( I+ A0 V0 q) o! b else
( ?& i/ T% w. M0 M; l/ L6 M {, \! Y- C7 I5 o/ x0 G3 F2 J
Delta_Time = cnt_1ms - Record_Time; ) i- t) n, a! q& J8 Q
}
, d* v; {3 @& z& E" o w( _- d* [9 n0 @& D. r+ ]+ |
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT8 e0 ]: j& w- C& y1 E7 V, r2 E
{! E# g7 z2 M: R3 J: Z. x7 @0 Y
Time = Time - 100;
5 O8 a# J' K/ ~. P4 K1 I2 i2 z State = 1;0 M g" Z* G; j/ {
6 V: K, T& H( G& N A if(Time == 0)
9 T3 Z3 R6 r2 }' x% u! E {
( w2 v z9 ~$ I* N4 f Time = 0;2 U9 x5 D7 p) a& j- c" l/ t# m3 E
State = 3;
* R6 o; q! Z0 ~9 j6 g! w }9 S+ F1 ]5 O6 T" I
}
6 `; l4 a' H; \& a8 k8 Y8 ` }
8 T0 B5 o" r/ C6 P+ v, @
# d1 L+ ^" U; \2 p' B$ s if(State == 3)
$ S) z& \8 A1 n# w( E( A R {. a, T0 \% F8 M- ]9 E
PWM1(Time);. W9 d7 s4 `7 z# A; \' x
PWM2(Time);+ `' J1 G, p' v- e* }
) R E5 a0 b- U1 @: R
Record_Time = cnt_1ms;
/ U: a% c8 O# F7 Z- J7 v- e ; c! H: i" @7 n% Y- a j
State = 4;7 a/ u: d. }0 \: T
}
: c/ [! ?) F1 \7 i5 c ( _! L& w$ K1 k% `) x8 d; ~
if(State == 4)6 y& Y! N' x! c% v2 D
{
0 U+ A4 Y' W5 e1 K2 u2 W B if (cnt_1ms < Record_Time): q. S/ N$ X& Q! I- M/ s
{
& ^2 v( Z) x U; K: u Delta_Time = 65536 - Record_Time + cnt_1ms;
8 k. f7 x5 H9 f, s }
; c9 O) z' k5 X. n3 g else- W6 g+ I. W* G( {9 ^# v' d2 i
{
) ~4 s1 ]! h: {) P) \ Delta_Time = cnt_1ms - Record_Time;
, |6 i" v8 g- Y9 |" Z9 m$ ^! i }
6 M! M) n `/ C3 w# i, N% E/ j5 }1 x0 ~
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
+ a/ P, W8 o( ]/ u {
" H5 e* M& {7 j! P4 Z4 F6 p Time = Time + 100;
' w: p5 Z( h& D. g/ i State = 3;! `' h1 N. q' L8 ]3 ~# ]2 g3 E! w& |& B
+ G4 p3 F' P4 L# @5 _ if(Time == 1000)
4 G0 |5 m8 n/ q" C/ i L4 B {
6 h' w. h+ {% n( Z1 o) |1 X State = 0;; K C. b0 D7 q; ]4 x
}
* D# o* A/ n2 L) U0 ^ }
( b% N- R0 B5 A& ? }
) J0 @ l( i: ~! f# G' J9 U+ E/ J8 M}
6 O# y9 s7 f3 d* ? y
8 f/ s. m: Q$ _' P7 \& @) y' Qvoid interrupt ISR(void)
: n- O: X" ]6 J+ Q3 o1 E" n8 n{
; f# X- c4 H& A6 C' b if(TMR4IF == 1)! q5 n1 {/ L c* l. K
{3 d2 [: l! F& J0 w% T. d, j
TMR4IF = 0;4 h3 q8 ~9 t2 x" D4 ?
cnt_1ms++;/ y, d# i& e5 q5 m% x: k" C8 p p7 i
/ @" B& A, K8 D( H& h7 W3 z& B& I
// LATF0 = !LATF0;. M7 @5 U: x# J/ B$ ^" V$ O4 a
} % ~) E/ R3 Y4 _, ^: X. ?
}4 q5 l! o. d \7 j
|
|