|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:4 E4 w8 l+ p& q
: n0 Q. ^1 ^, E- d
/*
2 ~4 g5 Y7 A9 N*@Name: PWM_led
" w6 O/ e+ m$ p; t1 f*@version 1.0
/ u1 n( `6 `, I: I: @, O% z*@Author xiaopan. I2 K. s8 W& U/ J
*@Date 2014.8.2$ @# S8 t/ B* `- G5 H
*/% J! r6 m" T4 j S! R. Y! H: g" E
) M: v0 m2 _, e/ U#include<pic.h>$ r s' B3 x+ { N) c
#define uint unsigned int
0 w1 n/ U5 l D2 ]; l1 r# y% v5 o9 e/ @# P#define uchar unsigned char) G0 ]8 B2 z0 [
% F1 T- K. g& B5 k5 G! [#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
. [' |% U2 b8 E7 D0 `#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
# N9 u6 |' j% L- W0 }
5 ^" A& N# f% I, kuint Time = 0;* X- i; I8 w/ j8 N Z! c# A7 X
uint cnt_1ms = 0;
% h+ r9 m0 H5 b% S9 {+ w/ n! Q& Iuchar State = 0;. K9 |) A8 o$ r6 J7 Y7 [& j6 ]
' |: E% ]1 J+ ivoid GPIO_INIT();2 @0 F6 y! X2 n: [9 B
void TIMER2_INIT();
% W# b. v* h9 C& g5 U5 C* Ovoid TIMER4_INIT();6 l" t+ O5 z+ ]: b9 d* `4 f
void PWM_INIT();% b5 P5 c9 a. ?
void Control_Task();
! V5 u( e# x1 }5 O3 V3 C" W8 q% L% Q3 Q4 L7 u% m. Q8 U. {
/*
, }) d2 J9 O! E9 g*@function 主函数
& g9 d6 f" k: v- y. I0 y" i*/! A: T( v1 Y" D& V
void main(). k; M- c% d4 d; P0 n2 v1 ~$ o
{
, q1 }+ \, l/ r/ s. ?" x5 Z GPIO_INIT();- n) M# \% b) P7 d5 F
PWM_INIT();
: B6 K9 D+ [/ V7 C+ ^5 y* ^ TIMER2_INIT(); //PWM利用TIMER2
l: [; u5 ]0 ~) ~0 B TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形% r% m* o: f/ [& e, d
while(1)
, W9 X7 R$ u. U7 Y" l3 ` {* l0 K7 i8 ~: q7 Y
Control_Task();
) A3 e( {. _$ x5 r7 j }/ E3 A& A# _4 k+ L/ x7 ~) r
}
; }3 q2 N1 W; ^7 z* ^/*
( R% H5 d# Y$ h, c*@Function IO口初始化 RG0 CCP3 RG3 CCP4
( C( h8 h& L$ e: s; H$ v*/
3 y8 F8 M8 P1 c% u4 t9 E, d1 Mvoid GPIO_INIT()
- c, u& b, f8 |{9 `1 x# |) g- W1 H" y
TRISG = 0X00; //设置RG口为输出: |% v8 |' h9 [. d: A+ W3 }* A
ANSELG = 0; //设置RG口为数字量
/ n# j" M) i3 q0 z' C) {2 [! U: G LATG = 0; //设置RG口为低电平
( q: @# N3 s! i7 N; m
$ ^0 Q: T# \( Y% A TRISF = 0;
, h# m9 Y4 @) j ANSELF = 0;# Q% F1 L! ~+ F- P2 q
LATF = 0;
3 U, J( E2 M H/ `- O" p}
' W* A/ T8 ^( _; o5 `0 a( r% i
4 V( j* v& m3 M- b/*
" ]; x& z p/ V" P*@定时器2初始化
$ Y9 V9 D: L j- x3 z*/
& M' m& X, m. e; a5 |$ e6 \, _$ y/ bvoid TIMER2_INIT()
( I1 g- e$ T( U- O3 L{
& v! S. P' K! w; t! f8 D& X0 o! e TMR2 = 0;; n5 {9 z1 o! H8 w: y3 q0 U9 @0 _( y
PR2 = 255; //255# G/ v5 ]: ~( S) L/ k5 {8 B
0 s; a' N0 s# a0 E0 f$ R6 @
TMR2IF = 0;
, ~' H. [) J$ L
) P8 X% \0 n" v* z T2CKPS0 = 1; //1& I6 [5 _6 o g
T2CKPS1 = 0; //0
8 g7 L3 \! m2 r f/ X' O4 T ! {0 t% P0 o. f" \" p
TMR2ON = 1; ' }, v7 d$ ~9 M5 A
}, o7 V$ r1 X. X. n+ c7 M
% e3 W3 H4 S" b
/*
# b& O' R+ z( Q- b. \*@定时器4初始化
" B- [- u2 @2 s u! W& |*/
- X6 ?! a$ F. Ovoid TIMER4_INIT(); w) j8 }5 m! a5 W K) O5 o
{' l, U! {2 K# E& S6 p s1 m
T4CON = 0x0e; //0000 1110
. ?4 Y8 `. N* Y9 n$ C2 U* N* w3 W/ X: c7 e4 B
TMR4IE = 1;
1 q c7 f- Z3 P& ~5 r( g0 v4 L TMR4IF = 0;
' u- R6 T3 i+ b K% [" }5 p( g+ u+ w( E p% b
TMR4 = 0X00;
+ h, w7 z/ _* J ( G4 v" P: r2 n; j1 X0 |0 m
PEIE = 1;( U. R: b2 k% _' b4 y0 }3 O
GIE = 1;3 w: U7 o$ ^, Z4 x* \
}
* s4 M4 U% Q& B! ~
1 {" S* i" ~. Z# l7 f" Z
0 U+ v1 b6 @' Z: r/*) b+ U% O& I5 s2 x: K
*@ PWM初始化
0 A0 p3 `2 _- j# C. M. S*/! J5 h( Z j, K4 K) S o4 d- ~: E
void PWM_INIT()
. |7 Q7 b* N! r2 V3 F; o: J& H{& T6 c: E! S6 E2 y* ~$ d
CCP3CON = 0X0C;% Y1 a: h" @! f: L. k1 s
CCP4CON = 0X0C;' S. A) F1 x' b
; n; K: ^2 t9 p3 x
CCPTMRS0 &= 0X0F;" [5 q3 h4 a& o6 Y% |
. Q( f# G3 K# _. r; I& E
TRISG = 0;7 A$ p4 }' I0 D- Y6 q, e7 @ n
}
/ q( b' Y6 v) O& Z- `$ n/ Q1 ?0 _. C. Y* P$ e# i0 h
/*
6 l* Z7 w) T8 [" ~9 s/ T*@Function 主任务函数
* |; }* d8 V% M*/- E4 v0 K" ^" c' E
void Control_Task()
- P+ b& ~* j7 m0 V/ }( `{% L+ P' _5 f! R, r! c3 B$ B
static uint Time ;7 j. I6 q% W" V! o2 ?: E9 N7 h
// static uchar State = 0;
! L7 o! A" { s9 ?1 E! [ static uint Record_Time;4 J& h2 Q4 f1 Y. E* R% M6 E, P
uint Delta_Time;! C7 D0 b6 U4 c
; s3 f* w7 e0 O5 F3 N+ k if(State == 0)
% R' x: W8 Q/ U3 G! e {! e. `9 W& N7 D6 U& g
Time = 1000;/ u& M) {2 _: [
State = 1;
4 E- L2 @$ A+ s q3 ~
2 E1 j: E* U. j$ j/ w0 ] } n5 I: {1 @5 N6 D
if(State == 1)0 ?+ Z$ |% K3 L% r" w2 O7 @1 i
{2 w5 |6 w5 n9 v9 F. Y9 ^1 v
PWM1(Time);$ `3 l, O, S: b: z3 C
PWM2(Time);. c3 w% J7 r t; U3 s
# G7 |2 G! c) ^% r- l+ n* d) l3 q! H
Record_Time = cnt_1ms;
# ]7 b7 H, U l% H 1 a. T9 `7 Y; w( S# _1 }
State = 2;# ~9 y0 `7 M [
}; x8 S& y8 n8 X
* h) T5 p4 M$ b" f% e; Y# B
if(State == 2)
z% M8 i l/ O1 N4 U0 ^$ U; f {0 ]# ^' \5 r- `
if (cnt_1ms < Record_Time)7 g; ]) p$ t/ c
{
) R/ U0 K! p+ l4 R, X- E Delta_Time = 65536 - Record_Time + cnt_1ms; : y/ Y$ D9 Y' Q& e5 R* |2 F" r6 S
}* |& \( ~# g5 G; ]# `6 B
else6 N' t0 G/ D/ q& H2 W
{
. H" k/ G# h9 k9 h2 G" q/ T Delta_Time = cnt_1ms - Record_Time;
' q, |* h3 R/ \; ?1 J# y }
. A6 s6 x3 E6 @' u& t3 `
, F/ b Y( F1 z2 ]4 _" l: o if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT: m( t3 |( J* v) n$ }% B
{6 H1 `9 s# w6 f2 M+ S: B
Time = Time - 100;
1 H. Q7 {, t: b( i' Q; Z* J; T State = 1;
$ ^0 k: d1 i4 @& p4 _9 Q
" [" k& s4 Y; K+ a3 E if(Time == 0)
5 h$ @2 H$ [+ R* e3 t" S: {4 b {2 P8 n Z) x" W0 m- K! p8 k
Time = 0;
- T2 V- I3 o' h* p: j State = 3;6 f, g* |# V; o$ M& f
}2 c A% L' n% L" p$ F
}
2 j# I9 E9 D. ^ }
# f( b5 ^; j; H7 L6 K2 w9 B; e5 S 9 g% W: Q4 T4 U' K g. Y
if(State == 3); W ^: Y# g$ @, s9 D
{
' [5 K1 A" V" [. r! r1 z PWM1(Time);1 X* l( f* Q% @$ R
PWM2(Time);
5 F# `/ U J4 P8 U 1 `! f& y! ^2 |2 D6 j
Record_Time = cnt_1ms;. o9 }+ \6 b6 @' M0 m {
, [" @2 f5 V' Q% t3 {- `- T: { State = 4;
0 m' w% d0 ~7 Y8 ]& h }
" Z$ a8 |3 f Q% \8 v2 b5 e $ B! r( M1 \' G: \6 g1 n
if(State == 4)
+ F: c4 b+ B+ w/ l" p4 Q. D7 ` {
8 p( i. {% {! g+ m5 \! u if (cnt_1ms < Record_Time)0 i0 `+ o: f e3 Y, C
{1 B; r9 U g' Y& c
Delta_Time = 65536 - Record_Time + cnt_1ms; y# j, g) M# h; p
}
2 K$ [- ~7 R2 s: n1 H else- f' ~) D8 A( x0 H3 s. v
{: U' E. n, T: b g8 ?7 s5 [% y
Delta_Time = cnt_1ms - Record_Time;
- E3 E0 s5 ^1 A }
+ y1 K+ Q0 {9 ~, u1 U$ j; Z: i ^6 |; N* C) M/ a- q
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
$ a7 I- c1 k; {; d3 u {
$ h: t0 I: r5 K5 V, E Time = Time + 100;
7 x1 v: U* j9 ^ L& n! l% b# Z0 R! F State = 3;
- D5 X! f4 m0 M7 z0 C # V( E$ t/ ?" J* {2 m: x
if(Time == 1000)
" p( z# W6 }' v. m/ w {
/ W. g- r2 B9 q2 d, ` State = 0;6 T! }+ P6 O I- E8 |9 [7 f+ O+ k
}
9 E% ~ s, [- \& j7 l3 R }* w$ d- \; T x, S7 m0 a
}$ ~7 M. B, T' r: y2 v
}" q: e- j& a2 [0 o. p2 x" u1 B
% ?# o3 W2 ?* j: M$ o- q
void interrupt ISR(void)6 f; z" V: |- h
{
: o4 c) {" o* R9 B5 m2 I8 I if(TMR4IF == 1). f/ E5 u7 B! ^/ R2 a' d
{
. c& s2 H9 s; \! n( K# b TMR4IF = 0;
- G: C+ ^( u; m J z5 M cnt_1ms++;
9 v; ?9 g! E2 ~% I: s
9 s/ K, z: Y( Y // LATF0 = !LATF0;1 G- M; r) t3 i0 }& w0 S
} 6 _; m5 Z Q# F) S' T: k
} |
|