|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:9 M3 D* V1 l: p. g& M
6 E: b0 y2 T! `( u, `6 g3 Q
/*
4 v) F4 a& x6 i( p4 f3 K# M7 p*@Name: PWM_led
3 s0 C8 i4 ~4 D( @5 V9 S*@version 1.0) ]7 u5 C" W( |; u/ t* Y1 _5 T
*@Author xiaopan
4 s$ ]: g; E5 [2 F) U `8 n2 v*@Date 2014.8.2' _2 Y! C7 D5 B
*/' J- p6 j8 s! E2 u4 ?7 }
, E% { K0 e! N" l' J
#include<pic.h>
D& R$ H0 b( E0 y: [3 e#define uint unsigned int
- [( A+ Q: j! l5 [) Y#define uchar unsigned char
; X* O4 ~* S- e5 F1 {8 y
, D, n8 ]- R: U: B$ Z0 X3 k#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1 - D2 g* c- Y3 I* L+ f$ i: ]
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
5 ~* Q; g4 x( t: Z4 v, N' W" M" w1 t, g- K* f1 @3 E
uint Time = 0;; O' ]; r- E2 U; e, W3 @
uint cnt_1ms = 0;
# V+ G- g! V- X2 u" U$ Wuchar State = 0;# Y+ A: W9 ~1 J* A* k. Y
- r9 _4 K* n) z2 {3 H4 C8 n3 o' x
void GPIO_INIT();
- G1 @2 B N7 [5 q% a" c7 R F! hvoid TIMER2_INIT();
/ W; {1 j! J* mvoid TIMER4_INIT();
3 v: w0 t+ ~6 s J/ pvoid PWM_INIT();0 M" ?" q8 j- N% i
void Control_Task();! `6 ^2 Y$ H! r) R, B
" o' g# j( P2 {: h* j. T/*
7 ], N' B& c) j3 }( ^, M) r% U*@function 主函数
2 k) `5 W6 `/ ~) A3 k T*/' g5 p" r g2 x2 V( `, J
void main()
3 N5 ^) L) b u6 C0 p{
& o, w# f) i7 D1 n: U0 v7 S GPIO_INIT();
* ]) [& r/ t! V3 K. V2 `! H PWM_INIT();
/ g+ }% e) I& L4 Y+ T TIMER2_INIT(); //PWM利用TIMER23 l$ U3 M n0 |/ |! I8 }
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形- e: I* C! P1 X( Z, V4 l
while(1)* b- j( q& s' X0 \/ s/ s2 S
{
9 [' D2 a% [& |; {4 e6 j Control_Task();8 q/ k+ U3 @: t1 o
}( n4 y- r: U% r |" K+ q9 J1 N1 l/ \
}1 h. B. K6 L% C
/*% x9 W# ^0 a9 M! C: H: X( D3 M2 {
*@Function IO口初始化 RG0 CCP3 RG3 CCP4- t8 Q7 z$ G5 m7 E [7 r! i1 V8 i
*/
6 H$ E1 V" {6 K* A8 a9 k( }, rvoid GPIO_INIT()
9 I) T$ V H3 q( g{# q* @ b1 G7 j; R+ ^
TRISG = 0X00; //设置RG口为输出 \* H2 e+ y% w, O
ANSELG = 0; //设置RG口为数字量
* z) o9 Q/ U$ T LATG = 0; //设置RG口为低电平3 s' Q/ |; J+ w. F7 y* Y# B1 Q
& U) J( [8 m/ V7 ^ TRISF = 0;6 S: c" Y& o6 u9 O- t! A4 x
ANSELF = 0;; L5 T; A ?; e2 r
LATF = 0;
# B" {5 f# H' W. N7 v7 X}
. ~! p" Y9 S- Q0 y, {- p: Z8 {9 r" L6 {% M" ]1 y
/*
8 q* S9 r% n/ p/ M, r: C*@定时器2初始化/ e1 w1 B6 [. k
*/
! i# I2 f1 t7 B: {void TIMER2_INIT()* c6 s5 [; o# P( a, b# s
{
; N7 f7 F) Z1 w! U. V TMR2 = 0;; K& I8 A) ~/ q9 M, @, E9 M
PR2 = 255; //255
/ V8 j3 v, s& v1 k6 [
1 X* y3 E$ P7 B3 [ TMR2IF = 0;
$ J! U6 Y9 X: t, Q9 Y( u% c
7 Q, v, Q1 `6 j T2CKPS0 = 1; //1$ L, f' a; C3 R0 m0 t
T2CKPS1 = 0; //0) P* _+ h) u% Z& @( b6 l
8 `4 H+ \3 O) X7 I8 K
TMR2ON = 1; * ~4 g8 Q' L5 ^. |8 }# m0 g
}2 @3 a1 D( p6 b, d% O) ?
& ^3 T3 g: O3 W3 Z1 s' e1 q' }/*
! z# ^ x/ {$ M/ o& t$ ^* U*@定时器4初始化
0 J# p, {1 P) O*/
) P9 D% j) s g6 v7 B$ rvoid TIMER4_INIT()
( S1 C) N! a0 Z: x9 ^( l{3 E5 D7 a8 d& P* y0 W i6 V
T4CON = 0x0e; //0000 1110
7 y. h) v, E' H A# T" T. w+ [0 g6 g. e
TMR4IE = 1;
, h8 j4 G2 D7 K) |- Y. x; r8 G TMR4IF = 0;
" ]) u- H; Z% @ p$ j( ^
7 _6 H8 _/ x! ?+ @8 F9 W/ a TMR4 = 0X00;6 o) D$ u6 Q3 K3 f; A4 {
1 D; e' u6 ]9 i3 G
PEIE = 1;
. C. Y' [5 J3 v# `; p1 N GIE = 1;
( O1 {& t" A3 I, j+ z4 I8 W3 W G} O9 y- K1 k( U2 N! B
; H0 D5 a/ B. \
; e N5 s0 Z4 S$ K a# L. b
/*
3 k0 q1 U( i7 L+ m9 u*@ PWM初始化" ]3 T) r& F' [
*/
8 Y: {2 X, Z; ^' w, X7 D' q. Hvoid PWM_INIT()$ t+ v: C! O6 J4 F4 M6 N
{
! a+ I% u% [ y5 b, H" W CCP3CON = 0X0C;+ j" r3 B/ G2 M; {7 z* N
CCP4CON = 0X0C;' {; z0 {+ c' y( r% U
. B a0 q, L! F' F d# r' w8 M CCPTMRS0 &= 0X0F;; p$ ^9 o( M2 A; P( a
: a6 U1 P$ q5 g" V TRISG = 0;. v4 ]' z& }$ P8 s+ D5 ]
}4 s L3 M4 \* {) q
- h; _% e9 l0 x0 R8 C& D4 P) @ v/*2 A& a7 l: M3 v K
*@Function 主任务函数 b- U3 |! w, q# ]$ E
*/+ `9 N+ Q2 D4 F O$ M
void Control_Task()! G2 k. M/ c( h7 b
{
; r1 |" l8 E- y static uint Time ;
4 m; |( ^1 p4 d2 h0 p1 k// static uchar State = 0;
4 o& x: A* J) P5 [ static uint Record_Time;: j+ i* t5 B$ o' j2 N
uint Delta_Time;
8 n5 I% T( l2 R: u
x% ]8 ~; l6 u$ f" L- s4 ` if(State == 0)
3 V: S3 }7 J/ a; m5 a1 z {
% \* q1 `+ k4 H% \5 W( ^ Time = 1000;
+ G4 b5 u' o7 O) B* i' c State = 1;
) {4 f7 e5 S$ _% _
; E/ Z! u* b2 K5 e1 N5 o2 _2 f }4 s8 z, L% ~2 K, y
if(State == 1)
6 @/ B0 D1 u8 G2 r6 u7 G {
* H0 W' ~: g t0 G; X PWM1(Time);
Q2 B( |2 h! B ^6 _ PWM2(Time);
- k% p' m; |1 p; I 6 O2 d3 l: T7 e$ v- \' U
Record_Time = cnt_1ms;: Z. S" t `9 N
% o3 }$ x" }- n3 L4 s State = 2;1 S5 a/ w$ x7 y# U& u
}
4 _2 a5 F' [8 b; |; w 7 K8 Q, T! _! W7 D; L4 {
if(State == 2)
; n+ b+ A. s' x! g& e1 {3 { {
" U# Y% t0 g# a if (cnt_1ms < Record_Time)
2 f2 P0 h4 @+ O- i8 C {6 v: Y: ]; g, F9 O: F
Delta_Time = 65536 - Record_Time + cnt_1ms; + D/ w. H; V# C- m
}
. u, c. M" ?9 M) q. J+ f7 ]: R$ T else
( _3 p1 \6 F: W: g0 d' q* h {
2 c% |! h$ Y' h; o# X0 R Delta_Time = cnt_1ms - Record_Time; 2 g" j7 `0 {5 T4 ~
}% j8 ]' e- H0 u y' H9 |3 ]
1 n; F# t; }! [+ z2 }: ? if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT+ N: p$ n2 v3 R) G- W
{
X! n6 t y. g" N! J Time = Time - 100;
$ \1 ]. `* q( T$ ^- U, Q State = 1;
+ @; i1 ^5 t' d1 G2 I5 l ( ]; Z5 I) ^9 E
if(Time == 0)7 c: m% H. V) X+ a8 P
{
4 R* |: y0 ]; v6 u: [4 h Time = 0;5 f" F6 f5 r) G( [" D. T
State = 3;, y& p+ j8 S" ^: m+ s7 V
}
* M' f2 R' C& \# A5 ` }
9 s4 ]% B: P, Y4 W }
. D6 H- F3 b q# \# \ . ?' ?, B |% w7 |
if(State == 3)
/ K8 a" v9 W! ?# l. W5 N: z {. ^6 Y9 G/ z0 s5 `7 w, _+ S, S
PWM1(Time);$ d( s: I8 o8 q7 Y1 w7 L
PWM2(Time);
1 D: S2 M+ H$ ^ Y9 T( J ! J ]6 V2 w8 g9 t3 Z
Record_Time = cnt_1ms;4 h u% O7 l1 w0 m1 Q# o [
: y: X. o1 o( n) q State = 4;
2 Q' I: A( A: h9 R }2 @' x2 k" x' u/ D! T* C5 n
' m1 {2 E. F2 @2 s" w2 b0 b if(State == 4)6 S) o( ~ o4 }
{
# E1 R* l& E6 Y V+ _/ e if (cnt_1ms < Record_Time)
6 e# k0 c) W' M4 {0 h8 g {' A( P5 w. h* B3 r
Delta_Time = 65536 - Record_Time + cnt_1ms; . i* t E w" j) a8 `
}* ^4 z9 L0 v5 \# o/ |" X3 `! D
else
2 |" {( Y( |/ K( Z8 ~' \1 o {8 a# z5 E+ `8 ]/ {, a9 D3 x) P
Delta_Time = cnt_1ms - Record_Time; $ Q) h& H& t! b5 E- X" t
} y$ k- p" _8 i0 n
8 X2 f* s8 [/ \0 M; d) @4 Z. \+ J( q if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT) `1 }0 d- z% C& x j8 _ l' K
{+ h3 P$ u% f9 c
Time = Time + 100;; g4 i# J$ V$ p4 l; g
State = 3;$ [6 W, b, a1 e$ A5 Q
# L' y9 L8 O8 ?, ]: s& T7 Z1 l if(Time == 1000)$ _0 W" r' ?% r1 K) W: ~7 }, P( E9 D
{
& `& J/ ?! i8 N' u5 K State = 0;. W9 e5 r2 o" B B; f
}
/ o7 n0 | t5 f; ~; ~8 l$ B }/ b2 t Z+ W3 |& ?9 U e
}7 c) F, n4 u! r: ^' ^# P& F) h
}- `6 l z; b8 g! o3 h/ H: M! {& `) W
; J6 _0 }1 o2 G* s; p& B. h- Pvoid interrupt ISR(void)4 I6 V) J1 }0 U
{
" v5 U9 I6 i9 L- f* w7 M if(TMR4IF == 1)* Y7 X5 _. z7 T/ g2 Z i
{
1 j2 g: K, t# o( J) s TMR4IF = 0;
" U( t! \% q* g/ k1 R cnt_1ms++;3 h( {! g( _2 w/ l- g% F0 g7 R; G
* f8 k) G; T2 ]
// LATF0 = !LATF0;
% h0 L$ l* r, R& A } , N) E5 ~8 H$ S
} |
|