|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
- e X0 H( l$ T. ], L) }6 S$ n) u/ V
/*' c. k/ l; Z' ~$ x( p
*@Name: PWM_led. L9 z! g, _4 d
*@version 1.0
( k0 ]7 M' |4 l*@Author xiaopan2 w$ W5 D: U' F H8 j
*@Date 2014.8.2
{' `, W# H& Y*/
/ `5 b/ ?$ V! F: Y) N5 [# `" m1 A! C9 x- D3 T* `9 B
#include<pic.h>1 ^7 V6 [" a" A: t( J
#define uint unsigned int & c2 L+ p1 }/ M* M0 L6 s" {
#define uchar unsigned char X9 l, f+ I9 T4 z5 _! f! L
* X7 O% N9 Y7 T1 F. K0 B) L#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 + a$ e6 t8 K% S' i. J- I
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
0 U" a* a' x6 ]: d* m( {% A! a
uint Time = 0;% V( R) o5 s: K
uint cnt_1ms = 0;
/ Z% ]- T0 V# Vuchar State = 0;: M/ v6 x, [. P8 i* ?$ M
" J- K' \, X v7 n7 n, G) Bvoid GPIO_INIT();
; o7 K+ w! z y0 y* |8 Y+ [( E3 rvoid TIMER2_INIT();+ h9 P; m1 B& B% V: `( Q/ Z3 J! l
void TIMER4_INIT();1 M7 Y7 x; G& W. K& X& k* o' S6 C+ |: a
void PWM_INIT();& x- C5 b1 z0 ~
void Control_Task();7 L& v6 U1 i% C* R+ n9 M3 D
; {& Y9 K, w5 n$ D( R+ b. u- Y/*0 S' O* V' ], @6 D
*@function 主函数1 f) h: W" @$ a% D6 J
*/
# G7 m; A2 P8 q% {void main()
/ |$ L2 [( h. h% P{
/ Y+ T( c/ |2 H$ }1 w* h GPIO_INIT();
, Y1 @& X* N: b8 F9 W9 u PWM_INIT();
$ j6 L( D) ]. K" i, p$ Y TIMER2_INIT(); //PWM利用TIMER2' I; \; f& k% O* f
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
/ r* z4 y1 C* j9 a% | n while(1)
- D }5 _2 F3 r8 g {
+ a# m+ `/ n8 B* S/ Y4 r( r Control_Task();
- ^! I- _) V( Y& V }
% ]) d7 y8 Q$ ]5 U& M9 Q}
% _$ O; I) Q& x$ t6 V5 R3 ~/*9 C( e7 ?( R) H2 N5 q" g
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
& D, }7 o6 w/ z3 U, {) Y*/
, Q$ C5 U8 T. l) j" [% Nvoid GPIO_INIT()5 W! A: F) w* s" o+ k' R9 q
{/ n4 V) H! r( J( f$ z
TRISG = 0X00; //设置RG口为输出: [" ]* R) c1 u% |& w# |, v+ F( M
ANSELG = 0; //设置RG口为数字量
. v; |0 e* ?5 R9 i) a2 f7 B LATG = 0; //设置RG口为低电平
' p3 C H; k9 a( Q/ E7 ^
+ Y- |6 Q6 S6 ^2 ?6 G TRISF = 0;
" F" h) k; A+ J) ]. n4 `% I ANSELF = 0;
A# f" c% i( D# {+ Y4 w0 @$ K LATF = 0;
/ X5 \' C% ^: V0 W5 a}
P% M, J5 k# u. G. f1 g
5 O$ G5 R# {0 h' R; k9 _* x5 |3 R. m/*1 p+ G6 Y% x# U) p. t {
*@定时器2初始化% Q* L! g E& \: j1 t
*/
" z3 x+ A' O+ P: \# ~7 k9 Evoid TIMER2_INIT()
+ [1 {# m* U6 K8 |' |/ C{
3 j4 Y3 T* E1 e' h7 f2 N& d TMR2 = 0;8 w3 K: C( o/ Y- {) x
PR2 = 255; //255
- @4 N- i/ q4 d; p0 V * [" S- o) V! g5 _, t
TMR2IF = 0;
$ R) [: ?8 J% T# M. y+ L: W 2 F% Z& e) h5 F- G- H* F6 R6 \) e
T2CKPS0 = 1; //1( w2 ^9 Q# }* U' X/ {
T2CKPS1 = 0; //0
* t. ?: T0 K$ S5 y$ s0 z
& j* _) T) r1 k, W7 ?7 } TMR2ON = 1;
' u m u8 {: V7 d1 r+ o}9 H: Q. f3 x9 X
0 Y' H7 G; f# }- h% M6 Z- s2 l7 k
/*
- g8 p( x/ y1 N8 \- e0 v8 g) Q*@定时器4初始化7 w& J0 T* u9 I+ }) l( D4 Y5 I
*/
- y0 B1 s6 l* a' |) H wvoid TIMER4_INIT()
3 ~, {- N* |0 F! x7 n{
" n, h ~5 W1 L' m* n T4CON = 0x0e; //0000 1110
/ O' V, w8 e7 X7 j0 U/ J( R N# `% Z7 o' j; o& Y" N! a1 N
TMR4IE = 1;$ d' \; x0 h- m7 l1 b; \
TMR4IF = 0; 6 O( h/ v: [* U, {
5 N$ b: }8 d6 m8 i- n" o
TMR4 = 0X00;
" f& x+ k3 {8 Q! @. L/ i% i, h , v" m1 ^& B/ X. v \5 l ?( h% D
PEIE = 1;4 D7 J% f& ]) l G0 H2 o
GIE = 1;/ J2 z' c& \; k% k/ `6 s6 _/ y
}! N' v2 ~3 W; ~0 R
4 f4 m& |, b9 q) {- M; ^1 q9 Q/ r2 q8 D2 m3 Y: r* x+ H- Q. X2 ^ T
/*, _$ x8 w2 v7 E+ K
*@ PWM初始化
w# Q: e7 E+ M$ F*/; Q7 r9 o9 B) M6 S% F2 `8 x
void PWM_INIT()) P5 m! T$ J: {9 H/ O4 i
{
: } V) }1 `4 Z# i# {( E* P CCP3CON = 0X0C;
l- K, h# Q& V0 d1 Z CCP4CON = 0X0C;3 ~) K; t' O0 f3 Q) T: ]
/ Z- ?7 C6 D1 ~' W/ \ L. j CCPTMRS0 &= 0X0F;5 c( r" P3 Z% p1 \. I2 ]5 G
0 i: G3 A! }/ d( P0 C/ |4 S& A) h TRISG = 0;
' K, g5 p% v! Z7 h+ Y/ B% w8 U, R$ K}" L, D; T0 L4 O
3 D3 H" O6 h5 ?! q% [ t/*( C' X' K: a. V! h: [6 }. }
*@Function 主任务函数9 \. ~& j$ m9 @8 O# s+ Z7 q
*/
$ ` o5 Q' F% vvoid Control_Task()
1 {2 ^8 q, t% O3 I/ N{
4 t. H8 t* U- O+ a static uint Time ;
7 [' l0 x! y d0 B8 b+ }5 L; j// static uchar State = 0;
. I1 w4 F2 F) V3 I4 a$ ? static uint Record_Time;
' e4 n# o7 q! `$ D8 b* E uint Delta_Time;
. u4 K! f, }. J) }0 `% q, Y
+ W( M3 N+ ^ N/ u9 D; | if(State == 0)
8 q) D0 w! t: Q P {" t1 v4 `3 C* T
Time = 1000;6 Q3 C' ?* L2 o, T
State = 1;5 u1 a6 ]5 w5 Z. Q3 T: O/ p
# K+ [) R: O; a7 v. _8 b2 ` }
# P0 K3 y5 c" R6 Q" J% y if(State == 1)1 S! ^/ N# }# B. a6 q
{9 R% H' H2 u, l! }2 Z' q2 ~( |
PWM1(Time);! e2 c- L5 A. f% P0 o) f0 H6 k: p
PWM2(Time);0 _/ ^5 A) R$ y4 V8 v
' C9 N) j: n7 _& D0 B4 ^ Record_Time = cnt_1ms;
3 X* j$ p6 L' o. ~( c& T 7 L6 `: }& l. p" V9 a
State = 2;0 r/ u1 R2 d* c/ d
}
8 o5 L: ]9 {+ a; R
8 s: |; |& @6 t2 X- r$ r- ? if(State == 2)3 Q o5 Q0 E: b3 T' W
{2 H( n6 X' c8 c( v7 p
if (cnt_1ms < Record_Time)
. u J0 s- b$ o. y. [5 ^7 k {
5 e: M! U# o& }) t2 ~ Delta_Time = 65536 - Record_Time + cnt_1ms; M% F7 ~& n2 W+ W7 N
}& D5 `' T1 J% H; ^+ z
else
n7 ?- e& o# w6 W% `8 {6 Z6 i {' z; f. j% J9 K0 g" ?' s5 {
Delta_Time = cnt_1ms - Record_Time;
& j3 P* C1 v3 N2 K K7 ?8 s }
S! Z9 e, z' K2 j9 O
8 ]6 X5 V: }$ b; L if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
3 e9 q; _6 Z% U* K {( a! ]% D0 @/ K. M0 x
Time = Time - 100;" v t) [. i. n. g/ t( ~* { h. d
State = 1;
5 L+ |8 m1 l: J0 P; \$ r) F
/ \! J6 N; Y/ i3 ^9 k! @ if(Time == 0)
2 M* y; t" J- r' C# V. ^ {
' ]' b4 M+ w4 c9 P' D ~ Time = 0;- F9 t( W4 x" ]
State = 3; C* g; `5 a% P5 L2 ?- v
}
5 O: _. w6 g& h# b& ?0 F }* W1 O* q5 _! |# s: ^2 k* ?
}
9 u8 M2 J5 j+ s3 @" g* Z8 b) g/ f / I# h: b( U0 c2 U4 A
if(State == 3)* X# Z* J1 d5 J/ V' x
{
0 w, M& l! d% }* S* [: N* k1 E PWM1(Time);
. v" L" [- c$ A: u) e, I PWM2(Time);( g6 v$ X5 `3 u( T7 Y5 a
! B& y- e& n6 i8 h Record_Time = cnt_1ms;
d; n# z, e6 P2 `6 l, |. J 9 H' Y% P f# G
State = 4;
5 Y: Q$ P( h! t8 J( j }
) G/ {1 c. s+ k2 |* J; d
7 u/ j" _% R9 K% d0 I4 T+ n if(State == 4). w. `; B& s8 ^, v! \% ~
{7 h- D5 r5 w$ a. Z/ j0 X4 H, Y/ H
if (cnt_1ms < Record_Time)
?; V8 v+ T5 F g/ W7 o {
' V4 `+ O% q* r" _ Delta_Time = 65536 - Record_Time + cnt_1ms;
+ K4 M% ~( M! m }
3 s) c- G8 f3 ~0 A8 F+ z else
* F/ |- `7 A& w# v. D {4 B, u5 X0 o5 g6 P' b% @2 \
Delta_Time = cnt_1ms - Record_Time;
3 G3 J8 B+ j' P1 K2 M" X* n$ u4 U( b }! p s& ]: w/ g# N
7 `6 t: [ X1 o# n
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT8 h6 ?' w( q9 Z4 a, F
{6 z7 C& Z9 D: ]- z2 V
Time = Time + 100;
K! d7 D( F; ?) E3 ?( t2 Y3 [0 z, K& F State = 3;
! n. }; v8 P$ y# T; v
# u, s- n6 y" f if(Time == 1000)
6 W3 P& \1 W2 H9 v {
+ u: |9 q) f8 C State = 0;
* r7 ]7 h5 J# K; j1 i }" S$ f N: q7 g6 I& U9 J: j
}8 v" E0 R# Z4 \& ^" k
}
$ q3 j" Z i1 T8 C# G$ p}
3 d5 H. K K! k) K7 _4 p# p- K# c+ m/ H3 a B& X1 B
void interrupt ISR(void)
8 l' `; K0 b! r) N! A! k{$ U" c7 J' F# e0 f$ `7 x
if(TMR4IF == 1). P6 Q2 \/ J5 H+ z4 a
{; H3 J [6 a6 ^
TMR4IF = 0;3 L$ V0 ^0 P; ]
cnt_1ms++;$ t/ U2 d6 A8 M S- y
& @3 M/ E$ o: ~7 X
// LATF0 = !LATF0;
6 h6 M6 p# [& ~, D r( @/ E3 ` } $ e: G+ ~, @1 _7 U
}4 c. G9 u6 j) C" v& N5 C
|
|