|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
# `+ @; O6 h* F) B3 O0 V3 A5 K& K4 c) N' t
/*. s: k& w; C( M4 U. Z+ V7 u" @ {6 E
*@Name: PWM_led
/ P7 E& } R8 Q& Z3 F*@version 1.0
) S5 ^9 h% ~; H! X*@Author xiaopan# @4 T7 M5 N# p; H1 @' Z
*@Date 2014.8.2+ U; {. c( H) \& O# ?& V6 J& D5 T% }
*/; M. _/ m% o& `4 j6 x4 m3 _% Z
`$ Z7 v* a7 o' Y#include<pic.h>" O/ p6 Y4 M: _: w3 i0 h2 s
#define uint unsigned int 8 C* O1 w3 D5 ^( B. W
#define uchar unsigned char
3 A8 R: n5 n5 G w/ G1 m1 e' t K0 u4 G- w4 B
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
9 R' n0 e. E: `7 _; \#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 1 }% z% ^" g7 z; M1 n
& M* q' |) i% @! X: j6 uuint Time = 0;
7 g$ x$ B+ \) V) a( d8 Yuint cnt_1ms = 0;, V' }" B" u( u2 {
uchar State = 0;
# E5 v" u+ L4 R+ s6 u' x
/ E5 i/ v f: X( y( Lvoid GPIO_INIT();
8 G9 }. y( K6 ]6 u- [2 ?9 q$ _ Qvoid TIMER2_INIT();
8 @: |" j4 z$ J h! Gvoid TIMER4_INIT();
6 a+ v, s( L5 }" H. s: z) Avoid PWM_INIT();
8 i1 |; _8 I, ~ L# k/ Y4 b4 U4 V V# Dvoid Control_Task();9 ^- t7 @) I1 H) `" ~" b3 y6 i: o
5 Z: v6 e1 r. }* r( u: h; h/*
& a5 B8 n! a2 I a' a: T( P. I, X6 S*@function 主函数
- h5 k5 u. D: `- k" C& i: a*/
2 D# e* n. A0 I! K8 J1 cvoid main(). y" v% K2 K) T: S/ [' L
{1 i8 R% X) Z; }( {. N/ y- X2 g
GPIO_INIT();& ^ r# b4 k1 B/ j8 F
PWM_INIT();& y. k5 T/ L- e
TIMER2_INIT(); //PWM利用TIMER2
4 @4 n& R- g# Q7 a TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
6 `; t6 Y0 D( W5 w3 S6 Q" R while(1)
& |2 C, y6 @( U7 V4 W/ n! Q- v5 p {
: e- y" \- r/ Y2 A' l$ U Control_Task();3 j, k9 U/ J4 J/ {0 J4 }( s
}& g; y/ R: R8 T! ?2 n% b0 S
}
' i: e0 _1 c! Z- s. X/*
+ A/ y+ a1 @9 \3 u*@Function IO口初始化 RG0 CCP3 RG3 CCP4
) P( i# z( j5 s+ P*/
/ ?% r9 \6 \. n0 \! H& u2 wvoid GPIO_INIT()
$ t* \8 U: p1 ~: z{( p" X. p0 O& m9 k1 U/ K9 p
TRISG = 0X00; //设置RG口为输出' e; S+ D) F1 S/ f, s3 w. w; { C
ANSELG = 0; //设置RG口为数字量
" ^) x4 r; V9 l v LATG = 0; //设置RG口为低电平
) U9 T8 z3 Q/ a( m, M6 {1 t7 a; i
2 t( r/ c7 s; ]8 D: n+ [ TRISF = 0;/ u2 F: c/ M: i6 d) H9 Q
ANSELF = 0;
9 Z6 Z* D) E) e; | LATF = 0;
* w+ M& J0 D/ E0 N}0 @' w' G# E) s9 n& Y6 ~* j( D u
+ [4 V% z* O) }% i. S: N6 D/ r/*
- T3 s4 C7 N# I/ G2 {8 t*@定时器2初始化* B) J" \( r; y! ^9 V
*/
# d4 n. `+ Y% q; m- q8 ~1 m. mvoid TIMER2_INIT()
' {$ r0 o( v9 j5 p! o{
! E& ^" U! d% E% T: T/ l- \ TMR2 = 0;
/ m6 v% T" z/ h7 b; ]! B* k9 u& O( b PR2 = 255; //2551 p# r+ P7 V1 |' U& O" E0 l4 _2 U: m
' o( s6 u3 d" H4 I2 D$ H& X U TMR2IF = 0;
* p/ M5 `' p7 v5 b
1 W8 p- H# r1 V+ P( ?5 q. T+ L T2CKPS0 = 1; //1; ~3 ]4 ^( P1 J8 y+ ` @1 D
T2CKPS1 = 0; //08 ~9 G) U1 l0 k5 N
, a- {: |* v4 ~ W# u4 D TMR2ON = 1;
7 i# u+ Y/ o' a4 z: I, k}
3 I+ s. u& q$ m5 M) l/ L8 t, I N% c( a [3 l% y
/*
. E+ c9 M' X& x4 E1 n*@定时器4初始化
4 @, q9 [2 i4 A*/
/ |- ?/ O9 F* ?6 j7 M" }+ Wvoid TIMER4_INIT()
7 F1 b! N5 o) D( k. r, d3 e{
4 g, _5 i/ D* L: v T4CON = 0x0e; //0000 11109 ^( [# R8 o9 Z+ x) v. C
" W- u4 h9 p1 @ TMR4IE = 1;" L8 N( ^- a0 @3 @1 }- c8 Z a
TMR4IF = 0; 0 W/ c8 O7 A* h5 x" ?0 C; v
- |6 b7 B! c& V6 t5 G: [4 G TMR4 = 0X00;) m" a& B3 G# B% f0 O
4 P4 r3 W" a! m9 n8 x. A: |1 J
PEIE = 1;5 K1 p2 X( P& S! c, W
GIE = 1;% h: i% I" C, t, y& V
} Z$ b' {# y0 P
- r, e1 M# n6 y% n6 w# J8 n9 E/ {
/*7 y1 ?& \- {6 R/ V2 Z9 m. z
*@ PWM初始化
$ W- a. c" {# v. I1 U*/) `* Z; y4 `" d& Y0 K0 e4 v
void PWM_INIT()
9 b8 W9 h! i6 r N- N{7 E4 {) C! ?2 D% `+ O
CCP3CON = 0X0C;( Z; ~ `/ V0 L, ?! ~0 E
CCP4CON = 0X0C;7 j* d w- V" _# V* C5 s/ o
: F5 [+ M r' [& w& m
CCPTMRS0 &= 0X0F;& e5 W) o& C- R/ L6 z
6 C, g2 d" E t+ F* K, j( |
TRISG = 0;
# q) T6 o* |6 T- L9 n8 c' @}
+ J4 ~# }. |& e: g7 {2 L# j9 C/ v# z9 O5 n# B$ X. @
/*% o2 ?7 N3 x5 R2 L0 V
*@Function 主任务函数
7 S9 ^" R) t" Q! |*/
& B4 ~ X* C. I. @6 r; g/ F9 K- Uvoid Control_Task()2 @0 J% X w* }1 t
{, [: E. m; J% D( G# J
static uint Time ;8 L3 m5 k/ D* }; ~' w8 }& w0 p
// static uchar State = 0; T) N" F9 l/ F! c
static uint Record_Time;
6 B% I% B D( k ~" K' C; |6 u uint Delta_Time;$ d4 N; L' v. i% ?
- q U: M1 j3 G5 k: m, P _
if(State == 0)
& |, r( @, S/ w& O9 Q {" D- K- w: }4 h; c+ ~, ?6 C6 q
Time = 1000;
* q! P3 d1 q: H4 V State = 1;
6 h9 P* w+ s/ J# S" C2 N {; `( M. U6 T6 ? {0 i5 q
}
) K# M! B$ E d; i0 B9 [ if(State == 1)0 p' K' W, y$ ?7 y% V! @) L# E* Q
{
; b/ q% w. m n+ V v' J PWM1(Time);, S* f4 U( c; Z! z
PWM2(Time);) q. `. f# s# @( l
% C) ] N1 g( W Record_Time = cnt_1ms;
* M% s! Q0 e% l3 x. B
6 M8 G9 D/ Y4 ]+ c: \( I$ W State = 2;
& n+ A) M" a9 J/ ?3 Z }% z% n ] s6 Q1 o# g
% l/ e% \ w3 C y if(State == 2)
/ c* a, E) D3 z2 W* ~ {0 t( U" I! `" d* P7 K6 S8 n w
if (cnt_1ms < Record_Time)2 n2 i( I/ v1 y
{3 A! _ T1 H6 q
Delta_Time = 65536 - Record_Time + cnt_1ms; 8 } B. o: }# E. T
}9 G; a' S3 B% J0 \& x5 f. H% E+ D8 N
else
9 ?( v% M9 N2 |- k u! [# H" | s0 n {. t# H9 t- u1 H
Delta_Time = cnt_1ms - Record_Time;
0 I: Q' `2 n5 }* F/ E6 h0 w. H. y }; f1 r$ u7 t# d( d b
# m1 {# P7 k! l2 X8 c
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
+ }% L' n! l" l$ y {, e7 H! Y4 q; F
Time = Time - 100;1 k( ~) |; ?( T/ _ B- w. [5 N
State = 1;
5 f$ ^+ Z( e, }" r0 C5 h" ? 8 i- z" f. G/ T2 M [
if(Time == 0)- `" x6 m( R C4 h
{+ F8 `7 A. p. u# Q& r
Time = 0;
. D5 P9 b/ J6 Q7 B! r _2 ?: C2 E9 D State = 3;
/ G* W, @/ s6 `! X, P }4 b* S# Q& Z8 T4 B; N* L( k3 o4 b
}
5 P1 @9 K& U% G. B$ r# E }
# f% I) D; G' D
8 R. l, @' i; b2 S5 G3 h5 X if(State == 3)
" h" M' i @: L- u2 A {
$ @$ s% E; a1 S6 x- Y( J PWM1(Time);3 H2 n7 ^! X2 E& y; W$ F L. s3 h* A
PWM2(Time);
% o* Q9 ^: k' J" r7 ~: U) r ( C/ }" O' K3 Q) K2 u% Z5 U
Record_Time = cnt_1ms;/ `9 [4 e' H, i7 i# f. C) W0 y
l3 p! j+ `$ |' v; y State = 4;5 f, M- Z) e5 p
}
" V! r* c/ n/ @; ~+ B9 R% z$ p # k9 \6 W9 X& t3 ~7 B
if(State == 4): n' c: M4 \' P1 U
{4 _- ?' Y9 @7 |0 A* e
if (cnt_1ms < Record_Time)
( g+ _6 O) O$ \5 U {
9 u* ~/ R1 h$ V- N& j Delta_Time = 65536 - Record_Time + cnt_1ms; U5 B, @% ^" Y4 ^3 ]- @2 R3 Q( R
} z0 D6 z+ h2 J8 ?9 i
else
i' Z E1 C0 J0 Q6 e {: S" B, O' u& V* ]
Delta_Time = cnt_1ms - Record_Time; & T. J- J5 N. S5 K5 G( i
}% F, }; ?9 t3 T" z
& g( Y& h3 Q) \4 U3 V6 L) i
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
0 w% c j3 C' X& R3 a/ q! H {
0 l( X. V$ N7 W4 k% { e Time = Time + 100;5 M! J" k( o8 A
State = 3;
( v/ g% v+ ?' Z% C+ s+ K
1 F7 E' H& h/ U5 {" }/ O if(Time == 1000) J9 n3 F7 Q6 r5 u- k& K* f* q8 h
{" I& u/ Y0 U7 J) c2 ?
State = 0;
' i+ z% x, V8 ^! M4 a8 U }- E* V) _2 m+ A9 n2 J8 _, i4 ~
}) ~5 E$ v0 ^' \0 a( P
}
2 _3 [5 ~& [2 @7 l# T7 p+ L' Z}
/ t& K' V5 U% K- N& d6 N4 i, F
! K7 _3 G% Y/ F) ovoid interrupt ISR(void)* y$ A- x/ @5 p4 D7 p9 U, X
{' W" I" s; t& J$ }, e, T3 f
if(TMR4IF == 1)
% `8 W% I2 {* q, u# U$ f+ S8 \ {
: Q% k f G! B% Z TMR4IF = 0;
7 F0 e* U/ Z% c( F7 { cnt_1ms++;1 a7 X8 r, Y- D/ f
`8 u3 d& _9 Y3 i! S: c* t! u // LATF0 = !LATF0;
) X/ `! T1 ~/ M5 g* d6 u- U7 S }
& B7 }, ^0 C' X8 N} |
|