|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:7 q; D/ i9 M8 o0 W3 W2 G
4 e' x j0 j# I/ S6 G/*0 P1 t3 r Z) m3 E: R
*@Name: PWM_led
- V0 J7 _9 l, X*@version 1.0! N4 o2 G; o6 e8 J; _
*@Author xiaopan
( J. \" R' F% X# ?% L" A; c( d*@Date 2014.8.23 @/ j7 n3 i3 Z0 W# ?$ N
*/
9 M6 R, k8 ]. y% Z% o# y, D0 A0 X4 t4 b# l( K H( X3 x8 @
#include<pic.h>0 ]8 s3 ~# z" G, F2 U {$ `
#define uint unsigned int
6 P- G+ z+ |/ H* u4 l2 V#define uchar unsigned char
H7 u; I; R; q+ o: c7 \8 l/ }, E6 Q5 l! j8 d' o2 ?+ R
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 4 q- a, t1 U$ `) W, A
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 6 H3 l$ Y4 l; q2 |
- |" W6 | q! l' W7 H& |% {2 |1 Cuint Time = 0;
! P- ?5 w: \7 y4 Z5 ?/ puint cnt_1ms = 0;
7 Z4 Y, }/ ^, c4 @uchar State = 0;, t) V7 w9 {: E0 y/ `' j6 W5 P
: C! }9 ]+ @' bvoid GPIO_INIT();
3 m" Y4 X, I! @3 R& d9 W" _void TIMER2_INIT();( K9 Q" i! I K: y7 Z7 D
void TIMER4_INIT();- d% Y p* @& O% \8 Y# h
void PWM_INIT();
) {' E# U1 P* Mvoid Control_Task();3 y2 W2 n+ [( l4 g( t# K) i, ?. e1 |
7 \7 y; i; ^) Z& u8 n& n; E
/*8 _' _$ D, ?+ S: n
*@function 主函数
# p2 H& V$ K9 ^& g*/
1 I$ e& e" X2 h7 B( e0 }void main()
& Q$ a9 a# D+ W5 ` ?9 k# U{3 p) R2 O! w V8 f, Y4 u
GPIO_INIT();
5 B! z1 w' D3 F k, u8 s PWM_INIT();
1 G& g8 ^8 c. C TIMER2_INIT(); //PWM利用TIMER2$ y: ~, L6 k( U
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
( K3 N. ?: [2 \: C* l while(1)
# n8 C4 F+ C3 m7 f" d {) b# N5 c3 {! j8 A5 b' @
Control_Task();
l) P# Z. t% x2 T) r D4 z }( Y+ K% k T- _$ c
}5 U. t' R6 q2 `- q9 z0 R
/*
: R$ T4 d( N S* R0 J*@Function IO口初始化 RG0 CCP3 RG3 CCP4
6 K: f& b, ^: |*/
% @& H: N' N$ e: k4 b; kvoid GPIO_INIT()( }* y9 y* r& a3 y* O3 a
{+ l" y e* r; S
TRISG = 0X00; //设置RG口为输出7 T# k- F u( U' l; b$ N+ U4 H
ANSELG = 0; //设置RG口为数字量1 p. D2 e3 A5 ], u
LATG = 0; //设置RG口为低电平7 X% R/ p9 d/ y0 J% R
. k e0 g$ j/ ]* O6 r: _
TRISF = 0;1 _# q. V9 H% X
ANSELF = 0;
) o, b1 ^# `, Y5 N LATF = 0;0 m/ J+ S/ n- z. j/ Q! d4 }7 p
}% o/ d2 Y. ~. x; V
' O, N+ d, O+ h* F
/*8 ]9 R. p8 H3 k8 K4 E% @
*@定时器2初始化
7 l( c- P e( a- \*/6 `9 d8 V3 S2 g
void TIMER2_INIT()# k' V# E& R8 d3 `! W
{
6 P6 b3 N0 @0 @, V6 \ TMR2 = 0;
. b( C/ M4 }3 s/ c3 a PR2 = 255; //255. A, o7 G0 y4 {) |/ x4 U
4 z$ Y) M0 u6 Q' N1 P TMR2IF = 0;
7 S$ a* P) G2 q, V* a. H% S 6 z2 {8 S9 G! v( Q. U
T2CKPS0 = 1; //1) Z( h! w/ }; b9 P) f0 M
T2CKPS1 = 0; //0
* i1 l9 B2 s. u2 v$ W! e
4 v0 ?# y) ]* C& H TMR2ON = 1; / y j, {# ]9 O. _
}
& \, _$ f" b! P0 G6 p+ h9 O; D0 s; ]& R/ b
/*0 q1 ?. }8 }- O9 W
*@定时器4初始化
' W+ R) \+ i+ K0 U6 K, ^5 P, _7 y*/
8 L9 t. \* l/ S6 f2 vvoid TIMER4_INIT() C, V+ A' R0 y: W& f, ~
{
" J2 H/ g* e3 B8 T T4CON = 0x0e; //0000 1110
: K$ @4 c1 I6 e9 k/ e) L
( H5 _& F7 ]* Z1 z: y; t0 x- U0 t TMR4IE = 1;
3 P1 C n0 m7 D6 ~' b TMR4IF = 0; 8 L$ f5 i- X r) B- v: Z; e0 ~
7 o; _3 s" A" M TMR4 = 0X00;# c7 |* N3 V/ m! y
8 o" G/ a$ v- J" V, o6 D
PEIE = 1;: p2 Z) O+ P3 o, A: f/ g8 C+ l7 m
GIE = 1;% ~8 O* S" D' e6 D/ e
}$ e2 H0 L5 U# [- M4 C: k e
8 N0 [( C* ~7 M. k3 d8 a* }. E: m3 e! ^' }0 f" i2 Y
/*$ O* Q- S7 M* B9 D
*@ PWM初始化
) f0 M7 @) r+ |0 c' q0 M2 c9 u*/8 b; W( U' W, l- q5 L3 y E& F; j
void PWM_INIT() C: K2 h9 J0 M ?
{
( f. D$ |" ]: C9 Q- g4 y CCP3CON = 0X0C;
+ }! @5 Z" U0 Z0 I. x: h3 ? CCP4CON = 0X0C;1 Z* v& K( y3 h/ ^- H/ D
" ]5 i5 c2 |4 g9 }6 V
CCPTMRS0 &= 0X0F;/ Y6 P) n3 X0 N* [- D
1 n/ U7 m* v# O; y/ u, p TRISG = 0;
( O1 F4 w$ a: i* G}
( l. X M( o g5 Z0 e" S% }7 o$ W7 R/ X t8 A
/* Y& T3 e$ `* ]. E
*@Function 主任务函数
2 ?2 Z i- g( w0 z*/$ x- q; U! B4 \0 G! T1 k
void Control_Task()
; ?3 @) {$ A+ \, x1 {: N{& H& s( i/ I' N' t1 s0 a# r
static uint Time ;. w O$ F! i+ z$ E8 K3 U/ o
// static uchar State = 0;) _ O; Z0 b7 I; l# ]5 T
static uint Record_Time;
3 P l" M- B" {3 J uint Delta_Time;
/ r6 O. N$ K3 I3 O) K
! L4 l9 W; R) k# p if(State == 0)
$ g- a! N, `$ E; C n: C/ F$ Y" X {# {) c7 J( {& W" s+ L( d
Time = 1000;
, X1 S- Y* w" T2 }: M$ Q* ^0 x State = 1;
$ _. B2 L l4 y
1 @! X; `7 \; w b! L }2 C1 y* t+ b: V% h# ?0 X
if(State == 1): H3 u' ~9 r7 j. @
{* ]; y7 P) `; q8 X- q* e
PWM1(Time);
# `' M" Z6 d- n3 @7 B* b PWM2(Time);+ ^( y! A) o- g9 g/ L; p: E
: x8 ]' p" k7 Y1 b
Record_Time = cnt_1ms;
+ O a/ D0 q1 A& A
- L. v+ G5 A& Z2 M2 z; P State = 2;
$ l( v2 [8 G1 j, i3 U" V }
* ?* Z3 {& \* [$ u* c& q s2 I & I2 k4 L8 h& R+ ~ ]) f* z
if(State == 2)
" h8 D) m0 o( L: V5 l {* G! f! U" n( N8 s) y
if (cnt_1ms < Record_Time)# }3 Q' N( A" O* x! N: i
{* {+ `& y3 E( T+ ]- x5 d }& v# S4 ~
Delta_Time = 65536 - Record_Time + cnt_1ms; 8 J# Z; ~5 B! G6 z
}) h6 Y. \) b+ o/ ^2 o4 O
else
3 J; \& t3 c& |, R {
- h9 P r# }' p9 D: S+ r Delta_Time = cnt_1ms - Record_Time;
% H: C7 ?1 ?; U- P6 z& d7 w0 ~9 I }
$ k; t0 |' h* \
6 ~: V0 K- c8 f2 K8 ? if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
: z7 D3 ?9 v& _ {
/ _/ b, w8 G' l" a# b& a) Z+ ^ Time = Time - 100;
& W6 r1 V" ~! k+ _, E& {5 T: u* L State = 1;# n& ~" A2 J( B" |% L( P
4 Q2 F! c# w! e7 P% E. i if(Time == 0)% ?( ~, @8 E a( x
{# a' T7 H) Y1 y Y
Time = 0;8 [! E1 j8 K8 D& ~
State = 3;
5 ] G8 J7 F6 g+ u, K }& W* k4 k( O! A+ B
}; R7 j" i& m$ @0 Z% w/ u
}
! p5 F2 f( Q4 M% H) m
& j' r% Y6 a; H1 }6 d5 Y if(State == 3)
3 Z; K, ^, P: ~ {
3 G/ ]) O5 [& G PWM1(Time);
' G" V7 U. O( { PWM2(Time);
8 S& d( w' R, v K# I% S
1 d1 m# Y+ P6 I4 w! F/ Y7 l Record_Time = cnt_1ms;- N( P7 S; y) Q; O
9 E5 l; ?: j' ^% c* A% \. W& V
State = 4;, {+ O A3 [6 D2 a9 }2 o
}8 y" I& h: [- n" H
, C& h. a5 S9 ~/ ?+ Q% ~
if(State == 4)+ K8 }. Y& w" m) X: W4 e% z+ A K
{
# e c; G5 m, A7 V) A if (cnt_1ms < Record_Time)( a' X/ T3 A/ G; A4 h- @
{
9 r& L( {* q& X Delta_Time = 65536 - Record_Time + cnt_1ms;
; I; H3 S" @. R, C }5 e2 Y8 {* U, c
else2 i2 k: `* j8 Q! L7 N* ?) A
{% T h9 M2 Q* b" J. U; @
Delta_Time = cnt_1ms - Record_Time;
" O, t1 C6 }9 u* l! ^- y! W }/ ? b/ X$ K/ [& a/ Q
& y, r# _' F3 J3 Q
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
7 H3 Z& `: _& Z {3 D% a# J% y6 G J. d
Time = Time + 100;
# |' P$ R+ F) ~& i0 J8 | State = 3;
- I7 n- h6 j0 c. A2 Q) L
+ N' n% Y$ ?9 M& T9 l t& D3 D if(Time == 1000)
5 Y5 j/ ~3 d. u# B {
0 p% f6 g# ?* k/ H$ L9 Y State = 0;3 z9 G6 n# S9 Z
}- a" _$ ^% D0 W6 \
}# Y8 r) \; E& y5 f" M0 L7 G
}+ a5 I& S9 J2 y
}/ [3 {0 _9 o* v5 C/ @% c7 U
* `% Y [- e K9 T/ ]9 dvoid interrupt ISR(void)/ s# d& z; E8 X, p% `
{4 c" Z: [4 c3 X
if(TMR4IF == 1)- g: M. ?1 l* L$ y2 y) V
{
& J. R$ m* d9 U7 e6 J: E. M TMR4IF = 0;
' K6 B7 u8 c F3 _) J$ \, f cnt_1ms++;
+ G' q9 X* p! Q/ e5 \0 ~. Z
" S6 |! j- F4 C( ^' F // LATF0 = !LATF0;* ?* d2 s8 R5 |+ B) f. P+ H4 Z A4 c3 |
} & J6 `0 `% u+ E5 _! M( X) X1 H
} |
|