|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
# [& j' M! f t1 w
( h; c! U+ f9 L7 t/*( X9 o. b2 B A7 g/ O) Z
*@Name: PWM_led
4 y, A/ I% S7 b0 `2 Q' R; `*@version 1.0: N1 ]) k5 ?" p8 G: g: H( Z
*@Author xiaopan
1 C# K4 K8 i( c% [; [*@Date 2014.8.2
% \) T5 q$ l. B: Q% ^ S, E*/
! W( i$ ]* P' ^) y) G
, x) w; H5 Z4 J$ r5 F0 j#include<pic.h>
/ F S' f/ U6 E#define uint unsigned int
, E* w& X' x! `) O- J1 t3 z# v#define uchar unsigned char/ K; y+ t% Y# x4 t7 |
. T; Y; S7 S. D4 @#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 0 K2 o, u% P4 j1 ?) p
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
: u9 X6 J; F. s' m; u" J* a2 Y P
6 V% \0 E, ~" _6 o! G3 c9 Xuint Time = 0;% r, m3 h+ T8 N- x# L( ?- P$ q
uint cnt_1ms = 0;5 P' b8 `# m7 p/ ~9 G8 e& f4 o2 n& o
uchar State = 0;
# Y6 x2 w9 _' @) C4 L2 O1 p1 Q; M C! {& j. O2 [+ }. J
void GPIO_INIT();
1 x6 C+ t* ~, d" W* @* svoid TIMER2_INIT();
* Z$ v$ ]9 N& Avoid TIMER4_INIT();
, p6 b# ^: v' q+ E2 jvoid PWM_INIT();
; S A9 @. l; rvoid Control_Task();
3 k0 m; O" O$ L8 P% B! \& i
7 Z; Z" J2 ^: V# ~! N/*
8 R1 W; R/ N t, n- h9 q; @*@function 主函数
0 f1 J. I+ T* m0 I*/) W9 ]! D. S, }# k% V1 [! m! o+ e
void main()
4 p" z- E0 U% ]6 k- Q7 V4 ?; y; |' s{7 I8 u0 u0 Z# u Z' F8 f
GPIO_INIT();
5 U/ N. u8 Y! R" P) F PWM_INIT();4 s4 \7 c8 e9 D. h! k& ~
TIMER2_INIT(); //PWM利用TIMER2
3 `! v$ [3 t% T5 s3 { TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形; _- T: C# @! M9 H
while(1)
7 N7 m8 k0 i# C+ @& r! z {
. k# `+ E' d4 r0 B# B/ p+ ] Control_Task();) c# o- J8 y4 M
}1 G& H' o/ D2 n7 u
}
( k& c: |/ {+ ~6 L9 H2 N/*
8 \2 C. O5 G7 c `6 l, l4 C5 K' Z*@Function IO口初始化 RG0 CCP3 RG3 CCP4
9 F# |' P& w- p' \2 h*/: w& u, f5 I' ?6 R# u+ c
void GPIO_INIT()
( D5 e) m# b' ~% x/ V# X8 l{
- j4 x. U. v, l% @: S9 X t( k, v TRISG = 0X00; //设置RG口为输出. t3 b! z5 i2 [& ?
ANSELG = 0; //设置RG口为数字量* j% T0 G9 V$ E# l
LATG = 0; //设置RG口为低电平
L2 c& R9 `( I2 u4 i * d: C- J+ b; g4 p' Z+ p J" ^
TRISF = 0;0 a- F! p t4 B( `1 N1 T
ANSELF = 0;9 ~" W& W, x3 n) A5 y
LATF = 0;. [) r3 v' g) Y
}
) h- c1 e2 _; G5 k# M u+ N0 p( g/ t1 v
/*
& h& u* G% N3 t1 ~8 L*@定时器2初始化2 Q$ m# ?2 L3 |7 o# l. a
*/
* y$ \5 M4 e( \3 n1 r& Lvoid TIMER2_INIT() K$ o; Z2 W% d9 a v. v
{
) l% h9 K* u2 u7 ` \0 J TMR2 = 0;
: ]3 i, l0 @" T/ P8 s( m PR2 = 255; //255
$ V7 E" j7 G+ H0 M/ \4 A" t# }, ~2 d
% d; ~, Q; B* W) j6 F TMR2IF = 0;* g* B3 N7 O8 H6 C5 w, a9 m
) K9 D @& T* G1 c0 j$ x T2CKPS0 = 1; //1
' I( k# S M8 C+ y, y$ | T2CKPS1 = 0; //0/ e" ~" a" }) p0 `. f" c
, z+ M- c; B% Q2 ~, P N
TMR2ON = 1;
3 `( p' e3 ]9 p; P5 O}
0 n8 L, t$ M, F9 d. t+ F
7 @+ L9 N$ [+ K/ H q& X7 K- g/*5 J% V# r4 B. ?+ r, _
*@定时器4初始化0 ]% c, G8 B5 X* {. N5 f5 S
*/; V: p0 Q3 o. Y5 u$ S+ E: S/ C0 N$ I
void TIMER4_INIT()
& L7 @: d% ]) h- k5 z2 Z- ?( D' c{
* y4 |9 m, ^1 i1 A+ b T4CON = 0x0e; //0000 1110
) u# l, A$ B% }0 F' ~1 d$ }" c! \5 j- U8 g
TMR4IE = 1;
9 Y2 ~: s! x6 V/ B2 `% m TMR4IF = 0;
% O. O a/ s, [
4 A# g! ~7 g7 Z; M8 I TMR4 = 0X00;3 T9 \3 p( Z( K# j9 a/ ]/ [2 n
- A8 M ?, S" [2 N( z& f9 Y/ `
PEIE = 1;
. V' p7 X" ^; G0 U GIE = 1;
0 P: [. \0 h9 ?}( V+ J2 n- d9 M" K% ~* T+ l& `6 X
! [* h; R c3 q y2 M
/ `- F5 ?3 S& Z2 x/ T, i/*6 j8 I4 }# {( h) N% ^/ C7 }
*@ PWM初始化
: v+ L% T" s L( H, n*/5 j6 X4 K6 D) A# z
void PWM_INIT()+ R( r! s" H) K+ g1 w9 |' o: @
{) L6 m+ B8 K% v3 R
CCP3CON = 0X0C;
+ \/ b4 }/ _4 `7 K# A+ } CCP4CON = 0X0C;6 C3 \( k* j+ b$ a. h2 j
$ k) m9 t! [- y# C. n4 \ CCPTMRS0 &= 0X0F;4 ^- i5 a) ]5 C% V% _
' y- A( S3 {* f TRISG = 0;+ M5 t: G* T- i" v% n5 I. b7 I" r
}/ i4 }4 A3 i* z7 n
. g6 G0 }8 O9 r( J! y- p# r
/*+ |4 | I( P* Z% J. f! w
*@Function 主任务函数1 }- E c. \& s
*/
5 d# e0 r1 R( O+ D* jvoid Control_Task()2 c1 f0 N, \6 n @
{
; z& D; g' e5 B9 g `7 ]- n static uint Time ;
3 G% T9 {$ y. w: P// static uchar State = 0;
$ ~# B. \) [! o2 E static uint Record_Time;, U# J* I+ |: i& r. Q7 k
uint Delta_Time;
* Z9 E( V+ R/ u# H1 B* M0 k- ~ , `. z6 P: x* @6 d' u( y6 m
if(State == 0)
- a: g% q" @: z/ N+ i, o( y7 f {9 A+ z1 X7 y& M6 U( o
Time = 1000;
1 _, C' ?: S/ k State = 1;
1 ]& w/ X l' Q* o4 z% F. n0 l' s9 e
% G" \ b6 b( j/ `: H }; R2 e( @+ N) e& T, l, M6 H3 `: v& e
if(State == 1)+ B$ ^5 b6 `. H0 j+ l. M+ C6 b, b
{% D, z. I' |$ y6 l
PWM1(Time);
6 w/ j7 T' T# ]7 ]" I. x PWM2(Time);; t. E' O; Y* x* x9 W
. b& C4 J0 Z' i) N! A% { Record_Time = cnt_1ms;
3 R4 [; V3 X& Y. C7 V8 K 4 R: \( A, m( x8 f
State = 2;/ d/ R1 Y" U5 e! ~* Z. }% n3 Y7 q
}
l; z* ?. z; O: i1 J% ^ # w, A0 P+ O: f) S4 Z B
if(State == 2)6 q/ D X1 z/ x/ {- z
{
7 W' Q5 O. M+ I if (cnt_1ms < Record_Time)+ }& |8 F2 O1 K( k) q
{- W1 Z; B: y( c
Delta_Time = 65536 - Record_Time + cnt_1ms; " [. ^4 |2 s/ ?. C& v
}# J5 r* ^% w3 A2 I
else
7 N* c& v" [1 Z5 M' O) m {9 p, P. ^" P7 C6 Z5 e
Delta_Time = cnt_1ms - Record_Time;
' B- o" Y: \1 O( _- l }
/ T Z5 t: \. v9 w: M) i1 x
- R& n8 i6 f7 K9 O. K$ x' v2 O, I if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT& {9 b5 ^' [5 C) _: m0 _
{- o5 h- T: @! g* K0 `
Time = Time - 100;& ^, V8 U* v' g+ E2 \
State = 1;' [2 J [; c& ]& G3 z7 y }6 e) d
& z3 g( c. ?2 Z( [0 A
if(Time == 0)
# h) b; \1 V, b1 ^2 U {9 T. A q- F5 `- i' v% c2 o; q
Time = 0;
9 g/ k; `% p; n# @4 e8 C7 b State = 3;
; C/ w7 ^) j# L- }7 W }* Q: v- |' e& {8 i' z9 v/ W
}
' }3 ~, Y. y6 X# s. F" | }0 z. a0 W; n4 ?) P! O4 p0 {
+ \+ ~' U5 a" c
if(State == 3)9 @8 {3 O& K1 f+ W* `! c
{- L- ?. Q3 u% H. O% O
PWM1(Time);9 @' j# z* d5 m# V& i
PWM2(Time);
- S) E3 Q, G& S8 T2 D
5 o5 m% Z. A. Q5 O7 ] S$ j/ J Record_Time = cnt_1ms;
9 w6 x' C$ m7 `8 a, j
6 j: x* A$ `: F/ X State = 4;9 B" N# x0 Z! r
}: Y f8 h& p! S& ~
' E7 ]) {+ W) P+ `: U' n if(State == 4)
- a& \4 `- v7 @: w' p {( I! x' D1 f v1 {8 u" c$ d
if (cnt_1ms < Record_Time)4 e( y# X0 n5 G; d6 I* i6 w0 V5 u7 l
{( C6 ]9 e) G9 |. g+ i
Delta_Time = 65536 - Record_Time + cnt_1ms;
2 [5 G( {/ p4 @7 Z6 y+ |/ F }8 p4 R v2 \- J& M% \6 z# h2 O& [
else
Q6 @ K! n1 b# `" o# d- A* z {
. I2 V# g0 i) H Delta_Time = cnt_1ms - Record_Time; ' s m8 E2 E8 o# n$ }
}
- g. ^+ |9 F, }& R# R8 m
/ Y2 e+ B$ f/ s. ?: U8 ^ if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
4 T) V8 S( k$ \; ] {
6 X, V0 W( P( k( k Time = Time + 100;
5 @8 a2 G3 M2 Q, u9 \+ L1 F State = 3;# t+ U8 s" y6 u" ]( @. R* k. _
. G/ w5 b9 P* M1 `* @ if(Time == 1000)
# s' m. J, w5 b1 P/ L5 R; G1 J! ` {0 n1 ~. C3 o q# Q3 c. E
State = 0;
/ d8 @8 Y2 y9 p2 t* K2 B$ Y7 W }
5 ]* [8 l# {; j" E" @! @ }- S+ R3 l1 `2 s9 ]7 T
}- S6 N" x, F' c3 u& g
}1 n* O) L( v6 I3 Z P, d
0 l/ `# \9 `) x) q6 j6 _ svoid interrupt ISR(void)
1 D' h) K8 U3 \0 K0 m{* e5 y; y0 e) X$ K# U3 G4 }* {% e0 S
if(TMR4IF == 1)6 i: C$ b& \* K8 B
{; o$ }& G \2 G: G# E& {
TMR4IF = 0;
! h" C" _+ f4 Y0 P9 P$ | cnt_1ms++;
' h0 B8 }2 Y; j, {; q1 p
0 Z2 h8 m! t$ a* N" D' L8 o // LATF0 = !LATF0;
! ? N i) g; j }
2 w% g4 K& C( A! z/ A) j8 }} |
|