|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。! W+ w; z) V$ l( F% q# {
6 ^9 i d3 v; w, P; u
/*% {9 x' C. }6 k: M3 |. U& H v) X
*@Name: PWM_led
+ p& C0 Z% P! {! o* u% E7 v, S" I*@version 1.0
3 S: q8 q# N4 k*@Author xiaopan
2 x4 H* m# B- o, H; o5 q*@Date 2014.8.23 Z# s1 E8 d9 H# y% @8 C- a
*/
1 P9 u% w; o! w" V [. v) z" k8 n% f6 i1 Y: i# t0 W3 i2 k4 ^
#include<pic.h># M2 t' Y- i! I3 M/ z/ G& r
#define uint unsigned int ) C( z V8 l# b; Z: X0 w: G
#define uchar unsigned char
5 z% I9 t% O8 L! X0 F1 b, B3 b5 n! U! x. i2 f0 V
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
* h+ m1 P T7 Q$ L& H3 l0 n3 r#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 ' P0 E; L! Q" ]) d8 }# b6 G: \2 H
9 Q! d5 X9 T/ \8 D$ F7 U, l: z4 V& [
uint Time = 0;
# P) Z1 [: h, z7 E0 ruint cnt_1ms = 0;
5 R5 P2 V5 O, a% m1 b4 z o. Q quchar State = 0;
/ A1 A9 Q' j2 w) e& ?7 S" E. Q8 W* U; \
void GPIO_INIT();
l2 s, y/ O4 H' _6 a3 z# Uvoid TIMER2_INIT(); O1 E! |. Q/ i; n' j5 |& u
void TIMER4_INIT();& b K+ T8 l) u h' h
void PWM_INIT();
! I4 `" \0 M6 h# k! mvoid Control_Task();! h$ Q/ h' e/ ~% `$ ~
0 j. e$ h8 ~$ @/ g7 H$ e
/*
! q2 P0 d& ]- k*@function 主函数
% ~) W! c/ V( c! v*/
_1 }1 `1 j9 U2 e- w8 J: `+ \void main()
; [( T+ S- c8 @: M. i# m! u' S{, U% b& r4 w! S& t1 x! H* H
GPIO_INIT();
( X1 f4 m( T/ R$ Y8 W" m PWM_INIT();
0 u# M9 V/ i9 p3 {, R TIMER2_INIT(); //PWM利用TIMER2
2 S4 ?# x$ e- n: w% [ TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
3 N( W% ?0 n1 s) G7 a' d while(1)2 r( Q; ~1 d: f+ J! }9 d
{7 l4 B2 N: @* k' N
Control_Task();
6 x/ s3 \, ]( P% E- f; E- D }' a) H/ l5 g( \" j6 X5 }
}
. p: ?# f( P( b2 H/* `% s. h) V" f5 S
*@Function IO口初始化 RG0 CCP3 RG3 CCP4& ]+ K5 z' j& D2 L" l
*/1 {8 W; ] } f( x1 m
void GPIO_INIT()6 ]; n- \( s* f- r. A/ e& ~
{5 R Q6 i! u; s2 P# O
TRISG = 0X00; //设置RG口为输出6 e& Z+ c# C3 |6 R# k0 E! P) l
ANSELG = 0; //设置RG口为数字量
. e! Y) R& w, ~) t2 r$ q LATG = 0; //设置RG口为低电平% k; |" Y7 @" p( s# \) @. D' q6 n
0 ~9 p) d5 v$ g9 ^
TRISF = 0;
( C1 Z, i! h0 m0 z- P ANSELF = 0;
% b( @: y6 e+ y9 O LATF = 0;
8 I& s& |* o# _" e}
$ K$ b# t. @; K$ P: A
) B& {8 Q6 e1 U- j0 \& p# y/*6 B# L4 H$ |% j- b
*@定时器2初始化
( G' d! T: x6 X2 t$ X( x, B: n*/) p2 R9 O" g; K
void TIMER2_INIT() h& o+ [) v4 R
{
: n+ u( A( Y6 M' Q/ A TMR2 = 0;
$ k- y& p3 J% d1 T+ r! n PR2 = 255; //255. s& h' D9 ~+ r8 G* l
3 @4 l# t( J0 _( i+ n7 Y+ X
TMR2IF = 0;# c/ ~, j/ W- x! R6 b
0 _; f$ \% n# {1 }
T2CKPS0 = 1; //1; m+ H2 d2 S3 [; H& H( S) {
T2CKPS1 = 0; //01 y3 ]: R) d6 t7 f! z9 P
' W# n2 b: n2 H0 \ ^# I TMR2ON = 1;
+ ]) ?8 c* R1 L. A$ Z}+ V. j& q" \+ Q5 A
2 [1 V! G7 E; t6 c0 Z
/*
`, ~# b9 H. f- ?' L% V*@定时器4初始化* \2 v+ I. i* H
*/
2 {! S; s i: ^$ D( Ivoid TIMER4_INIT() w: Q) d, H- d' Z) ~( M2 `1 z
{% [5 ?6 A' H5 x2 W& R
T4CON = 0x0e; //0000 1110
/ q6 w( h. v! h! V1 R7 m: o( K U7 I$ s4 g" Q/ i$ {
TMR4IE = 1;
1 |* b- v: s6 ` |# J* l TMR4IF = 0;
+ S) z- D; V( J: q) q+ w, v; z$ k) j; T. p; I) q
TMR4 = 0X00;
& @1 r4 m2 v; Z9 V# ?, t, p3 X - a2 r0 [* u7 ]$ ]" a/ r- ^1 H/ p
PEIE = 1;3 ~6 H2 M8 ?" Q; D4 U
GIE = 1;
6 _" C9 ?$ Q: U" @" U& d$ T}& _( j5 j0 ?. r: Z9 G S
) N* e3 X% h& [7 Y7 P" e8 o. w' Q$ J z9 G! X# Z* S+ U
/*
( n8 f1 d$ o8 Q: `. h! i5 O$ V% H# Z& N*@ PWM初始化
' _0 X1 j1 Q$ F1 E*/, X6 n. v# x9 D" Q
void PWM_INIT()& E- j) K5 W2 S7 y& b4 ^
{1 Z( Q3 s7 y( A* Y% ]0 z4 M
CCP3CON = 0X0C;
# w# W5 y' }4 c7 K; P CCP4CON = 0X0C;
% ]7 Q; u% }/ [7 `; m1 h2 \4 D7 Z) `. v
" G" i( d" k" S3 L! j( K CCPTMRS0 &= 0X0F;" m$ ^0 T4 U \0 W# A" d: w
& B: C8 s' E) S. k/ c; u% F. f. q6 O TRISG = 0;3 j$ O: A+ K" J5 q3 K
}3 A# t4 C: t5 x# x: k
: i5 Y5 C2 H4 t7 Z
/*
" B2 c; N$ v% M# ?3 p& C*@Function 主任务函数 @- _- s/ J# H0 A6 _% [0 X
*/% {9 r* G6 j, [6 n5 W: Y0 d3 ]
void Control_Task()5 o. D+ S: a; _% M
{. P0 O* G7 u3 M5 t
static uint Time ;) _2 n. P9 L6 S- T N" j( E/ a" o" r
// static uchar State = 0;
, f7 ?% u' R, X' k/ A static uint Record_Time;, M) }2 x6 j [9 P( M6 `" u
uint Delta_Time;
# L4 _6 A0 ~0 Y( S
D, p2 i& p& D0 ?9 D. o7 O" t if(State == 0). i- z: {% m1 ~+ R
{ z" Q( A( b! X1 Z
Time = 1000;1 v w9 o7 {6 g8 U* }4 ?
State = 1; P B5 P6 b/ [ M4 p# J8 T
* t; j! B8 z6 J! [8 v% p1 q- M
}
; X" S6 _/ o/ L* U% V' r- A if(State == 1)
4 @& t' T$ E/ T7 W {
& z: c+ h, ?% U) x5 X N; ^ PWM1(Time);& b/ g- J: O5 H8 l# U u2 H3 }# r% p
PWM2(Time);
1 S8 ]. w( z d! a! K 0 k7 i% i: P7 G( w
Record_Time = cnt_1ms;3 s0 S/ r, W7 b' X* n4 S5 s
, d: n; H9 T/ S- t& _' Y5 [0 U
State = 2;
# r+ w: X, ~2 p1 `' B5 r' X+ F- _ }9 O; L& l8 U6 ~6 _# \1 [, c* }
. n5 X# S ?' A8 t; w" A
if(State == 2)1 S# V6 [5 U# H T* e) u
{
7 W: s) ]7 K$ A if (cnt_1ms < Record_Time)' k Z& b" G) d4 l$ x' D
{1 {; D& p- v4 n0 g
Delta_Time = 65536 - Record_Time + cnt_1ms; 0 u' R5 {% d2 y4 Z
}8 `, q5 r! j# x$ r! ?# |
else
0 p9 \% Q" p9 [# B" H {
4 H/ F7 H" Z, b6 ~& }6 I Delta_Time = cnt_1ms - Record_Time; . _8 S( P: N; r; F
}1 g0 v6 Q/ }! n7 y. Z( f' d
% Z. D8 M# i) g# U) M
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
. K/ [" U4 u! V' b7 {. v H: m( I- ]4 { {5 y$ @8 L* Z) W; @
Time = Time - 100;. N" A9 E# ` h A$ k+ G2 }
State = 1;: w$ q4 E) O O# ~6 A8 \6 Y. I- J
, F( v& x3 h; C5 |+ k3 F5 U6 y1 ?
if(Time == 0). U6 W' E" t8 y# ?$ x- o5 o- v
{
, I7 C0 R) F% v) n Time = 0;' X- n+ C4 V( i. n, D3 h, G! f
State = 3;
+ w4 j! q4 c" z; Z }6 f; V$ I) i/ r% I9 v3 m5 N& }
}$ m0 q5 L" \1 y
}% Y! u. ^$ B- R; N/ u
! f, E2 r$ G) m
if(State == 3); I) G2 n" I* `1 K+ |/ Z
{
! z6 }$ U2 W# Q# |. b& ~8 w PWM1(Time);; R% |- U Q3 _+ O2 m
PWM2(Time);
$ ~' a; f- m9 K* M5 l4 E 3 X7 {( h% [. [0 X
Record_Time = cnt_1ms;$ K0 r0 l( W9 o- [- {) E
( W* q3 W9 _, r' e& t% h. h State = 4;
) T% Q4 I9 A- t }
/ k, A6 @1 `* i5 ^% {) L* @( W 6 Z: X% I6 f. z, P# {# M0 r
if(State == 4)/ k9 `3 i! U1 c. I$ S% M
{
6 e3 C: V0 p6 a if (cnt_1ms < Record_Time)
0 B0 L! M5 v' Q( _; T {* ?/ j& |8 A5 N U7 K/ ~0 N
Delta_Time = 65536 - Record_Time + cnt_1ms; 2 |* @, i3 j7 }% K* y- r2 y
}' ~* X7 k/ l, V4 T
else
9 D8 _$ `: {/ [+ \: N. P, U {( n( Z- W! _* J9 V$ k: X
Delta_Time = cnt_1ms - Record_Time;
" ~* i. ~' [0 l- F5 R7 h6 r }
6 ~' Z1 L( e9 O" ?, {/ o# ^) f8 W, \! {6 n- X" ~' u' k8 Z0 ~
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
0 a" V# P5 K0 N {
9 Z" Z6 _ J2 z Time = Time + 100;
5 U9 F! d5 k9 x- b! E# X L State = 3;
" y6 V+ N/ S$ q9 a& T 1 c; |; D; z! b* n
if(Time == 1000)
9 I* v+ x8 @5 Q/ E {; w+ Q- N5 z0 K7 F
State = 0;+ G3 h5 G- h& A! M9 X
}
+ M! q, G: N+ }0 r) [+ @7 n }
: O& b- D/ y+ ]0 @1 W }% F1 r$ S; `+ N* h r; m6 v6 I
}) X2 u8 r* q+ j$ e& v! l5 N
! u; O* ^' ?9 w6 z+ o |; u- {8 X
void interrupt ISR(void)4 _: c4 t! {/ C/ P
{# l9 I: i0 D; z7 t; K Z! d9 v
if(TMR4IF == 1)
& q C% z" Q) a# n( ? {
0 y* m3 i g: \* V- T TMR4IF = 0;
9 i5 r2 U8 }1 |5 ]; j5 ?8 U- A cnt_1ms++;
! [4 T4 h' X* @( e 6 \" _/ v" l! X3 B1 J
// LATF0 = !LATF0;
- r) o+ U& g! Q9 ?6 t } k7 U: Q. H: ?/ p5 v. W2 o4 H% p' a
}+ }+ a& [; p5 m. ?
|
|