|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:) Q% @8 {" F" G, b
# @. ^ [ q t; L- F L+ _* g/*
% a! w; v6 E: M. m' D; b& D*@Name: PWM_led* A1 K2 m! s% b, O
*@version 1.0# n" w. q- D2 b) r7 Y
*@Author xiaopan
/ h$ |$ ?* N# Y: @9 R*@Date 2014.8.2
7 C1 {' n0 w% m; v6 c6 R*/
! ?& U! a4 s4 B7 h; q1 ?$ i" M' h
: H" P3 W- q" G9 z+ n7 `#include<pic.h>
% ?. ?* Q+ z# C9 [#define uint unsigned int ' w7 {4 E! ^4 m6 n! s: \1 W
#define uchar unsigned char. L# `6 }. ?2 l: U+ I' p
7 | B' L- ^1 f. y7 N. }
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
3 h6 m/ H- H- A; s( r% A#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 3 Z4 |- J: P2 \& t" {2 h5 i
6 A6 D- L8 c; \1 y
uint Time = 0;/ ^- K* a: v! w2 S8 |" W* `
uint cnt_1ms = 0;
( e( w; K9 I; c, o6 g/ P( \uchar State = 0;8 _- I7 \, @/ N! A# t P) l
* x; T7 G8 Z) v& S/ ]; V; ivoid GPIO_INIT();
3 c) \% c# n% Z, xvoid TIMER2_INIT();8 z8 L. m2 N+ z2 F: o& u% b: a* O7 U+ N
void TIMER4_INIT();6 ^1 V0 p( j- |$ s6 ?* _4 b& M
void PWM_INIT();
% Z( u" a) J0 O- Z+ X9 Cvoid Control_Task();
2 Q6 d! A, }2 v) ^5 e! R3 D0 u K- Y6 s
/*
2 p1 y1 J% h$ K- V) T( p*@function 主函数: {- w) T) t1 U$ {: x
*/
" o5 D7 A# F$ ^2 Y- Uvoid main()
. _+ n$ `! ~% o% C3 T7 z* Z{3 x/ a7 x8 o# g$ o U/ D6 e
GPIO_INIT();
1 |4 s, y2 i2 {; ]( o* _ PWM_INIT();
: s3 o& f# m- e8 h% a9 U5 z TIMER2_INIT(); //PWM利用TIMER2' R1 Q1 n) F" l9 J" L$ i5 v% t
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
; w7 u+ }$ Z. t% P9 i) u while(1)" i9 j6 n% p3 V; M! J
{( A0 [/ u ~+ D6 H7 m
Control_Task();5 x5 }$ B/ s5 F
}# E! K$ }! `) U( I* [
}; p7 O3 O7 c; Z0 x, |% _
/*
% I9 w8 Y. W& W: W! I*@Function IO口初始化 RG0 CCP3 RG3 CCP4% E" j' [3 ]; O& H
*/1 R! f/ I: c$ g- D5 Y
void GPIO_INIT()
4 s& y. u- x; R) D [( |{, n( j: u8 c2 C4 C
TRISG = 0X00; //设置RG口为输出
/ R4 i. s0 h; | D5 ] ANSELG = 0; //设置RG口为数字量
: l4 z, y8 I7 z- j4 M$ d: X LATG = 0; //设置RG口为低电平
1 n6 p6 ]' Y! l- `# H
' u! `5 B# c7 Z/ D TRISF = 0;' }2 J0 n H# A' i) I
ANSELF = 0;4 X9 ]9 C' ~3 y' i
LATF = 0;% X9 @" s8 u9 q3 b9 u% f
}
F* T5 }7 @% z: P2 c& o6 Z6 W% ]+ H! @) e7 Y, `
/*+ @: c8 H9 H$ O) e# t
*@定时器2初始化1 }" c+ H ^; N+ f& y0 Y) Q) L
*/9 Y$ j; m! Y6 Q2 F0 M
void TIMER2_INIT()
5 M7 B6 F2 r; D! R) T{
! o* r; w' V( A TMR2 = 0;
S1 E8 i2 a; _+ L% { PR2 = 255; //255+ Z2 P+ s- ?2 A" r6 s. h
, U1 e( r) \/ Z- c& t) B TMR2IF = 0;/ u% D7 B) B* o) T
# W- A) e; Z n+ T% z2 f
T2CKPS0 = 1; //17 R; I3 [& R- m8 I+ I
T2CKPS1 = 0; //0
7 C2 q- M% q; n $ N' h/ q1 v3 \$ B( w8 F0 C
TMR2ON = 1; 3 G. e" l4 S9 m( g: w$ W
}
7 A9 ?* H: I/ s- v$ ?7 f4 w) j
2 P; J- R* ^+ A8 t& i$ }7 C7 j4 x& G/*
1 N. B( b3 k. g/ S" c" ~* {*@定时器4初始化, Z# Q9 h* q! P! R& c
*/8 P" U- K/ W# s* K& [! Z8 ?
void TIMER4_INIT()
8 X7 j! y$ \/ h ~7 P{
: h. X' q, S3 y T4CON = 0x0e; //0000 1110
$ r2 D' [. e0 U6 C7 P# x. y. Q6 p" t! A5 |
TMR4IE = 1;7 @2 x, ]9 U; B% @ }
TMR4IF = 0;
; m0 J e/ V; q3 ~ {: N
# w% D; M; U$ b% r TMR4 = 0X00;
. ` I# f' j+ l; y' T& E# K
! A7 |' E( t: i+ P: r PEIE = 1;9 x5 w! B6 k5 m2 C
GIE = 1;. {0 k$ f% Y0 M: @, R, |+ R0 q
}
) }# O r: V' A% T- W' |1 g1 t) v+ B" g i& C
) h7 A2 X) c; o% |
/*
5 t W2 E% @7 Y*@ PWM初始化4 L$ e5 I$ K( `+ Q$ A4 \6 A' @' m
*/1 s% b8 p' k* [: u3 t6 N7 g
void PWM_INIT()
' r# b7 F% l! A( @" c{
2 Q: z$ ]* y0 E2 h5 Z$ k) c8 { CCP3CON = 0X0C;
1 N6 T3 K3 w9 {/ `! S. ]# [ CCP4CON = 0X0C;
G ?0 k2 N$ l) w! Q, x. j+ P% l - A) q: j% c5 c% \; i) a- O- E
CCPTMRS0 &= 0X0F;
7 x6 E" Y4 G5 v: w/ l- A# y
, [+ z% t6 M( ^1 A& i" g- K+ O TRISG = 0;
# l7 q3 M5 |; I; h/ W5 V}! N. o" x( ?3 s3 H5 C6 G
0 e4 T% G' q" T8 |. u
/*. R4 K, K% ^0 x
*@Function 主任务函数
; o5 r" F/ |8 @; t# ^* x9 |/ v*/" Y- e4 L; w5 t2 ^2 x1 B7 U
void Control_Task()8 x/ r& o S. Q" b% u9 N
{5 e7 z5 O2 \; c3 ?6 y
static uint Time ;( h7 ?5 O* t: p7 |& e& y) G8 m
// static uchar State = 0;
: }* e" V d4 k1 B8 u static uint Record_Time;
9 q# r$ E; w- U. F v uint Delta_Time;9 x8 M0 I. l4 `9 B3 `1 \
: x$ R6 E2 P( U2 y- x7 F! T
if(State == 0)
# D% I3 D+ ?+ J; E8 D% q! K- E0 s8 K {3 V: {0 n$ v1 B7 x
Time = 1000;3 o4 h; D; v, \% e: Q4 G
State = 1;
+ w9 V7 g1 }( V# _4 c; ^) f' K! g- A6 Y
}
( [3 A! F& m0 M1 B if(State == 1)5 [5 G( o- `' `
{0 M1 S1 F+ m$ R; v
PWM1(Time);
$ y' N3 {4 U& B% j# X PWM2(Time);
2 P4 h b8 I: u
2 l: L. b# e% T! k Record_Time = cnt_1ms;
9 x9 h/ j/ \) F2 g2 `( f / s" D' v0 r1 H3 Z0 Z& u) E/ S
State = 2;
8 Z* g9 O( O; C- c9 m }1 \- A' H( o$ H( R; E
2 q+ k$ {! W, O$ H5 d& G* h
if(State == 2); h2 D# C R0 P% I) M, h+ K8 \
{% a1 ]/ o3 d8 r% M1 ?/ ?2 t$ N' H
if (cnt_1ms < Record_Time)
! C8 |0 o" {; t3 Z. q {5 A, y( V3 X, _" r( I2 |* f
Delta_Time = 65536 - Record_Time + cnt_1ms;
* b8 s$ l5 D2 \ }! s `, ~* I- z- I9 O
else
$ d L2 d+ ^$ m% X {* G+ c. k& X, y& x
Delta_Time = cnt_1ms - Record_Time;
) |$ {! j2 u4 u, Q/ i0 M }
* C+ n2 d$ Q( _8 @/ H$ m
3 S8 h1 ]* I$ l7 I if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
9 `+ q0 E% C- g' i1 T {2 C- S9 s" j8 L# `: |# ]
Time = Time - 100;: h! i! C1 ^' R" X' N# P! g+ K4 z
State = 1;
3 i# H" d' c5 ^' L' D: J' S; k 2 p- u) @" \* D; A" m$ S
if(Time == 0)
6 `! q4 t1 [+ x( R {& F; }! R" B; i3 g* X3 z0 Z
Time = 0;
2 d; g) ?$ D: v% Y% f State = 3;/ N3 M" v8 D& v) r
}
8 i( N7 {$ ^( k2 x7 m4 v8 n0 i }: T+ X' N* `: R2 w: _7 Z. P
}
1 n% ]) p. S! {7 Z, f; A
& i8 F3 I- x4 o/ A0 r$ D+ H G& i if(State == 3)$ X0 A) L6 E1 Z, k, w" _, L
{+ H" K# M; `; U/ K+ u; n
PWM1(Time);0 [8 @) F6 e. c& b, R% k7 m
PWM2(Time);
' t7 Z$ M" {! l 0 m( Q( @8 C$ T* i- a. \
Record_Time = cnt_1ms;
. }+ ?3 z0 c) N6 M* H
" N5 g; e! @3 v/ Q State = 4;) }5 c1 i0 Y! ?! C% D& e3 ^! `
}
* B; }5 X3 n4 @! D ; t& N- `/ x7 s1 y. \& z
if(State == 4)$ c5 b( q, u5 V* L
{
. ^& B- }7 f8 x' G1 F! P4 r5 b if (cnt_1ms < Record_Time)9 _; p* j; b' t$ ]# }) k, y! P
{
% z) m" U9 F: R" A" o4 }- X8 C Delta_Time = 65536 - Record_Time + cnt_1ms; 2 u- n" B1 ^; R9 R3 n
}! ^) w7 U2 s7 ]3 H. r1 j" B
else
5 ~- M% h8 u) o2 A {
6 y1 M+ f$ l$ ]. ^% [/ s- l% I Delta_Time = cnt_1ms - Record_Time; 9 i9 ~, A4 B0 g5 D
}7 X8 B( w, |3 p
% i* A6 m3 ]: S( n if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
- S, V( w" i+ ~/ q {' [( t4 e4 T# o# y2 ^
Time = Time + 100;2 B# @0 L' a% L" ], S8 o
State = 3;7 ?- L% S* [. h) w
; M, F+ b8 F3 C if(Time == 1000)
+ Y# m* ]9 _! a$ G5 D, O2 i {9 R1 L; A# N# C& b; _1 ^
State = 0;
8 e3 f# i) C' |* f# I }
6 ]! w9 E6 D. Q1 M) j/ D% y }
" s0 a( H Z% E6 R# {! h }
: u$ w, g& R0 [: p} R7 P3 i3 ^- e5 h' J, P
, s7 i: i3 t! j5 w* J
void interrupt ISR(void)
! J. O0 l# p( o{
$ M4 v% i0 E2 ?' c7 F; O4 }5 @ if(TMR4IF == 1)- _+ k1 \. N( h) T+ x( O
{
; @+ o/ t8 d6 C5 N/ { TMR4IF = 0;, U5 D$ R0 N+ |: T6 N: O
cnt_1ms++;( P5 g% Y% {! d
" i. d1 d9 g# @/ q1 @8 {
// LATF0 = !LATF0;
5 D% v# y5 s- ?. g }
& e3 Y5 R- T: |) g' S" @. O} |
|