找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

156

主题

543

帖子

1180

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
' j; }: ?3 |3 T! a5 U
( C6 U9 e+ T$ h8 R2 |$ D/*
; t2 I4 x% e. R* {! c; ]2 g, V*@Name:        PWM_led+ K* o4 |5 S, F( i1 ]
*@version  1.0: K. {! B$ A9 W) {3 ?) x
*@Author        xiaopan
+ d: k2 |5 `. {. u# ]3 j$ ]: u' R  K*@Date                2014.8.2
& I- e6 ~! \3 U*/& a3 e4 H8 C5 K5 K: ?

6 ~/ \7 W1 ?1 e: u5 b+ `#include<pic.h>
, O! o8 a2 i2 T#define uint unsigned int
% k+ ?2 R2 k2 |2 d; o#define uchar unsigned char
) h2 d% E8 c. j% S
+ A2 w5 i' u" w1 M+ C! y#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
; F( P7 P: \, i( A9 F5 \3 t#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        
5 e5 ^3 ?9 E: a
' j; x6 p' ~0 A4 Z) R9 yuint Time = 0;
. C2 e. @+ J5 ]  Duint cnt_1ms = 0;
: D. ^- @+ {: ]( _  y! Z( w0 Wuchar State = 0;
1 V7 x9 {# G, E4 v' x5 D- r" \4 i6 F  n
void GPIO_INIT();
+ C: k! e* F/ _; {4 S0 W: Dvoid TIMER2_INIT();
; w$ X& L+ H! x& c' O6 Uvoid TIMER4_INIT();
  F: t5 Z' _+ Hvoid PWM_INIT();( c( s* T: K+ q9 {
void Control_Task();
1 z3 {1 N/ h3 p
$ I( y& }% ~$ [8 c' K2 v/*
* t: G! N, L$ i' a' Q# m*@function 主函数" R8 f" H: x' t; F3 B7 `
*/
, |% X# X' D" S8 K, Avoid main()9 ?6 t0 |$ Q' c, }2 B) M* T* L
{  w6 D% H" f4 I4 A$ g6 s: p9 y3 K
        GPIO_INIT();% x6 \7 c4 q( L8 L: C7 a
        PWM_INIT();0 d) v" h  V2 u. U0 H
        TIMER2_INIT();                                //PWM利用TIMER2
; a0 t9 s# l- g7 N( H' Y        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形# O1 y) i6 |( R9 B% ?% D6 R1 e
        while(1)2 a# Y$ Y0 X3 B  e& o3 S
        {
2 c' V/ C. c8 N( [- R4 @& r                Control_Task();3 {( F8 }5 `) H7 r, I5 N; j
        }
% Z0 b, q* T8 U  b}
5 L4 c" m5 M. l2 I# l& M" M/*$ g$ c3 C( b* O7 u% ~" v# {3 t
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
* C8 p/ |: Y, F" I*/
4 m1 J! ?  E+ s' K5 R" c, Kvoid GPIO_INIT()
1 x/ w4 r9 g$ e/ {# k5 y{
$ h3 m# i4 O# w0 _% C" _        TRISG = 0X00;        //设置RG口为输出: b: E" `9 \1 P' q
        ANSELG = 0;                //设置RG口为数字量
( F/ b/ j! |8 v        LATG = 0;                //设置RG口为低电平- G" m: T4 X7 K' N1 E* h, V  P
        
" _( b! D- _7 a2 ^        TRISF = 0;
' c1 x; k* \( K9 \6 x- B7 I, N        ANSELF = 0;9 {1 c. t: D5 A( |
        LATF = 0;
) P5 @# R* G* o}7 q2 s+ L" C. B; i) {
2 g# I/ G. ~- B7 R% S) |; z
/*
6 ^" K- w* j( |, S' ^. e* F. U! E) ~*@定时器2初始化1 k1 m1 c3 Q- V
*/! \# T" Q4 M! F# C
void TIMER2_INIT()+ w" I* x4 w' J: V8 C! ^
{
, V5 B' L2 P+ Z3 N# W0 C: T4 h        TMR2 = 0;6 |8 m8 z+ k& |) ?7 A& k  K) {
        PR2 = 255;                //255
/ N6 g7 I% n3 W4 i- i: f1 r        0 A) _8 U( R" r) O- l4 K
        TMR2IF = 0;
& Z8 a0 x( `8 f" u; o& B        2 U$ Z4 ?" T4 E; @
        T2CKPS0 = 1;        //1. m6 m: [! m0 Q' l+ Y
        T2CKPS1 = 0;        //0! t+ P& ?  X) R
        9 A% ?- v4 C& T( i* F/ B
        TMR2ON = 1;        6 ^' V6 d5 n! c( ~
}% G8 i7 r1 K: N# D6 c! g4 i

. d* P/ P  B5 S+ Z/*3 f/ N2 s- z+ W5 b
*@定时器4初始化
5 b, K3 b7 ?! G7 }/ v: E) A' `*/
, A" `, |- z! [8 t" \void TIMER4_INIT()' W& `2 I2 h* [; l; D' I
{
9 r& R% i6 ^, R, ?& I, |; c        T4CON = 0x0e;                         //0000 1110
$ _3 {9 k: z3 b' _# q# J; b2 F8 o5 s+ A! e  [$ B6 j+ f( h
        TMR4IE = 1;
( k4 I; ^9 Q' k' x* p3 ^, t        TMR4IF = 0;                              ) j0 e# g4 U* I1 K+ o
" S! d, v/ C( ?7 x: d
        TMR4 = 0X00;
1 K' R% w3 n1 S" _6 e3 f" g' o        0 U) H. Q: z% L3 @$ h  o
        PEIE = 1;- _" N. S( X& S! t, _- D
        GIE = 1;4 t$ b9 }1 U" p
}
# P" L- q: {1 n1 e' y$ _
$ Y" Y0 f9 r) K
: _$ W' U3 A- p5 l& n3 u3 A* i/*+ e0 t- Q( c* A
*@ PWM初始化
4 L1 p+ ~( R" Q# b% P: b0 P% W*/* H6 \7 K! h  W, a% J, \
void PWM_INIT()
4 K; J9 z+ a3 P$ L: Q{0 ~+ J; n  l% k% @6 q  \: |" N, }
        CCP3CON = 0X0C;" x( R7 G6 F( b# q
        CCP4CON = 0X0C;
. {6 G/ d! l0 @7 j7 \/ K( h        
7 C7 a& A6 ]4 _6 L5 H% x        CCPTMRS0 &= 0X0F;0 F8 {  w* X- @& v6 e
        9 j, {: v# i8 j( \- ^7 Y1 \3 ^) _
        TRISG = 0;
% G* I0 c/ }. r$ e}
/ T1 s6 U4 p5 N
& I2 d+ ~: E% w1 t; s/*
& U: ~3 i9 w# c' Y" f' V2 l1 N*@Function 主任务函数! F( {* S" K- N/ U6 m
*/
3 S0 b' L% N7 L9 }4 p) p! W9 _/ g& F" Pvoid Control_Task()$ ~0 J  V5 ~) M3 M
{
& y" A8 o2 Q, r' T$ [& m        static uint Time ;6 h0 L# \5 `. I# s5 P# V
//        static uchar State = 0;' P8 Y9 }8 k9 Y; x
        static uint Record_Time;
' A' T+ F5 c- v  I. r4 u. c        uint Delta_Time;$ L- A3 r5 L" }4 ^! V1 G
        
' I8 C1 B8 v- t* l7 z: L        if(State == 0)9 M* w0 f9 J, _1 {
        {
) @& p: r9 }  F# Z                Time = 1000;
' T. T/ ]( n# S8 |$ t  A1 s                State = 1;
$ v- M5 d+ D2 n0 @: Y' q. K- m1 F8 q6 e, E$ r& Z+ P6 y
        }
1 i" o1 L' T% `: a& R) p0 j        if(State == 1)
8 N" C' ^7 J  Q2 w        {8 c4 E/ x6 v2 r+ Z
                PWM1(Time);
$ E8 v+ W/ |7 o4 {2 W+ O                PWM2(Time);
( M1 b! w+ K7 s% N5 E               
0 e  {$ y2 ~, U+ G                Record_Time = cnt_1ms;
' c7 r# H+ q+ u) A" s1 _$ q                1 s/ N( r- \5 J% V3 N9 v" _4 H
                State = 2;  g; t  j) j$ o. l. K, b9 Y0 d8 w
        }* B3 e, c  V1 W% U+ v) y+ X& `* `
        % K' M% @* q9 y3 D9 w4 I1 u& W
        if(State == 2)  d4 W( W0 z. l, {
        {
* Z( E6 \" ^) k1 U0 z                if (cnt_1ms < Record_Time)& w8 B7 N  w( v4 s. D9 q8 O8 N! c
                {  M' a; M- H" i4 g7 e
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
) ^4 u  x0 {' E3 c$ \                }
9 x6 O# Q! }" h& U. _. f6 D                else
( v$ b, w& Z5 w1 b) i+ ~# H                {
4 v" @4 `& d9 o/ J. [2 J                        Delta_Time = cnt_1ms - Record_Time;                5 s) [6 ]: M8 C6 p% [8 u/ i$ H
                }
, U! }2 R9 r2 j0 w" B5 Q" H7 y( q  R1 \  x1 h- @4 [' N
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
2 v  w3 @. G- b- P- I! a                {
* I' `# k% c" {) ?1 N                        Time = Time - 100;
* T3 `" u  F# ?7 [1 D. c                        State = 1;
! Z" x% X, D9 c7 H: ]5 F                        
0 I' {) }1 Z" v0 I. V                        if(Time == 0)6 H. T, F# V* J: O' V: b
                        {
3 t  t' {; c: c# Y( d5 L' ]1 U                                Time = 0;: N+ c  K' C# G/ o% g+ h. c/ Z, t
                                State = 3;
, ^0 B0 D+ M, `( r2 Z                        }
+ ]2 V% f% ]2 s4 J                }
4 Y5 p1 f: B/ P0 U: [        }
6 L- m  S# d9 O  `8 h. K        ! l  p' i& H5 q% P3 q- `6 Y  T( X
        if(State == 3)# ?9 q4 r* M4 j% M; W/ G+ h
        {# x, n  z* P; ~! k' J  \! r
                PWM1(Time);9 T5 {+ G/ i3 D) S: U
                PWM2(Time);
) a8 O& f. c% c( l$ ^% g" T               
% q  ]' }& |: l3 C2 G                Record_Time = cnt_1ms;
# P+ O9 b5 j1 H2 B4 E5 E- m                : b' g+ x) G) @' @( f, t( S
                State = 4;' C$ _, o% N- ]8 b
        }
; ?* D* o5 m1 i        . \6 D( E- o) m0 w! z9 b$ Q
        if(State == 4)
% n5 R8 I6 x' C& h2 K$ ]: J& [# @        {
' j- X4 c% `  b5 E& {9 a3 I$ T3 s                if (cnt_1ms < Record_Time)9 _. Y1 E/ }) ]+ [4 m( B: ]
                {
  u% @; G+ W  h8 Z4 a                        Delta_Time = 65536 - Record_Time + cnt_1ms;        + r, b0 }: |& n; r! \3 `% @
                }
) U7 ~6 T7 `* j1 ]; D3 y                else
, `: a2 U$ t+ I: ~( L' V$ f                {" K  |4 S, c( S3 X5 {% G' O: F$ J8 w# p
                        Delta_Time = cnt_1ms - Record_Time;                ! x! I* R4 ]) y8 I
                }
; F% |- ~! H0 h, e
( p* O, ^) T5 R9 |% w                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
4 c: z3 ~3 u' e# T                {
1 `) D8 F: X; z                        Time = Time + 100;
3 D8 S$ v  e( j  ], p                        State = 3;: G9 J& w) C, b. G6 m- a
                        
4 x# j/ C' I  F) |$ E                        if(Time == 1000), x& d! j0 h8 s4 }9 D. E1 i1 u' A
                        {
" L) J* c2 `8 C' s8 R5 a/ \                                State = 0;6 E8 x3 j/ D# m1 w! N
                        }
: M% A, J! V7 T  ?                }% A0 M" ^% h; l" l1 H  W
        }- c5 @  l5 x5 i$ L
}. u" \1 p" F' j

) m6 r7 n* `7 M9 n7 D' H2 D$ }' Xvoid interrupt ISR(void)
+ b/ S* d7 ~1 A{
1 s3 S, l3 Q3 b+ F) b% x        if(TMR4IF == 1)8 t8 V" x$ U7 L
        {
' p7 x  \" i- [6 W# Q8 |                TMR4IF = 0;
* l( N. W- W; t+ K4 N                cnt_1ms++;3 Q5 q" p/ m* [: h
                  F8 I; e/ E; |; `
        //        LATF0 = !LATF0;: t; ^, V+ t1 g# ^4 @- B
        }        ( N5 N# r6 c( |9 i1 s0 c
}
, s1 z- d) t. e) P+ L3 h

PIC16F1947原理图.pdf

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

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

183

主题

642

帖子

1350

积分

四级会员(40)

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

积分
1350
2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈/ p7 u( a) Y  v0 ~

160

主题

620

帖子

1233

积分

四级会员(40)

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

积分
1233
3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!
( C% V, l9 X' Q; R

157

主题

597

帖子

1239

积分

四级会员(40)

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

积分
1239
4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!
$ d/ q+ X2 |; A) v) p* ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

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

GMT+8, 2025-7-1 07:51 , Processed in 0.060109 second(s), 33 queries , Gzip On.

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

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

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