找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:4 E4 w8 l+ p& q
: n0 Q. ^1 ^, E- d
/*
2 ~4 g5 Y7 A9 N*@Name:        PWM_led
" w6 O/ e+ m$ p; t1 f*@version  1.0
/ u1 n( `6 `, I: I: @, O% z*@Author        xiaopan. I2 K. s8 W& U/ J
*@Date                2014.8.2$ @# S8 t/ B* `- G5 H
*/% J! r6 m" T4 j  S! R. Y! H: g" E

) M: v0 m2 _, e/ U#include<pic.h>$ r  s' B3 x+ {  N) c
#define uint unsigned int
0 w1 n/ U5 l  D2 ]; l1 r# y% v5 o9 e/ @# P#define uchar unsigned char) G0 ]8 B2 z0 [

% F1 T- K. g& B5 k5 G! [#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
. [' |% U2 b8 E7 D0 `#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
# N9 u6 |' j% L- W0 }
5 ^" A& N# f% I, kuint Time = 0;* X- i; I8 w/ j8 N  Z! c# A7 X
uint cnt_1ms = 0;
% h+ r9 m0 H5 b% S9 {+ w/ n! Q& Iuchar State = 0;. K9 |) A8 o$ r6 J7 Y7 [& j6 ]

' |: E% ]1 J+ ivoid GPIO_INIT();2 @0 F6 y! X2 n: [9 B
void TIMER2_INIT();
% W# b. v* h9 C& g5 U5 C* Ovoid TIMER4_INIT();6 l" t+ O5 z+ ]: b9 d* `4 f
void PWM_INIT();% b5 P5 c9 a. ?
void Control_Task();
! V5 u( e# x1 }5 O3 V3 C" W8 q% L% Q3 Q4 L7 u% m. Q8 U. {
/*
, }) d2 J9 O! E9 g*@function 主函数
& g9 d6 f" k: v- y. I0 y" i*/! A: T( v1 Y" D& V
void main(). k; M- c% d4 d; P0 n2 v1 ~$ o
{
, q1 }+ \, l/ r/ s. ?" x5 Z        GPIO_INIT();- n) M# \% b) P7 d5 F
        PWM_INIT();
: B6 K9 D+ [/ V7 C+ ^5 y* ^        TIMER2_INIT();                                //PWM利用TIMER2
  l: [; u5 ]0 ~) ~0 B        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形% r% m* o: f/ [& e, d
        while(1)
, W9 X7 R$ u. U7 Y" l3 `        {* l0 K7 i8 ~: q7 Y
                Control_Task();
) A3 e( {. _$ x5 r7 j        }/ E3 A& A# _4 k+ L/ x7 ~) r
}
; }3 q2 N1 W; ^7 z* ^/*
( R% H5 d# Y$ h, c*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
( C( h8 h& L$ e: s; H$ v*/
3 y8 F8 M8 P1 c% u4 t9 E, d1 Mvoid GPIO_INIT()
- c, u& b, f8 |{9 `1 x# |) g- W1 H" y
        TRISG = 0X00;        //设置RG口为输出: |% v8 |' h9 [. d: A+ W3 }* A
        ANSELG = 0;                //设置RG口为数字量
/ n# j" M) i3 q0 z' C) {2 [! U: G        LATG = 0;                //设置RG口为低电平
( q: @# N3 s! i7 N; m        
$ ^0 Q: T# \( Y% A        TRISF = 0;
, h# m9 Y4 @) j        ANSELF = 0;# Q% F1 L! ~+ F- P2 q
        LATF = 0;
3 U, J( E2 M  H/ `- O" p}
' W* A/ T8 ^( _; o5 `0 a( r% i
4 V( j* v& m3 M- b/*
" ]; x& z  p/ V" P*@定时器2初始化
$ Y9 V9 D: L  j- x3 z*/
& M' m& X, m. e; a5 |$ e6 \, _$ y/ bvoid TIMER2_INIT()
( I1 g- e$ T( U- O3 L{
& v! S. P' K! w; t! f8 D& X0 o! e        TMR2 = 0;; n5 {9 z1 o! H8 w: y3 q0 U9 @0 _( y
        PR2 = 255;                //255# G/ v5 ]: ~( S) L/ k5 {8 B
        0 s; a' N0 s# a0 E0 f$ R6 @
        TMR2IF = 0;
, ~' H. [) J$ L        
) P8 X% \0 n" v* z        T2CKPS0 = 1;        //1& I6 [5 _6 o  g
        T2CKPS1 = 0;        //0
8 g7 L3 \! m2 r  f/ X' O4 T        ! {0 t% P0 o. f" \" p
        TMR2ON = 1;        ' }, v7 d$ ~9 M5 A
}, o7 V$ r1 X. X. n+ c7 M
% e3 W3 H4 S" b
/*
# b& O' R+ z( Q- b. \*@定时器4初始化
" B- [- u2 @2 s  u! W& |*/
- X6 ?! a$ F. Ovoid TIMER4_INIT(); w) j8 }5 m! a5 W  K) O5 o
{' l, U! {2 K# E& S6 p  s1 m
        T4CON = 0x0e;                         //0000 1110
. ?4 Y8 `. N* Y9 n$ C2 U* N* w3 W/ X: c7 e4 B
        TMR4IE = 1;
1 q  c7 f- Z3 P& ~5 r( g0 v4 L        TMR4IF = 0;                              
' u- R6 T3 i+ b  K% [" }5 p( g+ u+ w( E  p% b
        TMR4 = 0X00;
+ h, w7 z/ _* J        ( G4 v" P: r2 n; j1 X0 |0 m
        PEIE = 1;( U. R: b2 k% _' b4 y0 }3 O
        GIE = 1;3 w: U7 o$ ^, Z4 x* \
}
* s4 M4 U% Q& B! ~
1 {" S* i" ~. Z# l7 f" Z
0 U+ v1 b6 @' Z: r/*) b+ U% O& I5 s2 x: K
*@ PWM初始化
0 A0 p3 `2 _- j# C. M. S*/! J5 h( Z  j, K4 K) S  o4 d- ~: E
void PWM_INIT()
. |7 Q7 b* N! r2 V3 F; o: J& H{& T6 c: E! S6 E2 y* ~$ d
        CCP3CON = 0X0C;% Y1 a: h" @! f: L. k1 s
        CCP4CON = 0X0C;' S. A) F1 x' b
        ; n; K: ^2 t9 p3 x
        CCPTMRS0 &= 0X0F;" [5 q3 h4 a& o6 Y% |
        . Q( f# G3 K# _. r; I& E
        TRISG = 0;7 A$ p4 }' I0 D- Y6 q, e7 @  n
}
/ q( b' Y6 v) O& Z- `$ n/ Q1 ?0 _. C. Y* P$ e# i0 h
/*
6 l* Z7 w) T8 [" ~9 s/ T*@Function 主任务函数
* |; }* d8 V% M*/- E4 v0 K" ^" c' E
void Control_Task()
- P+ b& ~* j7 m0 V/ }( `{% L+ P' _5 f! R, r! c3 B$ B
        static uint Time ;7 j. I6 q% W" V! o2 ?: E9 N7 h
//        static uchar State = 0;
! L7 o! A" {  s9 ?1 E! [        static uint Record_Time;4 J& h2 Q4 f1 Y. E* R% M6 E, P
        uint Delta_Time;! C7 D0 b6 U4 c
        
; s3 f* w7 e0 O5 F3 N+ k        if(State == 0)
% R' x: W8 Q/ U3 G! e        {! e. `9 W& N7 D6 U& g
                Time = 1000;/ u& M) {2 _: [
                State = 1;
4 E- L2 @$ A+ s  q3 ~
2 E1 j: E* U. j$ j/ w0 ]        }  n5 I: {1 @5 N6 D
        if(State == 1)0 ?+ Z$ |% K3 L% r" w2 O7 @1 i
        {2 w5 |6 w5 n9 v9 F. Y9 ^1 v
                PWM1(Time);$ `3 l, O, S: b: z3 C
                PWM2(Time);. c3 w% J7 r  t; U3 s
                # G7 |2 G! c) ^% r- l+ n* d) l3 q! H
                Record_Time = cnt_1ms;
# ]7 b7 H, U  l% H                1 a. T9 `7 Y; w( S# _1 }
                State = 2;# ~9 y0 `7 M  [
        }; x8 S& y8 n8 X
        * h) T5 p4 M$ b" f% e; Y# B
        if(State == 2)
  z% M8 i  l/ O1 N4 U0 ^$ U; f        {0 ]# ^' \5 r- `
                if (cnt_1ms < Record_Time)7 g; ]) p$ t/ c
                {
) R/ U0 K! p+ l4 R, X- E                        Delta_Time = 65536 - Record_Time + cnt_1ms;        : y/ Y$ D9 Y' Q& e5 R* |2 F" r6 S
                }* |& \( ~# g5 G; ]# `6 B
                else6 N' t0 G/ D/ q& H2 W
                {
. H" k/ G# h9 k9 h2 G" q/ T                        Delta_Time = cnt_1ms - Record_Time;               
' q, |* h3 R/ \; ?1 J# y                }
. A6 s6 x3 E6 @' u& t3 `
, F/ b  Y( F1 z2 ]4 _" l: o                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT: m( t3 |( J* v) n$ }% B
                {6 H1 `9 s# w6 f2 M+ S: B
                        Time = Time - 100;
1 H. Q7 {, t: b( i' Q; Z* J; T                        State = 1;
$ ^0 k: d1 i4 @& p4 _9 Q                        
" [" k& s4 Y; K+ a3 E                        if(Time == 0)
5 h$ @2 H$ [+ R* e3 t" S: {4 b                        {2 P8 n  Z) x" W0 m- K! p8 k
                                Time = 0;
- T2 V- I3 o' h* p: j                                State = 3;6 f, g* |# V; o$ M& f
                        }2 c  A% L' n% L" p$ F
                }
2 j# I9 E9 D. ^        }
# f( b5 ^; j; H7 L6 K2 w9 B; e5 S        9 g% W: Q4 T4 U' K  g. Y
        if(State == 3); W  ^: Y# g$ @, s9 D
        {
' [5 K1 A" V" [. r! r1 z                PWM1(Time);1 X* l( f* Q% @$ R
                PWM2(Time);
5 F# `/ U  J4 P8 U                1 `! f& y! ^2 |2 D6 j
                Record_Time = cnt_1ms;. o9 }+ \6 b6 @' M0 m  {
               
, [" @2 f5 V' Q% t3 {- `- T: {                State = 4;
0 m' w% d0 ~7 Y8 ]& h        }
" Z$ a8 |3 f  Q% \8 v2 b5 e        $ B! r( M1 \' G: \6 g1 n
        if(State == 4)
+ F: c4 b+ B+ w/ l" p4 Q. D7 `        {
8 p( i. {% {! g+ m5 \! u                if (cnt_1ms < Record_Time)0 i0 `+ o: f  e3 Y, C
                {1 B; r9 U  g' Y& c
                        Delta_Time = 65536 - Record_Time + cnt_1ms;          y# j, g) M# h; p
                }
2 K$ [- ~7 R2 s: n1 H                else- f' ~) D8 A( x0 H3 s. v
                {: U' E. n, T: b  g8 ?7 s5 [% y
                        Delta_Time = cnt_1ms - Record_Time;               
- E3 E0 s5 ^1 A                }
+ y1 K+ Q0 {9 ~, u1 U$ j; Z: i  ^6 |; N* C) M/ a- q
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
$ a7 I- c1 k; {; d3 u                {
$ h: t0 I: r5 K5 V, E                        Time = Time + 100;
7 x1 v: U* j9 ^  L& n! l% b# Z0 R! F                        State = 3;
- D5 X! f4 m0 M7 z0 C                        # V( E$ t/ ?" J* {2 m: x
                        if(Time == 1000)
" p( z# W6 }' v. m/ w                        {
/ W. g- r2 B9 q2 d, `                                State = 0;6 T! }+ P6 O  I- E8 |9 [7 f+ O+ k
                        }
9 E% ~  s, [- \& j7 l3 R                }* w$ d- \; T  x, S7 m0 a
        }$ ~7 M. B, T' r: y2 v
}" q: e- j& a2 [0 o. p2 x" u1 B
% ?# o3 W2 ?* j: M$ o- q
void interrupt ISR(void)6 f; z" V: |- h
{
: o4 c) {" o* R9 B5 m2 I8 I        if(TMR4IF == 1). f/ E5 u7 B! ^/ R2 a' d
        {
. c& s2 H9 s; \! n( K# b                TMR4IF = 0;
- G: C+ ^( u; m  J  z5 M                cnt_1ms++;
9 v; ?9 g! E2 ~% I: s               
9 s/ K, z: Y( Y        //        LATF0 = !LATF0;1 G- M; r) t3 i0 }& w0 S
        }        6 _; m5 Z  Q# F) S' T: k
}

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-19 06:36 , Processed in 0.059871 second(s), 35 queries , Gzip On.

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

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

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