|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
; ^% w9 V8 S" K" D& H/ z# e7 E& m- g$ ?) H& f
/*
; ?5 H* @; m7 K: ?/ R9 l- }*@Name: PWM_led
# y! }1 o3 b/ h4 h4 t*@version 1.0
4 c0 Q* K, k" H7 U: a*@Author xiaopan
5 |' T% j% g2 m. ], X: Y, G*@Date 2014.8.2
0 t% v0 F1 Z/ k+ A/ Z, n*/: ^( Z1 n1 g9 l
9 P+ U* N$ I) z- S% N#include<pic.h>
) j9 ]% t3 c; w1 h m8 s' N% _#define uint unsigned int % L- [' Q2 { A @) u2 S1 [ [) I
#define uchar unsigned char
, Y8 Z K4 r1 _+ w
3 X; S0 B, Z7 B% V: w, A0 x3 |#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 , d1 C1 ~& @+ ?' @; h
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
X* _2 i5 b& c3 {
& F$ X1 k6 F( Z- `; O' J X C0 z) yuint Time = 0;2 d; l( J! N/ l$ p% l8 @+ v' D
uint cnt_1ms = 0;& ^# ?* I+ K' |7 g* o
uchar State = 0;
/ \/ ?' U3 e) m* A7 L' v& h6 X/ h( B. q$ h0 {/ N
void GPIO_INIT();4 G- ^# \# _7 y6 H) ]
void TIMER2_INIT();
# P/ i2 |* q( ~& |5 vvoid TIMER4_INIT();; H+ Q% d, E. ?# F( j/ K
void PWM_INIT();# [; M) @* k# |0 S2 {
void Control_Task();
. n" M; R, N2 W$ F; S& @8 ~& b
3 y( A* s* a, n, L' l* v4 T/*
0 r: ^3 v$ v* h$ {7 @*@function 主函数' D4 ~1 d3 N; q
*/4 t+ f9 c) b3 D n
void main()
& \$ g! d: n2 C( I{+ t: M6 ~# k5 U4 b- P& N* i) n
GPIO_INIT();* Y% q* S* x' I' `6 e( v& e
PWM_INIT();
l9 k9 V4 O% {! ~6 I2 d TIMER2_INIT(); //PWM利用TIMER2
8 {/ p/ C% G8 J( c' b* D# \8 y7 q TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形$ _# ?0 W) `. M6 [5 M
while(1)
+ m% ^ e' ^. p0 ?1 R {
9 V) d& P) N% v0 d$ L. h% } Control_Task();7 P- E- d2 y) ?5 D7 e* s6 j- d
}* q) V+ ?: U% r; L
}
1 s; ?1 l- w9 P% w# ?2 F( {/*1 E5 c' F5 ^# g& C7 M
*@Function IO口初始化 RG0 CCP3 RG3 CCP4! e% d( _& a0 r4 z4 I3 z/ K# a2 L
*/
" u( i4 ]' {+ O' ~void GPIO_INIT()0 m+ ^. B$ p4 g
{- |" e- t( m4 U: z" o
TRISG = 0X00; //设置RG口为输出6 Q2 @2 g7 `. o) g* P) X4 c1 G
ANSELG = 0; //设置RG口为数字量
8 a: R. @( y. R5 A LATG = 0; //设置RG口为低电平) X) `& m# L" q" R8 [ ]/ s+ u
% F/ m* D5 m. P* ]0 T# {# b
TRISF = 0;
6 L5 X1 n( P2 B7 w ANSELF = 0;
5 Z" w b5 v9 j LATF = 0;- ]$ X1 I+ j3 a6 w+ k
}/ T8 C; u0 [8 O, i' a
6 H2 [3 d# W5 I0 z
/*
5 j: O) U {8 ^; _% V- H2 P*@定时器2初始化
7 t5 C; d6 F9 g1 F# O1 t*/- V& t+ f& r7 u) Z2 {& F% ?2 ]
void TIMER2_INIT()8 Q4 K$ u: n2 y L. m
{+ ?5 G# S$ Z9 Y# c0 X& H
TMR2 = 0;
9 N+ W; L/ _6 F9 l( O PR2 = 255; //255
' B# I6 y- d P4 U3 x * U e/ N" N7 B, i7 a" c
TMR2IF = 0;- e3 b' F5 p. p$ K: @, Z
) Y; F7 {0 o0 c& A# a3 e9 m T2CKPS0 = 1; //1% j8 l& X8 [ m f4 N' Q
T2CKPS1 = 0; //0
0 h, F1 J8 J) q/ t |, [ 9 X7 {! N; t) w' e
TMR2ON = 1; 9 b. Q/ @% V2 d: t; [% d
}
6 e8 i* z* Z J/ B4 f3 |0 r s3 N1 }- T: B* r0 e y" o
/*/ I6 l3 l, d; R* E! E2 q Z
*@定时器4初始化
' d7 u3 }0 \: |*/
S2 ?/ y7 ]: P5 X& ~6 K1 f3 l1 ?/ Zvoid TIMER4_INIT()
) }: U3 G! \! R) L7 M4 ^{0 l6 a) }" `+ \" i" g4 W4 ~
T4CON = 0x0e; //0000 1110
% _% z0 u5 u% I' U4 e% x! n3 n. K/ B; y
TMR4IE = 1;
' Y. k& F9 J7 W! e0 ] TMR4IF = 0;
1 f4 L, `; `2 q; `+ i9 H- V% S
2 G$ E7 ^6 W1 E9 c6 S' q& V- P: [ TMR4 = 0X00;- I' U+ \4 Y1 }1 N; C
8 u1 ] q$ c7 B9 Y+ T PEIE = 1;/ n6 D7 K ^+ n) u% l
GIE = 1;
) o# {. e* k5 N2 r- {2 }}
0 Y2 l" `) I& o3 r! |+ F, N9 E" Q' c
0 |, w( u$ Z0 @) R' `* e- Q9 G! f; b$ @7 u; s: ^
/* p s1 n7 T `& M+ B
*@ PWM初始化
3 B( I% f1 `1 i: H0 w*/* e5 o7 T; P, d$ g% h
void PWM_INIT()
& T& `+ V7 p( b( r+ ~. c: p{
* Z/ Z# T* H Y' k4 j1 n. i/ b CCP3CON = 0X0C;
1 V$ D( r* T4 n* N3 ]% G CCP4CON = 0X0C;6 s7 l/ q# i% q( p
/ S; @; M: H. R) g% ^( \5 N CCPTMRS0 &= 0X0F;$ b$ @1 g7 H1 y2 U
; }, f3 Y! U7 u/ F TRISG = 0;
# C0 d- L j* j}+ d/ i3 C1 c& x4 j, l' t, R( k
& Z8 D2 S6 V. K" p4 b% U+ X/*
" [: r3 |7 x! d& ~1 x; K# m1 b*@Function 主任务函数- _* e/ R7 q% ]: R+ p6 `! |! n
*/, @) m2 N/ M `, N- V! G
void Control_Task()
9 u2 @8 d/ L% _! D2 G{; ?& Z! x) _. m% o. }
static uint Time ;
8 ]8 q2 D! f$ u9 _& } Y" |// static uchar State = 0;
. a" L8 C" V5 x1 x9 T8 M+ ]' Z3 m static uint Record_Time;1 V a! I6 p$ y
uint Delta_Time;, E/ K9 ] j; b6 o7 S1 i' Z# @
e! i9 Y6 q. g
if(State == 0)* p% e2 S" N1 z$ C) p* g/ K# z+ f
{3 @6 h. o7 }) K- O
Time = 1000;, ]! p: D1 A0 R
State = 1;4 P* _1 i. K& n, [* }0 O. n
- J9 O4 I1 \; F* g$ n
}
. B; n" ?# v! h- S! `# ? if(State == 1)/ h' U& C" l$ i' g
{6 y! \) _6 q* S
PWM1(Time);2 f/ h1 `1 R: w, g8 \5 d9 K4 q
PWM2(Time); j6 X, K% _' E
+ y6 ]0 m2 s0 Q/ ^4 I1 B Record_Time = cnt_1ms;0 c4 t) H% s' c/ u( L
X4 z9 [2 O- U0 b8 b o State = 2; c' u: h' h/ i6 Z' Y/ k5 [) B
}$ l) G3 l1 w" e) F
& x, f, S. u& u# f: [' ? if(State == 2)' d7 n3 p) _; U2 n8 t/ e7 }+ g
{2 C7 Y7 n9 x. J& S
if (cnt_1ms < Record_Time)
3 c0 }. S6 Q" ~/ v4 O {+ S" G" W2 A! q
Delta_Time = 65536 - Record_Time + cnt_1ms; ( e5 ^/ L( Z2 m
}6 x+ v; {" T m- s
else4 B: L. d4 \# ]( D# h' |8 t) M- m
{8 M8 l1 \8 B- S- p
Delta_Time = cnt_1ms - Record_Time;
+ }0 m5 i% K) p3 D. H, @ }
/ |7 d& S# V: V, _8 T v; T
: A+ J( y! W' X- b0 M if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT3 |, f2 m' z( K4 e
{
1 }+ _ `1 a4 R: f. H Time = Time - 100;
7 t! p% k" y- I8 l0 G3 q8 ?5 }9 b State = 1;. Z+ G- l7 M+ ]" t- a
- m7 d- f( e/ G6 B- L if(Time == 0)
R V- h/ N: ~. l9 _+ \6 W F {0 ]+ d3 ?: \3 }' Y
Time = 0;
$ r7 n3 H* i1 w8 ?' m State = 3;
$ X9 P% D; J$ I" T0 z6 U: U }5 l n7 L6 `" H
}
& Y2 b; N% C- X w }
4 U! p( O3 H) L - Y; Z# ]; h% y( H6 W
if(State == 3)
3 ]% q0 d" |' v$ U# u {7 i. x) B5 ~( d7 H4 b- j
PWM1(Time);) r( [# v. j4 [3 m! {
PWM2(Time);2 c; l, ]- y! [; `# k
2 {: V1 V: y" J; _' a Record_Time = cnt_1ms;4 C; r! D1 F/ U
+ R+ s3 n, u2 @% v! X; y+ V: W/ D
State = 4;
# I& t' w4 U+ Q; L. N }$ L1 X9 P+ z+ L' t* z" w A6 e9 v. i
, i) c/ T/ {8 F. A* {+ U8 F0 l if(State == 4)5 K+ n7 T; ?" v0 A7 E& ~; h
{
- i3 G# M& C2 p9 H3 u" k2 ^1 S if (cnt_1ms < Record_Time)
0 b$ N/ k) W/ Z% ~5 ? {9 [' a. t: n5 l, i7 X$ p* a% G
Delta_Time = 65536 - Record_Time + cnt_1ms; . e3 e6 r4 H" U: G& T
}
: P, z+ d9 U5 K- ~" z else3 @& w5 A/ X7 o7 Q' S
{/ X5 M5 v! A3 V0 g' m/ S7 T9 B
Delta_Time = cnt_1ms - Record_Time; # F6 {+ a- I) f' f( |
}2 y# }& l: S5 m+ @
# [+ }# z) `; X h) C if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT% v5 C4 `' T- ] o" }( G/ G
{3 y; O8 r- X7 g
Time = Time + 100;$ _! A J4 [& i! q H5 b9 v
State = 3;
; n4 m2 m! v$ B% z
- @) F( t. U) Y: {' U/ ^% f. I) Y if(Time == 1000)
+ v9 I' k( [2 l6 k6 h' k' | {
( |9 Z1 u; u4 q State = 0;7 |5 F6 [/ M$ ^/ b! Y7 m
}* y# E( _7 @8 k. [
}
! k" {* [5 m" d6 x$ Z }
! \: S X$ x8 n: J: C}9 P" b7 A* J" P* ?: v/ ~
/ x8 k* f& x; l7 vvoid interrupt ISR(void)0 ^, a3 ^* R4 X+ L
{
r8 e+ l) ]) ^- Q3 }2 V if(TMR4IF == 1)7 L6 V- C( h* O( G
{
; Q5 i# @6 F5 R8 d, w0 f3 P1 Q" D TMR4IF = 0;
4 q; c! G. [) M+ R cnt_1ms++;
B, z& I. P. L. u
) _- n$ O& O3 Z2 t6 _ // LATF0 = !LATF0;8 R# v% v1 ^7 {
} $ G" d" D: j0 b; v! d
}' I2 n Q1 C& M4 t! v/ W5 n
|
|