|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
5 M9 H8 o0 d- E0 T0 @& Z& q+ r# T/ n6 T( A7 v6 ?2 O
/*
2 E( j+ v5 s' E$ {/ |# X9 s5 G' i*@Name: PWM_led
! f* _& J+ o$ N, u9 z5 b*@version 1.0
6 }- \0 u# i5 u& {% I* n*@Author xiaopan4 E% J# W5 i3 B2 t- ^+ }: n
*@Date 2014.8.2. w, H+ o2 M) U! X4 m7 i
*/& s) c n/ y" |5 d7 Y9 e5 N0 L4 ?
6 W, `. l8 A5 y$ ~4 O. [
#include<pic.h>& J6 [( s1 l: R- T9 G
#define uint unsigned int
# @0 [7 r, R w: u, Y& C#define uchar unsigned char' V$ Z2 T; ~2 @! {! U( ]
4 P5 |5 X( n$ q% J% t4 G
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
- I8 q2 [; K1 F/ K#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
$ `* |+ d9 S% C9 \4 U
* d# `3 h1 \4 C( v# e3 j7 n1 Luint Time = 0;
+ V, a& j$ L1 Auint cnt_1ms = 0;' `2 W+ S* H: u) a& B7 j$ k
uchar State = 0;
' Q7 D; U9 y4 {! K
+ I: F9 w+ ]: _, |6 {/ yvoid GPIO_INIT();' N# k* E% |9 G. Q1 j
void TIMER2_INIT();, _' w" Z, H/ U
void TIMER4_INIT();
4 |1 B6 u1 p3 x8 Q2 q" Avoid PWM_INIT();
' G( G5 v, w# |% V$ s* Z4 [8 ^void Control_Task();
0 o) E/ g: [( ^/ H6 U+ D+ Q$ \; u1 q( S& d
/*. n; |3 @4 n4 N' I. J- @, G' I
*@function 主函数
) m# t- { O& y2 Z5 ?3 u*/
( m/ u& i5 L: I. a: g7 Ovoid main()
2 T8 Z: D E" y. V$ M$ v L{$ Q; O" m9 y/ G9 ~2 [& O O- d. {
GPIO_INIT();
( Y) y3 ^2 D! g2 C, o PWM_INIT();
7 V' p$ y. k$ y( L+ d2 a) `0 E+ Q TIMER2_INIT(); //PWM利用TIMER2
/ _5 K$ `0 o5 f, l3 Z4 H6 B- Q TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
! x& W2 {" P6 D) T while(1)
9 S! A; c# F+ H9 U7 s6 T {. B) j& O" _+ a: |3 |8 G
Control_Task();
$ a5 y, d7 u+ A }; q# l$ F) A3 ]7 U+ B) b
}% ?5 [7 _1 f. b" j
/*: K! R. ^ T) i' {
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
_* E7 h# G3 H+ ^*/ W* _5 A# |$ v) {% P s g! `
void GPIO_INIT()
& i, {$ o& t' A. n{8 [8 S: M) j4 c, n$ e6 N" s9 Y# ?
TRISG = 0X00; //设置RG口为输出
) B/ }5 y- q) G0 z3 k& O9 F+ T ANSELG = 0; //设置RG口为数字量
! g! s( O! j0 q LATG = 0; //设置RG口为低电平( E/ d, z& p; K C, J, X2 p
, `6 N; [5 N! q- G# T1 B TRISF = 0;
1 s+ t" B+ g1 H% |- v/ n* O ANSELF = 0;
2 y6 Q* T0 z5 l% { LATF = 0;! C9 p* M, q6 P# H
}; H5 E9 z/ w( E$ M3 F
7 N* _% l2 i: _2 V; i( F* j5 o/*; S% u( K8 D! j, n7 }" S3 e4 G
*@定时器2初始化+ u4 {, i% R. D0 V
*/
7 `+ D# n5 y+ `2 O B8 {* w8 xvoid TIMER2_INIT()" X" @/ ]0 `: ?( P( s
{( m( ~* l; W/ ^2 H
TMR2 = 0;
- T* {5 c' p8 [8 J k PR2 = 255; //255
) z/ J& \6 U3 c U4 `$ q$ b+ a , @/ C A. j& a8 m4 M
TMR2IF = 0;" V* B3 I' h; @
3 C; T3 ]( Q( Y3 \0 s
T2CKPS0 = 1; //19 x" Y* ]/ W, [7 c6 l$ R
T2CKPS1 = 0; //0; c1 w9 [0 N1 e% E9 d/ @
7 a/ [1 A5 Z: f: ?
TMR2ON = 1;
$ F- D* d! p. l6 P) c4 A: j}
+ k, N7 P: t. x p. l3 _8 p8 O( R3 h
/*
& @ N9 p* q5 J9 O6 o, ]*@定时器4初始化
1 [% i8 j; ^: d6 @/ c*/$ s7 \% T* _& C2 p
void TIMER4_INIT()
& s& Q% Q( j, d' G1 u' a+ _% W7 d{$ q$ v8 K! ^. y
T4CON = 0x0e; //0000 1110# A' Y$ y: s8 X6 a
5 H+ ^& F `9 A1 w; l& J
TMR4IE = 1;
( V. O; _) S8 [ z TMR4IF = 0;
+ ?; q5 T; F H; G( u9 b9 O% Z# q9 a5 u% A2 g1 {
TMR4 = 0X00;
5 F; V, m- x4 a- \; | : n4 z9 L/ E9 R. ]5 v% S( _+ L
PEIE = 1;
" K/ Y& @+ I, t. ~ GIE = 1;
7 Z6 N" c1 \2 e% A}
+ O" [% j2 l* q \- j; O* Y4 k2 k J9 T+ b7 k' f
B( j, z4 f) P6 R( a+ G/*
( v; G* q3 [3 R0 V; t) r*@ PWM初始化
9 R0 I" o5 |- N' ?( R*/
: y( N% ^5 y1 {6 E1 Fvoid PWM_INIT()
5 X* `* Q5 c' ] [{( Q) u2 S% U# j0 a5 o
CCP3CON = 0X0C; v' w' P8 B, i3 W0 d
CCP4CON = 0X0C;
; `8 }3 y7 q) ~: a% s
; ?7 Z+ j( t6 r% s( s& d* w8 n3 J CCPTMRS0 &= 0X0F;: y; v+ f$ L+ p2 p d9 Q$ \
! H8 }+ E4 F( n1 w
TRISG = 0;
- I" I! z% t# Q6 V} r9 l8 d* Q4 C6 q
0 F8 h8 M8 l$ j1 o' C6 M/*
+ U. j: e0 ]4 c2 W*@Function 主任务函数6 Y# D$ X% }$ n- T ?
*/
4 F- p. Q- \% L" s+ c) A; k1 hvoid Control_Task()
9 V [8 E+ A5 s& R1 d7 |2 p8 g{( |, e! C, b+ ?4 l' E; p
static uint Time ;
. V: b6 N1 ^1 q7 t// static uchar State = 0;
( X: k' M4 S* C: t+ [3 N static uint Record_Time;' H+ L1 u0 D: R; f. M2 S" S
uint Delta_Time;
- m. N- ~& R/ l& y& s. d
# r" m9 Z) o2 q: t# z if(State == 0)
& W- f% d( n3 k1 Q {
6 }. s; x" ?% U/ P: ?. }! t% i Time = 1000;
2 o- L, L5 V1 h0 f$ f1 _ State = 1;
4 M- F6 H, ]9 i- C& [; R I; F9 H0 |$ |$ u0 f$ z
}
, a! G/ c1 c% \- s3 U6 C if(State == 1)
" ?# D! o$ j3 K4 w/ A {: ]; h8 g: Q8 u
PWM1(Time);6 I' c7 i a6 `) ]* _) { i
PWM2(Time);) K. x8 W; f5 C z; B
% D# x+ z" X2 [, v3 M Record_Time = cnt_1ms;
. C2 ~. I+ U/ c7 b) j
7 D ^4 K2 ?! m' v" K State = 2;
) L, w2 }$ H8 \6 ` }
$ ?# x, d* X, D + Q/ @" W7 f6 @
if(State == 2)
0 D/ r, I0 \6 t1 ] {
7 D! {8 c) U$ X4 A if (cnt_1ms < Record_Time)
! \& W" l* } a- g4 } {
5 U6 o/ B/ v* o. C3 s Delta_Time = 65536 - Record_Time + cnt_1ms;
8 J6 K5 d- ]+ w: G; x3 g }) G3 H) i) B4 U1 A( J3 w
else
' X! V# u2 t! \. j5 l {
|- o0 `! t0 T% \2 z9 I0 o Delta_Time = cnt_1ms - Record_Time;
7 c; Q* a2 F& }5 ?- z* y- H; | }
4 U0 n3 w5 ]- g- a
T" G* J+ f2 U3 e1 L* [ if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT( {+ n9 t( l ^) O7 P/ `8 n+ N& m# V
{; a7 u/ o- Z# l" x( ?
Time = Time - 100;) a3 ]6 g& |/ @2 P0 p, S- l. n' \
State = 1;# d. v. h& c. ?; c- v8 I& s
/ l {; }8 i# g7 I5 G2 i4 G
if(Time == 0)
" [3 e& D* t' F% V# _' a0 ^& { {6 p- H. `5 `' f1 K
Time = 0;
: ~4 f: r4 T0 T6 ?: K; R State = 3;" o/ T0 g- d) o' Q
}) L0 @# w Y$ U$ K$ g! C+ }4 I
}/ F! b I' ?5 A! U( ~
}- ?# O, Y+ ?- B
( k X: @ Q) [+ e if(State == 3)
" u! N( [! h) e* f" d' d# D {
7 X v- @: a* ]9 i y( { PWM1(Time);, l0 N, K9 |, r* s& h7 J1 X- N
PWM2(Time);1 M7 w8 Z% S+ M j( p- }9 ^7 i
0 J I7 Z' ], H5 K ?1 c. k& Z6 |5 _+ {
Record_Time = cnt_1ms;
2 [4 ^; Q9 P" \ ' h% r" B j/ [
State = 4;
( L1 w I, b7 p6 [4 Y }+ G8 a( j) W- [% Y; c
2 B k: N1 e+ c: {. N
if(State == 4)
3 ]0 Y5 s. M5 d; h {
# M; I, E2 T* ?( _* Q if (cnt_1ms < Record_Time)
: H6 }2 n$ y9 h9 T" `7 B! W {
% _# z: P: c4 S4 e( g6 E Delta_Time = 65536 - Record_Time + cnt_1ms; # T' P2 `: l; L* E
}; J$ ]; A: I! W& d6 D
else
7 ~: i5 G6 y1 u- t6 X {9 e$ x( ^4 {1 `2 [4 k$ ~$ w0 `+ e
Delta_Time = cnt_1ms - Record_Time; + R5 s! v0 |! f7 a% [9 h
}% Q6 Z) {8 D( z- Q; |+ \% A0 d% z
3 b0 d/ w9 M* Z4 m% b
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT) o- ]% S0 A" \/ Z
{
9 u: R, e& r- U4 b9 b Time = Time + 100;5 L. K J. u9 S
State = 3;4 `6 I S' b5 B5 J
& W8 T; T* B" |: u3 X0 j; t if(Time == 1000). C/ B% ?. o) ~- y! ^
{
" S+ \% H7 ]$ V" I( N0 [2 s( e State = 0;
& R0 X: C0 v, e1 m' b7 }# K2 | }
* t1 L; O4 s/ A( t! a. n }
: E1 }/ l+ Q3 l5 P, f }/ X( [$ D5 v" Q$ t+ X
}
& w1 b: T" X( t4 @
; T2 `9 _4 T' |# tvoid interrupt ISR(void)7 |( U4 c7 h* G0 L: ~9 q8 w
{
* i. s0 N5 L( b( Y8 j. t$ ? if(TMR4IF == 1)" [5 u, I' {6 P( m( f
{
' `% m7 h/ F! c, \ TMR4IF = 0;
; j$ _3 M) g4 E" p cnt_1ms++;( E6 F( Z, ~/ ~
; |9 I( D0 K' X0 h1 A // LATF0 = !LATF0;) O$ R4 g6 U U' {4 H- W
}
" g; H9 p; X# z! [ I}
: W2 R5 o* }/ k+ j |
|