找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

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
}

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:05 , Processed in 0.065255 second(s), 35 queries , Gzip On.

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

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

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