找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 329|回复: 1
打印 上一主题 下一主题

[PIC经验] 利用PIC16F1947的PWM模块做了两个呼吸灯

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1229
跳转到指定楼层
1#
发表于 2016-4-29 14:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
# [& j' M! f  t1 w
( h; c! U+ f9 L7 t/*( X9 o. b2 B  A7 g/ O) Z
*@Name:        PWM_led
4 y, A/ I% S7 b0 `2 Q' R; `*@version  1.0: N1 ]) k5 ?" p8 G: g: H( Z
*@Author        xiaopan
1 C# K4 K8 i( c% [; [*@Date                2014.8.2
% \) T5 q$ l. B: Q% ^  S, E*/
! W( i$ ]* P' ^) y) G
, x) w; H5 Z4 J$ r5 F0 j#include<pic.h>
/ F  S' f/ U6 E#define uint unsigned int
, E* w& X' x! `) O- J1 t3 z# v#define uchar unsigned char/ K; y+ t% Y# x4 t7 |

. T; Y; S7 S. D4 @#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        0 K2 o, u% P4 j1 ?) p
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
: u9 X6 J; F. s' m; u" J* a2 Y  P
6 V% \0 E, ~" _6 o! G3 c9 Xuint Time = 0;% r, m3 h+ T8 N- x# L( ?- P$ q
uint cnt_1ms = 0;5 P' b8 `# m7 p/ ~9 G8 e& f4 o2 n& o
uchar State = 0;
# Y6 x2 w9 _' @) C4 L2 O1 p1 Q; M  C! {& j. O2 [+ }. J
void GPIO_INIT();
1 x6 C+ t* ~, d" W* @* svoid TIMER2_INIT();
* Z$ v$ ]9 N& Avoid TIMER4_INIT();
, p6 b# ^: v' q+ E2 jvoid PWM_INIT();
; S  A9 @. l; rvoid Control_Task();
3 k0 m; O" O$ L8 P% B! \& i
7 Z; Z" J2 ^: V# ~! N/*
8 R1 W; R/ N  t, n- h9 q; @*@function 主函数
0 f1 J. I+ T* m0 I*/) W9 ]! D. S, }# k% V1 [! m! o+ e
void main()
4 p" z- E0 U% ]6 k- Q7 V4 ?; y; |' s{7 I8 u0 u0 Z# u  Z' F8 f
        GPIO_INIT();
5 U/ N. u8 Y! R" P) F        PWM_INIT();4 s4 \7 c8 e9 D. h! k& ~
        TIMER2_INIT();                                //PWM利用TIMER2
3 `! v$ [3 t% T5 s3 {        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形; _- T: C# @! M9 H
        while(1)
7 N7 m8 k0 i# C+ @& r! z        {
. k# `+ E' d4 r0 B# B/ p+ ]                Control_Task();) c# o- J8 y4 M
        }1 G& H' o/ D2 n7 u
}
( k& c: |/ {+ ~6 L9 H2 N/*
8 \2 C. O5 G7 c  `6 l, l4 C5 K' Z*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
9 F# |' P& w- p' \2 h*/: w& u, f5 I' ?6 R# u+ c
void GPIO_INIT()
( D5 e) m# b' ~% x/ V# X8 l{
- j4 x. U. v, l% @: S9 X  t( k, v        TRISG = 0X00;        //设置RG口为输出. t3 b! z5 i2 [& ?
        ANSELG = 0;                //设置RG口为数字量* j% T0 G9 V$ E# l
        LATG = 0;                //设置RG口为低电平
  L2 c& R9 `( I2 u4 i        * d: C- J+ b; g4 p' Z+ p  J" ^
        TRISF = 0;0 a- F! p  t4 B( `1 N1 T
        ANSELF = 0;9 ~" W& W, x3 n) A5 y
        LATF = 0;. [) r3 v' g) Y
}
) h- c1 e2 _; G5 k# M  u+ N0 p( g/ t1 v
/*
& h& u* G% N3 t1 ~8 L*@定时器2初始化2 Q$ m# ?2 L3 |7 o# l. a
*/
* y$ \5 M4 e( \3 n1 r& Lvoid TIMER2_INIT()  K$ o; Z2 W% d9 a  v. v
{
) l% h9 K* u2 u7 `  \0 J        TMR2 = 0;
: ]3 i, l0 @" T/ P8 s( m        PR2 = 255;                //255
$ V7 E" j7 G+ H0 M/ \4 A" t# }, ~2 d        
% d; ~, Q; B* W) j6 F        TMR2IF = 0;* g* B3 N7 O8 H6 C5 w, a9 m
        
) K9 D  @& T* G1 c0 j$ x        T2CKPS0 = 1;        //1
' I( k# S  M8 C+ y, y$ |        T2CKPS1 = 0;        //0/ e" ~" a" }) p0 `. f" c
        , z+ M- c; B% Q2 ~, P  N
        TMR2ON = 1;        
3 `( p' e3 ]9 p; P5 O}
0 n8 L, t$ M, F9 d. t+ F
7 @+ L9 N$ [+ K/ H  q& X7 K- g/*5 J% V# r4 B. ?+ r, _
*@定时器4初始化0 ]% c, G8 B5 X* {. N5 f5 S
*/; V: p0 Q3 o. Y5 u$ S+ E: S/ C0 N$ I
void TIMER4_INIT()
& L7 @: d% ]) h- k5 z2 Z- ?( D' c{
* y4 |9 m, ^1 i1 A+ b        T4CON = 0x0e;                         //0000 1110
) u# l, A$ B% }0 F' ~1 d$ }" c! \5 j- U8 g
        TMR4IE = 1;
9 Y2 ~: s! x6 V/ B2 `% m        TMR4IF = 0;                              
% O. O  a/ s, [
4 A# g! ~7 g7 Z; M8 I        TMR4 = 0X00;3 T9 \3 p( Z( K# j9 a/ ]/ [2 n
        - A8 M  ?, S" [2 N( z& f9 Y/ `
        PEIE = 1;
. V' p7 X" ^; G0 U        GIE = 1;
0 P: [. \0 h9 ?}( V+ J2 n- d9 M" K% ~* T+ l& `6 X
! [* h; R  c3 q  y2 M

/ `- F5 ?3 S& Z2 x/ T, i/*6 j8 I4 }# {( h) N% ^/ C7 }
*@ PWM初始化
: v+ L% T" s  L( H, n*/5 j6 X4 K6 D) A# z
void PWM_INIT()+ R( r! s" H) K+ g1 w9 |' o: @
{) L6 m+ B8 K% v3 R
        CCP3CON = 0X0C;
+ \/ b4 }/ _4 `7 K# A+ }        CCP4CON = 0X0C;6 C3 \( k* j+ b$ a. h2 j
        
$ k) m9 t! [- y# C. n4 \        CCPTMRS0 &= 0X0F;4 ^- i5 a) ]5 C% V% _
        
' y- A( S3 {* f        TRISG = 0;+ M5 t: G* T- i" v% n5 I. b7 I" r
}/ i4 }4 A3 i* z7 n
. g6 G0 }8 O9 r( J! y- p# r
/*+ |4 |  I( P* Z% J. f! w
*@Function 主任务函数1 }- E  c. \& s
*/
5 d# e0 r1 R( O+ D* jvoid Control_Task()2 c1 f0 N, \6 n  @
{
; z& D; g' e5 B9 g  `7 ]- n        static uint Time ;
3 G% T9 {$ y. w: P//        static uchar State = 0;
$ ~# B. \) [! o2 E        static uint Record_Time;, U# J* I+ |: i& r. Q7 k
        uint Delta_Time;
* Z9 E( V+ R/ u# H1 B* M0 k- ~        , `. z6 P: x* @6 d' u( y6 m
        if(State == 0)
- a: g% q" @: z/ N+ i, o( y7 f        {9 A+ z1 X7 y& M6 U( o
                Time = 1000;
1 _, C' ?: S/ k                State = 1;
1 ]& w/ X  l' Q* o4 z% F. n0 l' s9 e
% G" \  b6 b( j/ `: H        }; R2 e( @+ N) e& T, l, M6 H3 `: v& e
        if(State == 1)+ B$ ^5 b6 `. H0 j+ l. M+ C6 b, b
        {% D, z. I' |$ y6 l
                PWM1(Time);
6 w/ j7 T' T# ]7 ]" I. x                PWM2(Time);; t. E' O; Y* x* x9 W
               
. b& C4 J0 Z' i) N! A% {                Record_Time = cnt_1ms;
3 R4 [; V3 X& Y. C7 V8 K                4 R: \( A, m( x8 f
                State = 2;/ d/ R1 Y" U5 e! ~* Z. }% n3 Y7 q
        }
  l; z* ?. z; O: i1 J% ^        # w, A0 P+ O: f) S4 Z  B
        if(State == 2)6 q/ D  X1 z/ x/ {- z
        {
7 W' Q5 O. M+ I                if (cnt_1ms < Record_Time)+ }& |8 F2 O1 K( k) q
                {- W1 Z; B: y( c
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        " [. ^4 |2 s/ ?. C& v
                }# J5 r* ^% w3 A2 I
                else
7 N* c& v" [1 Z5 M' O) m                {9 p, P. ^" P7 C6 Z5 e
                        Delta_Time = cnt_1ms - Record_Time;               
' B- o" Y: \1 O( _- l                }
/ T  Z5 t: \. v9 w: M) i1 x
- R& n8 i6 f7 K9 O. K$ x' v2 O, I                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT& {9 b5 ^' [5 C) _: m0 _
                {- o5 h- T: @! g* K0 `
                        Time = Time - 100;& ^, V8 U* v' g+ E2 \
                        State = 1;' [2 J  [; c& ]& G3 z7 y  }6 e) d
                        & z3 g( c. ?2 Z( [0 A
                        if(Time == 0)
# h) b; \1 V, b1 ^2 U                        {9 T. A  q- F5 `- i' v% c2 o; q
                                Time = 0;
9 g/ k; `% p; n# @4 e8 C7 b                                State = 3;
; C/ w7 ^) j# L- }7 W                        }* Q: v- |' e& {8 i' z9 v/ W
                }
' }3 ~, Y. y6 X# s. F" |        }0 z. a0 W; n4 ?) P! O4 p0 {
        + \+ ~' U5 a" c
        if(State == 3)9 @8 {3 O& K1 f+ W* `! c
        {- L- ?. Q3 u% H. O% O
                PWM1(Time);9 @' j# z* d5 m# V& i
                PWM2(Time);
- S) E3 Q, G& S8 T2 D               
5 o5 m% Z. A. Q5 O7 ]  S$ j/ J                Record_Time = cnt_1ms;
9 w6 x' C$ m7 `8 a, j               
6 j: x* A$ `: F/ X                State = 4;9 B" N# x0 Z! r
        }: Y  f8 h& p! S& ~
        
' E7 ]) {+ W) P+ `: U' n        if(State == 4)
- a& \4 `- v7 @: w' p        {( I! x' D1 f  v1 {8 u" c$ d
                if (cnt_1ms < Record_Time)4 e( y# X0 n5 G; d6 I* i6 w0 V5 u7 l
                {( C6 ]9 e) G9 |. g+ i
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
2 [5 G( {/ p4 @7 Z6 y+ |/ F                }8 p4 R  v2 \- J& M% \6 z# h2 O& [
                else
  Q6 @  K! n1 b# `" o# d- A* z                {
. I2 V# g0 i) H                        Delta_Time = cnt_1ms - Record_Time;                ' s  m8 E2 E8 o# n$ }
                }
- g. ^+ |9 F, }& R# R8 m
/ Y2 e+ B$ f/ s. ?: U8 ^                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
4 T) V8 S( k$ \; ]                {
6 X, V0 W( P( k( k                        Time = Time + 100;
5 @8 a2 G3 M2 Q, u9 \+ L1 F                        State = 3;# t+ U8 s" y6 u" ]( @. R* k. _
                        
. G/ w5 b9 P* M1 `* @                        if(Time == 1000)
# s' m. J, w5 b1 P/ L5 R; G1 J! `                        {0 n1 ~. C3 o  q# Q3 c. E
                                State = 0;
/ d8 @8 Y2 y9 p2 t* K2 B$ Y7 W                        }
5 ]* [8 l# {; j" E" @! @                }- S+ R3 l1 `2 s9 ]7 T
        }- S6 N" x, F' c3 u& g
}1 n* O) L( v6 I3 Z  P, d

0 l/ `# \9 `) x) q6 j6 _  svoid interrupt ISR(void)
1 D' h) K8 U3 \0 K0 m{* e5 y; y0 e) X$ K# U3 G4 }* {% e0 S
        if(TMR4IF == 1)6 i: C$ b& \* K8 B
        {; o$ }& G  \2 G: G# E& {
                TMR4IF = 0;
! h" C" _+ f4 Y0 P9 P$ |                cnt_1ms++;
' h0 B8 }2 Y; j, {; q1 p               
0 Z2 h8 m! t$ a* N" D' L8 o        //        LATF0 = !LATF0;
! ?  N  i) g; j        }        
2 w% g4 K& C( A! z/ A) j8 }}

PIC16F1947原理图.pdf

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

159

主题

583

帖子

1229

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1229
2#
 楼主| 发表于 2016-4-29 14:21 | 只看该作者
长久的日积月累!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-1 14:02 , Processed in 0.062242 second(s), 35 queries , Gzip On.

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

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

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