|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
/ P( b* G- A8 m, b3 x( m' c0 E3 i! J7 Q4 A$ ^% C. F/ U0 ?
/*
- i- J0 s* @& E- o7 O$ E: m*@Name: PWM_led0 c3 Y% F) U6 Q, p3 @1 n; ~
*@version 1.0
/ Q+ B) e/ _5 b# I0 Y*@Author xiaopan- n' X x4 ~: S
*@Date 2014.8.2
/ v. f( @; o/ T/ H7 W*/
. J; i# ]+ w2 r2 q" t
6 P2 M) W2 J, C- d' N#include<pic.h>
9 G8 U, u) _# p$ o- l1 H#define uint unsigned int
! O7 b/ c+ K( G. m#define uchar unsigned char
! p" I$ ?3 r: C E, W' l0 ?2 ]2 L
! i! k# s0 c! a7 H" y. x6 s% ?( ?#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
$ s, ?8 Y2 G9 ?#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 8 g( B3 O/ w, O9 A% A
/ @* Y2 F" S1 \
uint Time = 0;/ k4 `, D& [" ?! s: S
uint cnt_1ms = 0;
6 Z2 V1 i: f! Cuchar State = 0;. G3 v7 A6 t+ G) [$ Q6 B" u
1 I/ D4 R# }1 o8 M& g' i+ W' g
void GPIO_INIT();
% R" l! H; D; W! v; a1 H& Cvoid TIMER2_INIT();
8 M* r* _; x, [! H" h0 c- O" a+ Bvoid TIMER4_INIT();
- B2 R, `- N, evoid PWM_INIT();+ Y- @5 ]- N/ A0 O' g& v4 f4 ?4 P2 z
void Control_Task();
3 \( h; S1 ~/ r0 E/ C. A
0 ]1 |/ B" k: ~# O r& m/*
2 L& I, g6 z9 i*@function 主函数
( W! u6 h* z$ w*/
. J$ E8 p8 W. U3 N' t' P- Yvoid main()
! R- w; d% z* o' ], `{
6 A6 ?* Q5 n: j% j, n! |8 P7 C9 G( _ GPIO_INIT();$ H; Y. W( N3 l9 R
PWM_INIT();
0 o: J. H; M* @, V4 V' S R: Y TIMER2_INIT(); //PWM利用TIMER2
" K: B9 c/ k8 [( L# Y$ o' e0 z& M TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
! k6 M# J- r0 K, a" E2 o while(1)* Q2 ^8 A: z0 i- N2 I
{
1 Q% e. {2 i# F Control_Task();" [& i! m. V$ q3 ^0 v- E% j N
}2 X4 ^/ h# F. |" i3 V6 U) f6 j$ @
}
& r7 y, ]0 x, Z: ^: E) P! u/* r7 N, c, Q9 d$ x3 I0 b
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
" A5 N% j# B4 Z/ e*/5 g) x% ~* k+ m N+ \( ]* O
void GPIO_INIT()- E4 m" W. n: @" b' k
{
8 o; z/ z9 [. W$ `4 y- x TRISG = 0X00; //设置RG口为输出$ w/ i+ j- R) o- e0 I7 H. e: O: n9 p
ANSELG = 0; //设置RG口为数字量% M& {) p5 v3 H) H& o. Q$ ]' @
LATG = 0; //设置RG口为低电平: i7 I+ }. w& o! D! o
8 w, [. l6 _) F2 P& |1 u2 A6 {
TRISF = 0;. ?( F9 w" c. ~' D* k6 G
ANSELF = 0;
Y2 q8 `( g6 F h; v( H- g LATF = 0;4 w+ K2 r2 H$ [9 o/ u; A4 Q6 M
}
0 `' E* t. @# z
; H$ v; a' Y( Y1 h/*9 D# L. M4 m, H( f
*@定时器2初始化
# }* \3 N7 t! d) C*/
" Z6 G4 e! W( {0 K. `void TIMER2_INIT()4 L/ q7 {1 G$ ]# D
{5 z) u9 a2 w: K6 u+ E1 J9 j! Y
TMR2 = 0;1 i6 `' A. k0 c4 f7 f/ \7 `; B& b
PR2 = 255; //255
4 n7 n! r9 G) ^ ]) A8 I$ z! _+ m
TMR2IF = 0;& G8 b! X; h/ E6 `
& m6 @1 S5 U; W, o8 f T2CKPS0 = 1; //1
0 C4 q: Z- Z4 u T2CKPS1 = 0; //0# E5 D9 @5 |5 I1 m s5 R N4 f
& u& k& p' t* D; ?! h* ? TMR2ON = 1;
# v4 H- e5 H2 e. i- g* j}7 J: ?& ~0 M7 a6 a2 d- u, `
# w6 F/ g& s; e, J- }- C
/*
, h! Z0 `- v: M1 o" G*@定时器4初始化$ @ G9 h" L3 Y
*/
! ]$ v2 g& N8 M8 f& Kvoid TIMER4_INIT()3 w* h) `+ h5 x# Q6 E% i( Q
{
7 ^- r) Y" O* Q) x! j: C- K, Z T4CON = 0x0e; //0000 1110
$ A9 k8 e2 [, F; u( U, q1 C' e3 x0 @8 U3 L) U! P8 p$ X* a) L
TMR4IE = 1;2 }( @. ^( K4 l2 f
TMR4IF = 0; & }! V8 ], V; N* d) y, i
' ?4 ^" G4 x, D2 {: n. |4 F TMR4 = 0X00;6 `7 }2 A) n$ P; p# x. ~0 y: A
8 \1 ]: ~* Z* v5 v! @. h PEIE = 1;8 u$ W' ]( D. Z" \0 E5 j
GIE = 1;- u2 P( ?& e2 L& |4 F) z8 L
}
/ x6 _) E, y/ L. j/ j9 n( N) k
9 F5 R" @7 \5 l1 B6 R6 W7 [% b3 n1 Q. p/ R0 z
/*( T8 n. V$ n( l1 Q/ s) q
*@ PWM初始化# Z% d% @: _' R& L! r2 ^( p
*/
. b/ a/ J1 L9 n |7 @5 Kvoid PWM_INIT()( {5 r) k/ d; e
{
) ^% z# @- l6 W) l# J! _$ _- a3 m CCP3CON = 0X0C;
* ]- O: X9 A. w+ q( y- t. \ CCP4CON = 0X0C;- Y3 v' ~9 o& \" A/ |
: x( [5 P. a! D3 V* F' F2 E* L CCPTMRS0 &= 0X0F;) m6 v$ i8 \' u, I; Y, i+ g
% z' E6 r# T8 K9 ` TRISG = 0;
6 t) k- N# } N. R/ J}' y* n/ U1 \! l7 |9 g/ C5 j
7 v# |2 Y3 ?3 L- o/*9 I2 v7 k3 d2 I) _+ P
*@Function 主任务函数
% `% m( A& ?/ A6 \- S5 W3 ~8 O0 O*/
1 S/ Z& U9 v* ]& S6 I' l! h: p+ x# pvoid Control_Task()
/ x3 G' \; D& |: G$ ?. n5 C{3 v0 Q& c/ [% P( ]+ E& ?- G
static uint Time ;
1 m; m0 d% L' r x+ l0 f// static uchar State = 0;
4 n& m- D5 R' A8 ]* b static uint Record_Time;
% e* B$ x! {- S q# O7 S- D* a uint Delta_Time;1 k/ x. C. n" T6 }7 v
! B: h p4 A$ l8 d' T
if(State == 0)9 `) ~% s' G- Q9 t, v
{
/ s3 ]1 o5 O/ \; D9 n Time = 1000;
3 x* U! \, n( Y$ |- [% y- e State = 1;
: Y: F2 T3 i3 g8 @2 u! r! S9 r. @, w! L, m( r
}% O+ E) Q* e% M6 J* [
if(State == 1)5 ^ `8 [. c' i; Y4 |1 A( c
{, j: S! w% l# O# v B
PWM1(Time);
4 O9 i* U$ F7 f, v0 c PWM2(Time);6 p* \; h3 a+ ^: d0 \9 ~
: k0 Q3 L2 r) Z Record_Time = cnt_1ms;
- T- l& l+ V9 ~3 {3 e % f! A; x% ^$ }! J
State = 2;; `: {, S0 g1 s8 m4 g; Y
}
7 [* o& J# U1 I6 ]
1 l! E7 v% {- A% M$ ~& W if(State == 2): t' Y. J* r3 j8 ], W; S5 I
{$ y/ h- G. m% E
if (cnt_1ms < Record_Time)0 v, R8 B; J7 W" a; e a9 @3 V
{
& o! F6 h" e. t0 N Delta_Time = 65536 - Record_Time + cnt_1ms;
' l0 W5 r) K1 P c }
' v4 L, y/ W2 G+ v1 M9 {: D* d else( u2 E5 V$ z8 w6 j4 M
{
/ f" o; ]* e2 E Delta_Time = cnt_1ms - Record_Time;
2 c, u; M. l3 x- s0 [# @- I }
7 K5 @3 F8 Y2 R9 o4 t
( r0 ?( E& x9 C4 }5 c2 k if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
. _8 Z* f/ ]8 G {# U& q6 J, D* O# h" A. _& {/ Q
Time = Time - 100;
" z, E, z6 z& p# R1 [2 C1 D State = 1;% k6 Q% G6 |, }& x
4 ~! o# _4 q2 n! T7 r* G if(Time == 0)3 k! D% B2 o* L' g8 N) m3 q
{
$ h5 ~: e; m7 Y* o$ I" s& J* R Time = 0;
( _6 j% l( K! ~% ~5 E9 A$ h6 v State = 3;5 l, x" X, W% v# J7 v* g
}# F) N; j0 @" l3 h$ r$ o
}& d4 B5 q& `! v2 ]
}
9 e' U8 i. P* J5 y 8 ^) u. Y P% S- V% n
if(State == 3)
1 U) l5 x$ y) D( u9 r! E {. D6 y6 ~; ]0 i7 A+ Z5 c2 p
PWM1(Time);( r1 s n; `* C9 [& y
PWM2(Time);
! o* g5 k& N$ R2 d# C
2 f$ U U+ P: U2 x Record_Time = cnt_1ms;
+ K4 _2 Z# O! p2 C
K& M5 _8 L9 ^6 s. | State = 4;
! J6 L! V* g5 n5 x# v3 U }, U' x( ~! s7 R! T+ A
2 ^ B3 R& h: M% @+ p9 ]0 U if(State == 4)
2 m0 K1 a7 w& C: T S4 n {
# E5 \) k$ k O% O0 Y if (cnt_1ms < Record_Time)
* N3 n. `8 j/ w n, N {( a& t9 E* \2 _) ^, H K
Delta_Time = 65536 - Record_Time + cnt_1ms; 5 M+ n* }- k7 ~' q
}
" X! M* J0 {3 _ g* Q+ c, t& v else
6 J+ G( \& V/ d& G, N {
/ j$ f( N* h! F+ D, Z: M Delta_Time = cnt_1ms - Record_Time; ) ?0 [- B+ x! h0 I, y
}5 N- Z9 S6 i7 z& [1 f8 d+ |
: g. ^, X9 Q6 ^* s& u$ q: a if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT" f; Q! S2 F- r) F4 u! C
{
6 S/ l8 d2 D* d1 Q4 d Time = Time + 100;
) k* G! b% E, E/ T State = 3;
' c' X: J8 N) } j D; K* {# \
4 X. w6 d! X9 z' n2 c8 X- o if(Time == 1000)( m. d1 ?0 ?- t7 s2 [8 C1 A
{
- y" k7 @# b# [, V) f- @9 `! d State = 0;
9 ]0 ^8 ?: i" ~, b/ I8 X( A }
) o7 x1 x ?) `: B }
, ]! A, P7 N* a/ l: }$ M% s) o }
) O9 G" l5 k% Y9 Y# b}: ?! y9 Y; {( d: I4 ?$ n4 s
8 T, t4 y% k" Hvoid interrupt ISR(void)4 h- f: Y; L+ L; }
{9 k- @1 G+ M. x9 I: A) ^
if(TMR4IF == 1)
4 V( r4 }! Z& I1 b; @ {
& Z6 Q+ u# ^* Q1 r3 a% p$ m+ T( B TMR4IF = 0;+ a3 m) ^" l; a" @* j! K
cnt_1ms++;
, g1 O" ]# y j2 `$ n. L, C7 \) Q
+ [9 s% u: G0 G7 s/ }2 q // LATF0 = !LATF0;4 O" w1 q7 g5 \2 j
} ; s2 D5 l3 P. u$ @' I$ j% l
} |
|