找回密码
 注册
关于网站域名变更的通知
查看: 537|回复: 3
打印 上一主题 下一主题

利用PIC16F1947的PWM模块做了两个呼吸灯

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-7-2 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
; ^% w9 V8 S" K" D& H/ z# e7 E& m- g$ ?) H& f
/*
; ?5 H* @; m7 K: ?/ R9 l- }*@Name:        PWM_led
# y! }1 o3 b/ h4 h4 t*@version  1.0
4 c0 Q* K, k" H7 U: a*@Author        xiaopan
5 |' T% j% g2 m. ], X: Y, G*@Date                2014.8.2
0 t% v0 F1 Z/ k+ A/ Z, n*/: ^( Z1 n1 g9 l

9 P+ U* N$ I) z- S% N#include<pic.h>
) j9 ]% t3 c; w1 h  m8 s' N% _#define uint unsigned int % L- [' Q2 {  A  @) u2 S1 [  [) I
#define uchar unsigned char
, Y8 Z  K4 r1 _+ w
3 X; S0 B, Z7 B% V: w, A0 x3 |#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        , d1 C1 ~& @+ ?' @; h
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
  X* _2 i5 b& c3 {
& F$ X1 k6 F( Z- `; O' J  X  C0 z) yuint Time = 0;2 d; l( J! N/ l$ p% l8 @+ v' D
uint cnt_1ms = 0;& ^# ?* I+ K' |7 g* o
uchar State = 0;
/ \/ ?' U3 e) m* A7 L' v& h6 X/ h( B. q$ h0 {/ N
void GPIO_INIT();4 G- ^# \# _7 y6 H) ]
void TIMER2_INIT();
# P/ i2 |* q( ~& |5 vvoid TIMER4_INIT();; H+ Q% d, E. ?# F( j/ K
void PWM_INIT();# [; M) @* k# |0 S2 {
void Control_Task();
. n" M; R, N2 W$ F; S& @8 ~& b
3 y( A* s* a, n, L' l* v4 T/*
0 r: ^3 v$ v* h$ {7 @*@function 主函数' D4 ~1 d3 N; q
*/4 t+ f9 c) b3 D  n
void main()
& \$ g! d: n2 C( I{+ t: M6 ~# k5 U4 b- P& N* i) n
        GPIO_INIT();* Y% q* S* x' I' `6 e( v& e
        PWM_INIT();
  l9 k9 V4 O% {! ~6 I2 d        TIMER2_INIT();                                //PWM利用TIMER2
8 {/ p/ C% G8 J( c' b* D# \8 y7 q        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形$ _# ?0 W) `. M6 [5 M
        while(1)
+ m% ^  e' ^. p0 ?1 R        {
9 V) d& P) N% v0 d$ L. h% }                Control_Task();7 P- E- d2 y) ?5 D7 e* s6 j- d
        }* q) V+ ?: U% r; L
}
1 s; ?1 l- w9 P% w# ?2 F( {/*1 E5 c' F5 ^# g& C7 M
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4! e% d( _& a0 r4 z4 I3 z/ K# a2 L
*/
" u( i4 ]' {+ O' ~void GPIO_INIT()0 m+ ^. B$ p4 g
{- |" e- t( m4 U: z" o
        TRISG = 0X00;        //设置RG口为输出6 Q2 @2 g7 `. o) g* P) X4 c1 G
        ANSELG = 0;                //设置RG口为数字量
8 a: R. @( y. R5 A        LATG = 0;                //设置RG口为低电平) X) `& m# L" q" R8 [  ]/ s+ u
        % F/ m* D5 m. P* ]0 T# {# b
        TRISF = 0;
6 L5 X1 n( P2 B7 w        ANSELF = 0;
5 Z" w  b5 v9 j        LATF = 0;- ]$ X1 I+ j3 a6 w+ k
}/ T8 C; u0 [8 O, i' a
6 H2 [3 d# W5 I0 z
/*
5 j: O) U  {8 ^; _% V- H2 P*@定时器2初始化
7 t5 C; d6 F9 g1 F# O1 t*/- V& t+ f& r7 u) Z2 {& F% ?2 ]
void TIMER2_INIT()8 Q4 K$ u: n2 y  L. m
{+ ?5 G# S$ Z9 Y# c0 X& H
        TMR2 = 0;
9 N+ W; L/ _6 F9 l( O        PR2 = 255;                //255
' B# I6 y- d  P4 U3 x        * U  e/ N" N7 B, i7 a" c
        TMR2IF = 0;- e3 b' F5 p. p$ K: @, Z
        
) Y; F7 {0 o0 c& A# a3 e9 m        T2CKPS0 = 1;        //1% j8 l& X8 [  m  f4 N' Q
        T2CKPS1 = 0;        //0
0 h, F1 J8 J) q/ t  |, [        9 X7 {! N; t) w' e
        TMR2ON = 1;        9 b. Q/ @% V2 d: t; [% d
}
6 e8 i* z* Z  J/ B4 f3 |0 r  s3 N1 }- T: B* r0 e  y" o
/*/ I6 l3 l, d; R* E! E2 q  Z
*@定时器4初始化
' d7 u3 }0 \: |*/
  S2 ?/ y7 ]: P5 X& ~6 K1 f3 l1 ?/ Zvoid TIMER4_INIT()
) }: U3 G! \! R) L7 M4 ^{0 l6 a) }" `+ \" i" g4 W4 ~
        T4CON = 0x0e;                         //0000 1110
% _% z0 u5 u% I' U4 e% x! n3 n. K/ B; y
        TMR4IE = 1;
' Y. k& F9 J7 W! e0 ]        TMR4IF = 0;                              
1 f4 L, `; `2 q; `+ i9 H- V% S
2 G$ E7 ^6 W1 E9 c6 S' q& V- P: [        TMR4 = 0X00;- I' U+ \4 Y1 }1 N; C
        
8 u1 ]  q$ c7 B9 Y+ T        PEIE = 1;/ n6 D7 K  ^+ n) u% l
        GIE = 1;
) o# {. e* k5 N2 r- {2 }}
0 Y2 l" `) I& o3 r! |+ F, N9 E" Q' c
0 |, w( u$ Z0 @) R' `* e- Q9 G! f; b$ @7 u; s: ^
/*  p  s1 n7 T  `& M+ B
*@ PWM初始化
3 B( I% f1 `1 i: H0 w*/* e5 o7 T; P, d$ g% h
void PWM_INIT()
& T& `+ V7 p( b( r+ ~. c: p{
* Z/ Z# T* H  Y' k4 j1 n. i/ b        CCP3CON = 0X0C;
1 V$ D( r* T4 n* N3 ]% G        CCP4CON = 0X0C;6 s7 l/ q# i% q( p
        
/ S; @; M: H. R) g% ^( \5 N        CCPTMRS0 &= 0X0F;$ b$ @1 g7 H1 y2 U
        
; }, f3 Y! U7 u/ F        TRISG = 0;
# C0 d- L  j* j}+ d/ i3 C1 c& x4 j, l' t, R( k

& Z8 D2 S6 V. K" p4 b% U+ X/*
" [: r3 |7 x! d& ~1 x; K# m1 b*@Function 主任务函数- _* e/ R7 q% ]: R+ p6 `! |! n
*/, @) m2 N/ M  `, N- V! G
void Control_Task()
9 u2 @8 d/ L% _! D2 G{; ?& Z! x) _. m% o. }
        static uint Time ;
8 ]8 q2 D! f$ u9 _& }  Y" |//        static uchar State = 0;
. a" L8 C" V5 x1 x9 T8 M+ ]' Z3 m        static uint Record_Time;1 V  a! I6 p$ y
        uint Delta_Time;, E/ K9 ]  j; b6 o7 S1 i' Z# @
          e! i9 Y6 q. g
        if(State == 0)* p% e2 S" N1 z$ C) p* g/ K# z+ f
        {3 @6 h. o7 }) K- O
                Time = 1000;, ]! p: D1 A0 R
                State = 1;4 P* _1 i. K& n, [* }0 O. n
- J9 O4 I1 \; F* g$ n
        }
. B; n" ?# v! h- S! `# ?        if(State == 1)/ h' U& C" l$ i' g
        {6 y! \) _6 q* S
                PWM1(Time);2 f/ h1 `1 R: w, g8 \5 d9 K4 q
                PWM2(Time);  j6 X, K% _' E
               
+ y6 ]0 m2 s0 Q/ ^4 I1 B                Record_Time = cnt_1ms;0 c4 t) H% s' c/ u( L
               
  X4 z9 [2 O- U0 b8 b  o                State = 2;  c' u: h' h/ i6 Z' Y/ k5 [) B
        }$ l) G3 l1 w" e) F
        
& x, f, S. u& u# f: [' ?        if(State == 2)' d7 n3 p) _; U2 n8 t/ e7 }+ g
        {2 C7 Y7 n9 x. J& S
                if (cnt_1ms < Record_Time)
3 c0 }. S6 Q" ~/ v4 O                {+ S" G" W2 A! q
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        ( e5 ^/ L( Z2 m
                }6 x+ v; {" T  m- s
                else4 B: L. d4 \# ]( D# h' |8 t) M- m
                {8 M8 l1 \8 B- S- p
                        Delta_Time = cnt_1ms - Record_Time;               
+ }0 m5 i% K) p3 D. H, @                }
/ |7 d& S# V: V, _8 T  v; T
: A+ J( y! W' X- b0 M                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT3 |, f2 m' z( K4 e
                {
1 }+ _  `1 a4 R: f. H                        Time = Time - 100;
7 t! p% k" y- I8 l0 G3 q8 ?5 }9 b                        State = 1;. Z+ G- l7 M+ ]" t- a
                        
- m7 d- f( e/ G6 B- L                        if(Time == 0)
  R  V- h/ N: ~. l9 _+ \6 W  F                        {0 ]+ d3 ?: \3 }' Y
                                Time = 0;
$ r7 n3 H* i1 w8 ?' m                                State = 3;
$ X9 P% D; J$ I" T0 z6 U: U                        }5 l  n7 L6 `" H
                }
& Y2 b; N% C- X  w        }
4 U! p( O3 H) L        - Y; Z# ]; h% y( H6 W
        if(State == 3)
3 ]% q0 d" |' v$ U# u        {7 i. x) B5 ~( d7 H4 b- j
                PWM1(Time);) r( [# v. j4 [3 m! {
                PWM2(Time);2 c; l, ]- y! [; `# k
               
2 {: V1 V: y" J; _' a                Record_Time = cnt_1ms;4 C; r! D1 F/ U
                + R+ s3 n, u2 @% v! X; y+ V: W/ D
                State = 4;
# I& t' w4 U+ Q; L. N        }$ L1 X9 P+ z+ L' t* z" w  A6 e9 v. i
        
, i) c/ T/ {8 F. A* {+ U8 F0 l        if(State == 4)5 K+ n7 T; ?" v0 A7 E& ~; h
        {
- i3 G# M& C2 p9 H3 u" k2 ^1 S                if (cnt_1ms < Record_Time)
0 b$ N/ k) W/ Z% ~5 ?                {9 [' a. t: n5 l, i7 X$ p* a% G
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        . e3 e6 r4 H" U: G& T
                }
: P, z+ d9 U5 K- ~" z                else3 @& w5 A/ X7 o7 Q' S
                {/ X5 M5 v! A3 V0 g' m/ S7 T9 B
                        Delta_Time = cnt_1ms - Record_Time;                # F6 {+ a- I) f' f( |
                }2 y# }& l: S5 m+ @

# [+ }# z) `; X  h) C                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT% v5 C4 `' T- ]  o" }( G/ G
                {3 y; O8 r- X7 g
                        Time = Time + 100;$ _! A  J4 [& i! q  H5 b9 v
                        State = 3;
; n4 m2 m! v$ B% z                        
- @) F( t. U) Y: {' U/ ^% f. I) Y                        if(Time == 1000)
+ v9 I' k( [2 l6 k6 h' k' |                        {
( |9 Z1 u; u4 q                                State = 0;7 |5 F6 [/ M$ ^/ b! Y7 m
                        }* y# E( _7 @8 k. [
                }
! k" {* [5 m" d6 x$ Z        }
! \: S  X$ x8 n: J: C}9 P" b7 A* J" P* ?: v/ ~

/ x8 k* f& x; l7 vvoid interrupt ISR(void)0 ^, a3 ^* R4 X+ L
{
  r8 e+ l) ]) ^- Q3 }2 V        if(TMR4IF == 1)7 L6 V- C( h* O( G
        {
; Q5 i# @6 F5 R8 d, w0 f3 P1 Q" D                TMR4IF = 0;
4 q; c! G. [) M+ R                cnt_1ms++;
  B, z& I. P. L. u               
) _- n$ O& O3 Z2 t6 _        //        LATF0 = !LATF0;8 R# v% v1 ^7 {
        }        $ G" d" D: j0 b; v! d
}' I2 n  Q1 C& M4 t! v/ W5 n

PIC16F1947原理图.pdf

533.08 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
, g" x. F1 k; ?# ~7 N* U

该用户从未签到

3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!- F; y$ L6 S) e/ M

该用户从未签到

4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!" P# I5 H% o/ {( Y3 A4 y" ]6 s9 B
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-12 10:31 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表