|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
' j; }: ?3 |3 T! a5 U
( C6 U9 e+ T$ h8 R2 |$ D/*
; t2 I4 x% e. R* {! c; ]2 g, V*@Name: PWM_led+ K* o4 |5 S, F( i1 ]
*@version 1.0: K. {! B$ A9 W) {3 ?) x
*@Author xiaopan
+ d: k2 |5 `. {. u# ]3 j$ ]: u' R K*@Date 2014.8.2
& I- e6 ~! \3 U*/& a3 e4 H8 C5 K5 K: ?
6 ~/ \7 W1 ?1 e: u5 b+ `#include<pic.h>
, O! o8 a2 i2 T#define uint unsigned int
% k+ ?2 R2 k2 |2 d; o#define uchar unsigned char
) h2 d% E8 c. j% S
+ A2 w5 i' u" w1 M+ C! y#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
; F( P7 P: \, i( A9 F5 \3 t#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
5 e5 ^3 ?9 E: a
' j; x6 p' ~0 A4 Z) R9 yuint Time = 0;
. C2 e. @+ J5 ] Duint cnt_1ms = 0;
: D. ^- @+ {: ]( _ y! Z( w0 Wuchar State = 0;
1 V7 x9 {# G, E4 v' x5 D- r" \4 i6 F n
void GPIO_INIT();
+ C: k! e* F/ _; {4 S0 W: Dvoid TIMER2_INIT();
; w$ X& L+ H! x& c' O6 Uvoid TIMER4_INIT();
F: t5 Z' _+ Hvoid PWM_INIT();( c( s* T: K+ q9 {
void Control_Task();
1 z3 {1 N/ h3 p
$ I( y& }% ~$ [8 c' K2 v/*
* t: G! N, L$ i' a' Q# m*@function 主函数" R8 f" H: x' t; F3 B7 `
*/
, |% X# X' D" S8 K, Avoid main()9 ?6 t0 |$ Q' c, }2 B) M* T* L
{ w6 D% H" f4 I4 A$ g6 s: p9 y3 K
GPIO_INIT();% x6 \7 c4 q( L8 L: C7 a
PWM_INIT();0 d) v" h V2 u. U0 H
TIMER2_INIT(); //PWM利用TIMER2
; a0 t9 s# l- g7 N( H' Y TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形# O1 y) i6 |( R9 B% ?% D6 R1 e
while(1)2 a# Y$ Y0 X3 B e& o3 S
{
2 c' V/ C. c8 N( [- R4 @& r Control_Task();3 {( F8 }5 `) H7 r, I5 N; j
}
% Z0 b, q* T8 U b}
5 L4 c" m5 M. l2 I# l& M" M/*$ g$ c3 C( b* O7 u% ~" v# {3 t
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
* C8 p/ |: Y, F" I*/
4 m1 J! ? E+ s' K5 R" c, Kvoid GPIO_INIT()
1 x/ w4 r9 g$ e/ {# k5 y{
$ h3 m# i4 O# w0 _% C" _ TRISG = 0X00; //设置RG口为输出: b: E" `9 \1 P' q
ANSELG = 0; //设置RG口为数字量
( F/ b/ j! |8 v LATG = 0; //设置RG口为低电平- G" m: T4 X7 K' N1 E* h, V P
" _( b! D- _7 a2 ^ TRISF = 0;
' c1 x; k* \( K9 \6 x- B7 I, N ANSELF = 0;9 {1 c. t: D5 A( |
LATF = 0;
) P5 @# R* G* o}7 q2 s+ L" C. B; i) {
2 g# I/ G. ~- B7 R% S) |; z
/*
6 ^" K- w* j( |, S' ^. e* F. U! E) ~*@定时器2初始化1 k1 m1 c3 Q- V
*/! \# T" Q4 M! F# C
void TIMER2_INIT()+ w" I* x4 w' J: V8 C! ^
{
, V5 B' L2 P+ Z3 N# W0 C: T4 h TMR2 = 0;6 |8 m8 z+ k& |) ?7 A& k K) {
PR2 = 255; //255
/ N6 g7 I% n3 W4 i- i: f1 r 0 A) _8 U( R" r) O- l4 K
TMR2IF = 0;
& Z8 a0 x( `8 f" u; o& B 2 U$ Z4 ?" T4 E; @
T2CKPS0 = 1; //1. m6 m: [! m0 Q' l+ Y
T2CKPS1 = 0; //0! t+ P& ? X) R
9 A% ?- v4 C& T( i* F/ B
TMR2ON = 1; 6 ^' V6 d5 n! c( ~
}% G8 i7 r1 K: N# D6 c! g4 i
. d* P/ P B5 S+ Z/*3 f/ N2 s- z+ W5 b
*@定时器4初始化
5 b, K3 b7 ?! G7 }/ v: E) A' `*/
, A" `, |- z! [8 t" \void TIMER4_INIT()' W& `2 I2 h* [; l; D' I
{
9 r& R% i6 ^, R, ?& I, |; c T4CON = 0x0e; //0000 1110
$ _3 {9 k: z3 b' _# q# J; b2 F8 o5 s+ A! e [$ B6 j+ f( h
TMR4IE = 1;
( k4 I; ^9 Q' k' x* p3 ^, t TMR4IF = 0; ) j0 e# g4 U* I1 K+ o
" S! d, v/ C( ?7 x: d
TMR4 = 0X00;
1 K' R% w3 n1 S" _6 e3 f" g' o 0 U) H. Q: z% L3 @$ h o
PEIE = 1;- _" N. S( X& S! t, _- D
GIE = 1;4 t$ b9 }1 U" p
}
# P" L- q: {1 n1 e' y$ _
$ Y" Y0 f9 r) K
: _$ W' U3 A- p5 l& n3 u3 A* i/*+ e0 t- Q( c* A
*@ PWM初始化
4 L1 p+ ~( R" Q# b% P: b0 P% W*/* H6 \7 K! h W, a% J, \
void PWM_INIT()
4 K; J9 z+ a3 P$ L: Q{0 ~+ J; n l% k% @6 q \: |" N, }
CCP3CON = 0X0C;" x( R7 G6 F( b# q
CCP4CON = 0X0C;
. {6 G/ d! l0 @7 j7 \/ K( h
7 C7 a& A6 ]4 _6 L5 H% x CCPTMRS0 &= 0X0F;0 F8 { w* X- @& v6 e
9 j, {: v# i8 j( \- ^7 Y1 \3 ^) _
TRISG = 0;
% G* I0 c/ }. r$ e}
/ T1 s6 U4 p5 N
& I2 d+ ~: E% w1 t; s/*
& U: ~3 i9 w# c' Y" f' V2 l1 N*@Function 主任务函数! F( {* S" K- N/ U6 m
*/
3 S0 b' L% N7 L9 }4 p) p! W9 _/ g& F" Pvoid Control_Task()$ ~0 J V5 ~) M3 M
{
& y" A8 o2 Q, r' T$ [& m static uint Time ;6 h0 L# \5 `. I# s5 P# V
// static uchar State = 0;' P8 Y9 }8 k9 Y; x
static uint Record_Time;
' A' T+ F5 c- v I. r4 u. c uint Delta_Time;$ L- A3 r5 L" }4 ^! V1 G
' I8 C1 B8 v- t* l7 z: L if(State == 0)9 M* w0 f9 J, _1 {
{
) @& p: r9 } F# Z Time = 1000;
' T. T/ ]( n# S8 |$ t A1 s State = 1;
$ v- M5 d+ D2 n0 @: Y' q. K- m1 F8 q6 e, E$ r& Z+ P6 y
}
1 i" o1 L' T% `: a& R) p0 j if(State == 1)
8 N" C' ^7 J Q2 w {8 c4 E/ x6 v2 r+ Z
PWM1(Time);
$ E8 v+ W/ |7 o4 {2 W+ O PWM2(Time);
( M1 b! w+ K7 s% N5 E
0 e {$ y2 ~, U+ G Record_Time = cnt_1ms;
' c7 r# H+ q+ u) A" s1 _$ q 1 s/ N( r- \5 J% V3 N9 v" _4 H
State = 2; g; t j) j$ o. l. K, b9 Y0 d8 w
}* B3 e, c V1 W% U+ v) y+ X& `* `
% K' M% @* q9 y3 D9 w4 I1 u& W
if(State == 2) d4 W( W0 z. l, {
{
* Z( E6 \" ^) k1 U0 z if (cnt_1ms < Record_Time)& w8 B7 N w( v4 s. D9 q8 O8 N! c
{ M' a; M- H" i4 g7 e
Delta_Time = 65536 - Record_Time + cnt_1ms;
) ^4 u x0 {' E3 c$ \ }
9 x6 O# Q! }" h& U. _. f6 D else
( v$ b, w& Z5 w1 b) i+ ~# H {
4 v" @4 `& d9 o/ J. [2 J Delta_Time = cnt_1ms - Record_Time; 5 s) [6 ]: M8 C6 p% [8 u/ i$ H
}
, U! }2 R9 r2 j0 w" B5 Q" H7 y( q R1 \ x1 h- @4 [' N
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
2 v w3 @. G- b- P- I! a {
* I' `# k% c" {) ?1 N Time = Time - 100;
* T3 `" u F# ?7 [1 D. c State = 1;
! Z" x% X, D9 c7 H: ]5 F
0 I' {) }1 Z" v0 I. V if(Time == 0)6 H. T, F# V* J: O' V: b
{
3 t t' {; c: c# Y( d5 L' ]1 U Time = 0;: N+ c K' C# G/ o% g+ h. c/ Z, t
State = 3;
, ^0 B0 D+ M, `( r2 Z }
+ ]2 V% f% ]2 s4 J }
4 Y5 p1 f: B/ P0 U: [ }
6 L- m S# d9 O `8 h. K ! l p' i& H5 q% P3 q- `6 Y T( X
if(State == 3)# ?9 q4 r* M4 j% M; W/ G+ h
{# x, n z* P; ~! k' J \! r
PWM1(Time);9 T5 {+ G/ i3 D) S: U
PWM2(Time);
) a8 O& f. c% c( l$ ^% g" T
% q ]' }& |: l3 C2 G Record_Time = cnt_1ms;
# P+ O9 b5 j1 H2 B4 E5 E- m : b' g+ x) G) @' @( f, t( S
State = 4;' C$ _, o% N- ]8 b
}
; ?* D* o5 m1 i . \6 D( E- o) m0 w! z9 b$ Q
if(State == 4)
% n5 R8 I6 x' C& h2 K$ ]: J& [# @ {
' j- X4 c% ` b5 E& {9 a3 I$ T3 s if (cnt_1ms < Record_Time)9 _. Y1 E/ }) ]+ [4 m( B: ]
{
u% @; G+ W h8 Z4 a Delta_Time = 65536 - Record_Time + cnt_1ms; + r, b0 }: |& n; r! \3 `% @
}
) U7 ~6 T7 `* j1 ]; D3 y else
, `: a2 U$ t+ I: ~( L' V$ f {" K |4 S, c( S3 X5 {% G' O: F$ J8 w# p
Delta_Time = cnt_1ms - Record_Time; ! x! I* R4 ]) y8 I
}
; F% |- ~! H0 h, e
( p* O, ^) T5 R9 |% w if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
4 c: z3 ~3 u' e# T {
1 `) D8 F: X; z Time = Time + 100;
3 D8 S$ v e( j ], p State = 3;: G9 J& w) C, b. G6 m- a
4 x# j/ C' I F) |$ E if(Time == 1000), x& d! j0 h8 s4 }9 D. E1 i1 u' A
{
" L) J* c2 `8 C' s8 R5 a/ \ State = 0;6 E8 x3 j/ D# m1 w! N
}
: M% A, J! V7 T ? }% A0 M" ^% h; l" l1 H W
}- c5 @ l5 x5 i$ L
}. u" \1 p" F' j
) m6 r7 n* `7 M9 n7 D' H2 D$ }' Xvoid interrupt ISR(void)
+ b/ S* d7 ~1 A{
1 s3 S, l3 Q3 b+ F) b% x if(TMR4IF == 1)8 t8 V" x$ U7 L
{
' p7 x \" i- [6 W# Q8 | TMR4IF = 0;
* l( N. W- W; t+ K4 N cnt_1ms++;3 Q5 q" p/ m* [: h
F8 I; e/ E; |; `
// LATF0 = !LATF0;: t; ^, V+ t1 g# ^4 @- B
} ( N5 N# r6 c( |9 i1 s0 c
}
, s1 z- d) t. e) P+ L3 h |
|