|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。+ a" x2 w& P7 r$ V& z [" b
3 V' e5 U' j+ D8 ?1 ~4 m/* Z% G1 `0 s4 P/ W! Y2 k- \
*@Name: PWM_led
0 ]2 j1 R( B# p" P/ `*@version 1.0
: \# X9 a( X- G8 `% @*@Author xiaopan5 \" J& `2 Z8 P$ F! }/ M- b+ f& U
*@Date 2014.8.2
& t' R: y, A% C2 a*/) g0 u4 L9 U2 ~$ T1 K* }# x* P
N- k8 R7 d, ~- d C5 d
#include<pic.h>
- E6 h( q+ v6 G8 U. N+ B4 E* O+ s#define uint unsigned int
- I$ v2 }: {! x! Y& n' K! u$ f#define uchar unsigned char) M. L6 E& d/ m( R% S/ ?% s
( s5 v8 w+ t# u* F& c1 v) v: G#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
7 a. C/ Z7 t$ P/ G3 Q# t#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 3 E+ q8 @! s; f+ C3 Z- V5 M
. R5 a0 k% n( ]
uint Time = 0;
* ?/ t* N, N1 t0 j+ \uint cnt_1ms = 0;; L4 G6 r1 q( v' }* H, W1 i
uchar State = 0;7 o9 W3 {; W/ j% u3 u' i
) H: g: F! s. |, J* e: G1 n+ A( Hvoid GPIO_INIT();
$ m/ L- x6 k; g9 O7 Wvoid TIMER2_INIT();
3 z% u Z0 c3 e% B2 v9 T2 y2 Hvoid TIMER4_INIT();
+ D- e. T6 w; b$ c7 o- Y4 T( ivoid PWM_INIT();8 O& `, E! i% J, r( Z& d
void Control_Task();2 Q2 ~3 I# C1 R4 L& S1 r5 y% N
3 Q1 p5 u- o: h
/*
3 T7 V" _* Z- P3 t+ X*@function 主函数/ ?+ g2 d2 I) V; @( w
*/: R' N2 H7 D: Z: ^/ O
void main()
. G- i1 z2 Q( H. B) K+ t$ j) A4 h{
0 q. ?- n$ K7 ]& @4 O( x' U GPIO_INIT();
+ i5 c7 M8 b3 w0 D PWM_INIT();
/ P# j+ F8 G6 _( G! H* I TIMER2_INIT(); //PWM利用TIMER2: }; U4 R" b" \/ H% q
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
. X! ~$ S( [" I while(1)' _5 m. e) G# L7 t
{
: b q' h6 k( y Control_Task();
6 k9 b4 L1 r9 A0 \: ], s& S' k }' o1 j! Z1 n X
}* o5 f, c i/ O* B
/*+ O8 G/ r8 }: x) ^ K) B! K. }
*@Function IO口初始化 RG0 CCP3 RG3 CCP4
: v% |! X- Z3 d; y*/
- e& B& O! H+ J0 jvoid GPIO_INIT()1 W! f1 ]1 a( Q
{5 _ z* y# |" k$ n. r1 e
TRISG = 0X00; //设置RG口为输出( B: p5 p" [' J3 j! v
ANSELG = 0; //设置RG口为数字量* D k" e& ?* V7 @$ G
LATG = 0; //设置RG口为低电平
5 R% W0 k4 x% d8 C 1 W. V# l2 O, i- B6 u4 ?
TRISF = 0;$ A2 J ?- v" k1 |; Z
ANSELF = 0;
' a9 V1 x* K9 i' V6 M LATF = 0;
& V4 v4 A( w% Q/ l0 T$ a}5 j6 z: r& `! v& f0 w8 ?
7 _7 z, W, D9 G0 \! B/*
# D4 R0 o+ U, {. O4 l3 `, t3 V1 |! p*@定时器2初始化
2 ^! j/ M- d2 s, B*/8 M, W8 r: A& l! I- B4 {
void TIMER2_INIT()
) W$ Z+ ~( I9 q& e# C{
4 R' H Z7 d* B; A TMR2 = 0; C# d. T6 \7 M6 n5 ~9 L$ F9 O4 h
PR2 = 255; //255) x1 h, t! i4 a( p/ B6 o
8 E/ T8 G* F V2 R0 B' j TMR2IF = 0;
7 d/ w6 U4 i# d# s% y# g
9 Z, [: p- a% w( ^% _ T2CKPS0 = 1; //13 l1 o3 @' x9 G! ?( \8 o
T2CKPS1 = 0; //0
, P# h$ I5 L/ o) V, C7 `- v Z6 X
6 I; d h2 X: q. \" g6 y, O TMR2ON = 1; ; p& M7 ~. A4 ^
}! E0 r9 E6 W9 P. l4 _4 J! X$ o
6 `& O$ F: Y! R0 P, N( p, S# [
/*3 B+ C" Y; W" n8 L& W
*@定时器4初始化
1 M# t, {- E$ a8 S0 z1 S4 J*/
0 @# k$ @* C- b0 d& v s: P4 A# Qvoid TIMER4_INIT()
% x4 ^+ w& G0 N4 O6 U0 o; }{+ w# S C4 x0 |4 z# s* Z9 r
T4CON = 0x0e; //0000 1110, k6 }- F) H, q M8 T, p
* s2 y4 n$ |4 R( t4 d TMR4IE = 1;2 `) H7 \9 c: F% D1 {6 o, P& V% j
TMR4IF = 0; # O M- a) }9 z9 \# `
8 I5 i! k$ Z8 o' X7 v# \6 H TMR4 = 0X00;
* c; {( N2 h2 q- A/ \: t $ ~# \! Z; f2 k. V8 D0 ]
PEIE = 1;% w7 k' G7 d) I
GIE = 1;
) {/ c% n: ?; O D$ E; }}
# d# r8 M" ]: S# V3 [$ e# ]+ l$ W; \8 A! K
* s9 g5 J, A- g3 [: a* R
/*
( P% \# g* q: V$ m% D( b*@ PWM初始化( o6 V0 A+ l. a- ]" W: Q
*/2 f3 m' ?8 E* n0 v3 B
void PWM_INIT()
3 R5 _6 m0 ]9 l( E{7 I( \/ k3 q5 L) D
CCP3CON = 0X0C;
# g4 Z+ G" B5 {; D CCP4CON = 0X0C;
~% d4 B, B) J; a& c# r 1 }1 `$ Y% @# v
CCPTMRS0 &= 0X0F;
6 i m2 e$ o2 m# o' m
2 a' D2 E3 m& I3 x! b1 A1 m TRISG = 0;
; j; o4 ]4 C1 K$ \}
# v4 _; J, l: m
" q9 ?0 ~. @/ p" \/*
$ x- s& ?3 l8 k' t7 h' g$ a*@Function 主任务函数3 f& z! S4 g+ o- n; G1 t2 `. ?6 d. [
*/6 _6 l# P* o! r, i. P
void Control_Task()
7 C X+ d7 z2 ?% `; t; a; I{
! h0 y+ K6 a9 |7 p static uint Time ;
5 P9 D2 l7 ` g: E1 `$ j// static uchar State = 0;1 d9 O- G7 a) \+ S% L1 y
static uint Record_Time;
0 O$ N1 w& |0 v7 v" Z6 k% {% R uint Delta_Time;
, |" v& b# |+ R: m/ r 6 t* F; R' s7 l, m' i( t
if(State == 0)
* R5 Y7 R' n2 ?. J3 t6 X, l {
0 E7 u- J. l8 S+ e Time = 1000;
/ r3 X9 N" _! n State = 1;6 z. K& |- B6 t5 V
% F" U/ J: m. N }
8 T* {+ J: q$ O8 H: A if(State == 1) c* l! k0 I% m7 O8 ]9 V
{! b$ B# J6 Q( _( f% T M
PWM1(Time);
) P3 i$ y- M0 R( G; u PWM2(Time);6 ]+ d& {! l) ]: |0 X- q9 y* Z
) I, ^! O5 |, h& w) U% J. b) c
Record_Time = cnt_1ms;# [! E: ~. i3 { }
_; z6 l1 `$ `- R$ ~. c4 b; {& k State = 2;
; M5 E) C2 v& P/ ^4 ]4 ^ }
1 D4 p& s1 h. {! i1 j3 H$ n: r
/ U% R/ U) f P" Q4 G7 y if(State == 2)0 o# s3 G$ G% k; W9 q
{
/ l }* k) v' F& s( F7 L) T4 M if (cnt_1ms < Record_Time)
9 y9 I8 A! k2 }( r {
0 z! D% V( C& A Delta_Time = 65536 - Record_Time + cnt_1ms;
) A+ v* V# f) O" K7 h6 Z/ d }, h6 ]# G* P6 s
else
" r) @! Z9 h/ F- ^% y {( [6 @5 }6 X1 R; p# I
Delta_Time = cnt_1ms - Record_Time; 5 U% h) `* c1 x+ g" }5 l. M4 y2 ~
}
3 Q2 P9 x& K8 n8 X9 _2 g$ i5 o
" o: q$ {' K X4 Y: n2 Y3 K if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
! J( b8 Z! z+ U4 t {. ^, r. h3 v$ G o
Time = Time - 100;# d! A/ T0 r" _5 c
State = 1;
5 p' M: ?1 e$ r! L! D# b+ V
; ~: X* G- O' l# G/ j8 F' F( F. A if(Time == 0)
: C# a! T* u5 ?- h1 y9 V: s6 L {3 |# y+ H& z: N& I
Time = 0;" C# ]5 m/ H' j+ h5 }# I
State = 3;7 Y6 j, Y$ n" l& O! _$ c- p/ r
}
3 {7 s7 ?3 l9 ] }3 E2 g! K, K- v1 _
}
( b7 M/ ^% i' v8 s* \
) ?2 H: j8 P: K+ v1 Y( [ if(State == 3)7 j1 ~- y& K, P5 j) i
{
8 Z O) Y, m9 ^9 | PWM1(Time);7 }: v& }" [4 I9 d. q3 c
PWM2(Time);" Z* x$ C3 Y3 e1 q2 j! c0 n
; Q: {# [7 ~9 D7 h Record_Time = cnt_1ms;# X" g+ m; I2 S a7 q2 I3 }: |0 `; H
3 Q; ]0 m, O9 Z& y: a, h A" A$ h State = 4;
0 W. x" w9 s8 [3 y }
7 x$ s3 C7 Q8 t( m2 Y: `7 U
* M% }5 l6 \0 R c/ P# e if(State == 4)
) U/ f$ Y" W v) T( u+ c% i: | {* z+ l" a- @8 G: z3 e2 A
if (cnt_1ms < Record_Time)
9 y! s; P2 a O+ L' n {
3 H) n+ ^0 U" b: d Delta_Time = 65536 - Record_Time + cnt_1ms;
% O5 M' Z! z" X3 i$ Q1 I }5 j! d( g( B+ j) E
else
& B3 X7 G6 Y! x/ t% k {
2 n) Z: D! `( k6 j( c5 @ Delta_Time = cnt_1ms - Record_Time;
8 G0 Z6 l9 V& O) K. r( R" B; O& K }
2 A1 F! i+ n8 y
& T# Y ~. T+ U9 L: h if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
1 F9 V& p& W: c- ]$ h {
; h( ]7 ]! e: e6 ^: M Time = Time + 100;
, V9 M, A+ T, b/ S; a0 q" i% @ State = 3;
" _+ h3 w2 I: @: Y# [2 I ' a' h" V. x' ?9 @: b
if(Time == 1000)
: G6 J; d2 a% ]- Z {
5 m4 ~) p1 Y/ I& R. }- M State = 0;% T+ a4 J( A+ k. R: I% Q
}, ^. K9 P' }# n- B* s T' W: W
}
1 L6 @3 p4 `7 [; ~ }
1 m9 E* U: u! A4 h}
5 u; K5 b# @% q' D4 C9 j
7 p% H5 f) ~" Y6 Mvoid interrupt ISR(void)
5 F6 W( Z# t* W% k3 t* c4 z6 X I{/ i3 E# {9 u% e; O8 J0 i
if(TMR4IF == 1)& I. h2 j, r' d& A1 ~# j7 |
{# Y: y* R' P# m& u& g* ^8 a
TMR4IF = 0;
1 ~) H3 U+ K) S7 z8 h cnt_1ms++;
$ {% D9 N& I y( ?- E; [! x4 a
0 s6 R2 V# O) G // LATF0 = !LATF0;
2 N5 P& t& k2 p' g% y } 5 K8 G7 F# H5 ~
}
- [3 w! q) d& H& s; K1 u |
|