|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:$ o5 |9 Y" J; N" Z) q& n8 }" i
3 ^5 y4 g+ `% {
/*2 u/ `# R, S( v7 I5 ^2 {- o4 R3 F4 h ?
*@Name: PWM_led. T4 c0 z# E" R' X4 |
*@version 1.0" j' N- M9 @7 b! y( t) q
*@Author xiaopan
5 v8 I0 f+ c/ F& @2 R, s*@Date 2014.8.2& R" `% E& F1 J! w# `! g- ^& b' ]
*/3 P$ m% Z' Y# O( H3 U) R
* B& K" `) K7 C# J# k5 [( }: o
#include<pic.h>, z% u3 q' Q7 |9 ~
#define uint unsigned int 1 q6 N: Z8 f7 q6 T
#define uchar unsigned char5 X7 L. P! d' b$ ~- x
$ Q1 \$ c" b( Q! d0 I( q+ c
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
7 R* u; ~5 D& H/ _#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1 * e; l3 X( `) b" C( R+ l
# A- a# D$ }" e, s
uint Time = 0;5 p& d% ]* Y- L8 o- W6 S) p0 @
uint cnt_1ms = 0;
* @/ G# K) B) g6 ?+ iuchar State = 0;
0 ~2 E4 V- N4 N9 j, c
B1 M9 [6 M0 @8 Uvoid GPIO_INIT(); \# Q4 `) ]/ D
void TIMER2_INIT();1 h8 \9 a- X" v8 G1 c
void TIMER4_INIT();, o0 ^% f X( @& P$ s/ I7 _
void PWM_INIT();* w6 i, u" H7 I
void Control_Task();& h8 Z9 ^/ V2 r* u# }' j
0 @3 m! u" K% a/*- c- u' Y3 x% M; e7 C
*@function 主函数6 {* w" C, O9 s( i3 N
*/
! y/ A. W9 c. r' {. fvoid main() v0 V; S' \- v' J9 G
{6 m" e5 D4 c. P3 a4 j
GPIO_INIT();" @* K& V" Q! b6 @7 B" U" K
PWM_INIT();
) s7 A, x0 |. J8 q3 G7 N6 C TIMER2_INIT(); //PWM利用TIMER2
" J9 P0 T; A; T( g3 L6 ~6 \+ G+ j TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
4 A( A6 p7 S. v1 ~, C while(1)
# m( X- x5 M$ f4 h1 X* | {
/ u& b f4 v% V( x* X5 H, D l Control_Task();5 x) M+ f# ?- F! b4 j! [
}
: H6 f1 q s/ v2 y}% d5 F0 t+ z+ T9 e8 a0 F7 u
/*& {1 C( ]9 i% u/ K9 G- A
*@Function IO口初始化 RG0 CCP3 RG3 CCP4$ q* `" n0 U8 E7 u2 R( K- T0 `8 _
*/# |: P' p: O! _4 G: ?
void GPIO_INIT()( T! q4 s' X( V- f3 W
{
8 k0 p g- ^* R4 n TRISG = 0X00; //设置RG口为输出8 m* ?1 o* {1 {0 s; A
ANSELG = 0; //设置RG口为数字量8 ^$ k8 i; z& y
LATG = 0; //设置RG口为低电平
# u k1 C3 O2 B' k* w5 z& g7 G
, a3 R/ I" Q: l7 S TRISF = 0;
/ U# d$ I" a+ C& f ANSELF = 0;
6 F2 C! I7 y t- `5 O( _ LATF = 0;
, I+ C0 B% \5 v: V: K- J, u7 l}' a& y; q5 {7 K) p* T$ W; m
& e+ `& ]) j4 U3 X/ }' H/*
: B! g* i. W" `5 j a1 q+ b*@定时器2初始化
* p F ~; X0 q9 q) R. o4 i*/ t$ ?! U' Q9 m' J8 o; g
void TIMER2_INIT()3 Y) u4 M* [+ |
{ Q3 Y; ^# l# X
TMR2 = 0;
) ]- l s& |! h PR2 = 255; //255
5 j$ O& y9 m6 z3 T! g) M$ _
+ n Z6 s! n" w TMR2IF = 0;
8 j9 t, ~7 g5 Z- {, t1 ~
1 W t& o; b- r# ~0 n5 }+ d& ` T2CKPS0 = 1; //1! ~1 H" K- F9 r+ Y' L" A8 ^# L
T2CKPS1 = 0; //0
! W8 b; i& D# |2 I+ L7 F) t 4 u8 V$ [: \ D3 H
TMR2ON = 1; " Q2 U! s) C5 x3 w9 B
}! ? j7 I6 H S* ?6 y) w& i
% z* i8 r/ h1 r' P9 a. w) }% }/*2 {' ]0 L" }. D; b) @/ O
*@定时器4初始化
" F* u; l) V5 }% U*/7 Z3 s! B p) ]& S
void TIMER4_INIT()
5 I! _' \9 N L, K$ n{+ i' i- K. ~* u/ f+ N8 L
T4CON = 0x0e; //0000 11104 ?7 ~5 o# f* T" Q$ A" \- Q5 ~
! C: Q; m' ^4 [3 E5 _+ c% Q
TMR4IE = 1;
( s" q$ W3 ?2 e- s! _ } TMR4IF = 0; ' y: k7 N/ x# t
! I# C! S% i: g8 E* @ w
TMR4 = 0X00;3 U5 y1 V9 B W+ n. ?
L- D c5 X( r n
PEIE = 1;4 P8 A( ?9 l1 O# k3 `% b
GIE = 1;! X" Z( ]5 l2 }8 g* U) Q. ^7 X8 ]
}' K6 k# L% f1 ?+ n7 H7 a* h9 }
* D7 P8 Q1 \7 w
" [7 C4 f# ]* W. e1 K% Q
/*
! [) B6 L c2 ~, m; p# [*@ PWM初始化6 V4 n o3 g' r8 z' M4 {: Y
*/
. C* M# A' q9 |. jvoid PWM_INIT()
: v; C1 ?6 k, n& S% B{3 ]. q9 m& P o4 e( E2 t
CCP3CON = 0X0C;
$ E# f6 P7 d3 |- S CCP4CON = 0X0C;
* j5 R9 N. h: Z. f
: d4 S' ?0 S$ F CCPTMRS0 &= 0X0F;' d, u% E6 ?: X/ R
( C8 j( y$ z5 O# L) x0 ^
TRISG = 0;0 n3 B( I2 H9 h, }6 _
}% u; [" }% [5 p2 a0 i2 E: x+ j
* Z* n0 T1 N3 Z9 ~( _/*$ Q) O$ M# L) o- g. ~9 l! C2 z
*@Function 主任务函数
7 A% F( y* P5 h# t5 v*/" o1 p0 a/ ? d7 X
void Control_Task(), s: z' u3 Z5 B4 N) v4 ~, t8 R
{
. n7 p# w8 s1 w; z9 A static uint Time ;8 W$ F0 {+ ?" L0 l+ I; c+ D
// static uchar State = 0;
8 X2 l9 D0 J9 L5 X4 l/ D static uint Record_Time;' v0 y' f8 H7 B" O
uint Delta_Time;
$ a2 i" n8 @7 T6 L
J4 B% v' g! p2 P1 f0 `& | if(State == 0)6 w7 m; ? b5 W' |! k5 ] S
{# R3 [( J; a4 u v; Z% z( I
Time = 1000;
- T" H9 d; Y9 s& _ State = 1;8 \" Q$ Z) M! U
: V2 g9 d% c8 G7 ~
}* {. m ?" m6 V& c8 Y9 Q! a2 K2 g
if(State == 1)
! \$ L, V1 R; k' W8 i* u {
; j5 r& E2 }, X) m, t PWM1(Time);; C8 E7 s- `9 p0 i0 b5 W
PWM2(Time);( B( z! l1 G% X4 B$ {. c! x
5 n0 R( w- o- {& ]
Record_Time = cnt_1ms;, i1 i- L! r: b
" O9 |3 F: `$ J; j
State = 2;
8 P8 s/ P" r' H( ~! `: ` }% ^: Q4 m( e, R" q6 ^
" s8 d" k: z+ I: O if(State == 2)+ ^7 [* ~3 v0 z4 @ ^5 b/ W
{
! ?& g% m4 c4 U. @9 R' O8 k if (cnt_1ms < Record_Time)# p5 E$ a) d7 j2 M
{- ]0 H& J, y) L
Delta_Time = 65536 - Record_Time + cnt_1ms; 9 g) P; V# [0 o% g, T* ^
}
% `* l5 S( z7 q* o else0 L% {7 b1 l) c. a- h
{
: S5 y, o: {% R: `$ D# W2 P4 R Delta_Time = cnt_1ms - Record_Time;
. \5 N3 F* }, W1 R' n! Q; a }! j! B% x1 K. t% P
/ v( y& J4 D9 t. ?; a2 S' K8 Z0 s6 Z if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
7 y P2 c' ^) {1 n2 z {
( y) M: d% y: H" g+ K( R4 N1 x2 h Time = Time - 100;
' }) Z/ L4 m9 H& |# m$ _! c7 x State = 1;9 I$ B* ?5 b+ f4 V7 M
! {4 ~9 P+ S! g2 g: n$ }9 a5 [
if(Time == 0)8 ^, x6 o) U; W$ O& @
{
2 [, i# H7 [3 }" u7 ]& C Time = 0;
! F1 Z$ `+ X! v' i7 J3 g/ A$ ^ State = 3;) s: I ]% _4 \8 L5 k( e% T
}- W% ~5 l, p" F7 D1 |, ~. }8 g6 w# g
}
5 }# u* ]2 B/ u& A+ I1 b1 A/ I6 t4 T6 e }2 Y2 r% T% i' s2 y0 J1 X
2 Q$ a% f8 E( ^" F/ a% Q! B
if(State == 3)
, b. o& D5 O( ?; p3 _. x4 R9 a {
& o7 ]1 f! Q# u B; `, V PWM1(Time);5 F" O) g3 ]$ Z0 J' W1 J
PWM2(Time);
/ m7 k/ V' u* N( E$ r * \- h5 B" ^7 H5 J1 E- W! U
Record_Time = cnt_1ms;
0 P2 |$ m% z! O) g* |% b" \
! D! E+ @) j# D7 ^8 N- j State = 4;
3 k1 F) w7 K/ H1 W+ w. f4 { }" W' i/ L" Z1 x+ H
! G# r0 f$ i) a3 t9 |
if(State == 4)
3 }) D% l2 S0 A {
- u5 G7 i5 a( ~. m& i if (cnt_1ms < Record_Time)0 s$ L* y- w, @
{
, D9 s: v. P* {& a: T6 _ Delta_Time = 65536 - Record_Time + cnt_1ms;
9 i% I1 J# P+ c2 t }
% ^1 h4 s! i( U: r+ {( N# C else
9 ]/ y* L0 \0 y' H; x& \ {
w# \& b! c; C) h) _ Delta_Time = cnt_1ms - Record_Time;
- n' j y o$ ^ }
0 p3 e7 ~; \ W2 v' c- p4 J/ e& ^! \$ W0 `
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT/ y; H8 j5 p# s& F; h, A( d5 x8 f
{
# a/ y6 A5 L' y$ Y" t" g Time = Time + 100;& R$ x+ O+ F1 e; y; t
State = 3;0 C( Z2 g, \+ a5 L' M
/ P: y [, d6 l: S3 R% H if(Time == 1000)
9 S2 V6 d8 y% i. v {
. [- V N) W8 |8 @ State = 0;8 }5 K- s$ s/ u$ C n; T
}
- y8 t7 S% g4 m, {+ `; Q3 c, g1 Z }- M7 e; M/ m# F/ D% j& J
}; @. S* U, w. x3 [
}
2 x4 R! A6 D! Y1 n0 t( O5 d1 h# ?: C# i2 g2 p: A) D+ U
void interrupt ISR(void)5 U5 B9 {& e0 t
{
\+ T2 V$ F3 Y1 \" {. k if(TMR4IF == 1)
' `) D; l( N! s n {* s- @# e( U* D! G3 w5 \8 l6 |
TMR4IF = 0;2 o+ u/ ] z/ g
cnt_1ms++;
/ n) e9 B8 V8 j; k, F. s/ ^# E 3 E4 Q |" Y5 t3 `* n
// LATF0 = !LATF0;
" k1 {; s& d% J0 n+ ^: f6 t } : Y+ \2 j7 u; P% I
} |
|