找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

156

主题

543

帖子

1180

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。! W+ w; z) V$ l( F% q# {
6 ^9 i  d3 v; w, P; u
/*% {9 x' C. }6 k: M3 |. U& H  v) X
*@Name:        PWM_led
+ p& C0 Z% P! {! o* u% E7 v, S" I*@version  1.0
3 S: q8 q# N4 k*@Author        xiaopan
2 x4 H* m# B- o, H; o5 q*@Date                2014.8.23 Z# s1 E8 d9 H# y% @8 C- a
*/
1 P9 u% w; o! w" V  [. v) z" k8 n% f6 i1 Y: i# t0 W3 i2 k4 ^
#include<pic.h># M2 t' Y- i! I3 M/ z/ G& r
#define uint unsigned int ) C( z  V8 l# b; Z: X0 w: G
#define uchar unsigned char
5 z% I9 t% O8 L! X0 F1 b, B3 b5 n! U! x. i2 f0 V
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
* h+ m1 P  T7 Q$ L& H3 l0 n3 r#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        ' P0 E; L! Q" ]) d8 }# b6 G: \2 H
9 Q! d5 X9 T/ \8 D$ F7 U, l: z4 V& [
uint Time = 0;
# P) Z1 [: h, z7 E0 ruint cnt_1ms = 0;
5 R5 P2 V5 O, a% m1 b4 z  o. Q  quchar State = 0;
/ A1 A9 Q' j2 w) e& ?7 S" E. Q8 W* U; \
void GPIO_INIT();
  l2 s, y/ O4 H' _6 a3 z# Uvoid TIMER2_INIT();  O1 E! |. Q/ i; n' j5 |& u
void TIMER4_INIT();& b  K+ T8 l) u  h' h
void PWM_INIT();
! I4 `" \0 M6 h# k! mvoid Control_Task();! h$ Q/ h' e/ ~% `$ ~
0 j. e$ h8 ~$ @/ g7 H$ e
/*
! q2 P0 d& ]- k*@function 主函数
% ~) W! c/ V( c! v*/
  _1 }1 `1 j9 U2 e- w8 J: `+ \void main()
; [( T+ S- c8 @: M. i# m! u' S{, U% b& r4 w! S& t1 x! H* H
        GPIO_INIT();
( X1 f4 m( T/ R$ Y8 W" m        PWM_INIT();
0 u# M9 V/ i9 p3 {, R        TIMER2_INIT();                                //PWM利用TIMER2
2 S4 ?# x$ e- n: w% [        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
3 N( W% ?0 n1 s) G7 a' d        while(1)2 r( Q; ~1 d: f+ J! }9 d
        {7 l4 B2 N: @* k' N
                Control_Task();
6 x/ s3 \, ]( P% E- f; E- D        }' a) H/ l5 g( \" j6 X5 }
}
. p: ?# f( P( b2 H/*  `% s. h) V" f5 S
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4& ]+ K5 z' j& D2 L" l
*/1 {8 W; ]  }  f( x1 m
void GPIO_INIT()6 ]; n- \( s* f- r. A/ e& ~
{5 R  Q6 i! u; s2 P# O
        TRISG = 0X00;        //设置RG口为输出6 e& Z+ c# C3 |6 R# k0 E! P) l
        ANSELG = 0;                //设置RG口为数字量
. e! Y) R& w, ~) t2 r$ q        LATG = 0;                //设置RG口为低电平% k; |" Y7 @" p( s# \) @. D' q6 n
        0 ~9 p) d5 v$ g9 ^
        TRISF = 0;
( C1 Z, i! h0 m0 z- P        ANSELF = 0;
% b( @: y6 e+ y9 O        LATF = 0;
8 I& s& |* o# _" e}
$ K$ b# t. @; K$ P: A
) B& {8 Q6 e1 U- j0 \& p# y/*6 B# L4 H$ |% j- b
*@定时器2初始化
( G' d! T: x6 X2 t$ X( x, B: n*/) p2 R9 O" g; K
void TIMER2_INIT()  h& o+ [) v4 R
{
: n+ u( A( Y6 M' Q/ A        TMR2 = 0;
$ k- y& p3 J% d1 T+ r! n        PR2 = 255;                //255. s& h' D9 ~+ r8 G* l
        3 @4 l# t( J0 _( i+ n7 Y+ X
        TMR2IF = 0;# c/ ~, j/ W- x! R6 b
        0 _; f$ \% n# {1 }
        T2CKPS0 = 1;        //1; m+ H2 d2 S3 [; H& H( S) {
        T2CKPS1 = 0;        //01 y3 ]: R) d6 t7 f! z9 P
        
' W# n2 b: n2 H0 \  ^# I        TMR2ON = 1;        
+ ]) ?8 c* R1 L. A$ Z}+ V. j& q" \+ Q5 A
2 [1 V! G7 E; t6 c0 Z
/*
  `, ~# b9 H. f- ?' L% V*@定时器4初始化* \2 v+ I. i* H
*/
2 {! S; s  i: ^$ D( Ivoid TIMER4_INIT()  w: Q) d, H- d' Z) ~( M2 `1 z
{% [5 ?6 A' H5 x2 W& R
        T4CON = 0x0e;                         //0000 1110
/ q6 w( h. v! h! V1 R7 m: o( K  U7 I$ s4 g" Q/ i$ {
        TMR4IE = 1;
1 |* b- v: s6 `  |# J* l        TMR4IF = 0;                              
+ S) z- D; V( J: q) q+ w, v; z$ k) j; T. p; I) q
        TMR4 = 0X00;
& @1 r4 m2 v; Z9 V# ?, t, p3 X        - a2 r0 [* u7 ]$ ]" a/ r- ^1 H/ p
        PEIE = 1;3 ~6 H2 M8 ?" Q; D4 U
        GIE = 1;
6 _" C9 ?$ Q: U" @" U& d$ T}& _( j5 j0 ?. r: Z9 G  S

) N* e3 X% h& [7 Y7 P" e8 o. w' Q$ J  z9 G! X# Z* S+ U
/*
( n8 f1 d$ o8 Q: `. h! i5 O$ V% H# Z& N*@ PWM初始化
' _0 X1 j1 Q$ F1 E*/, X6 n. v# x9 D" Q
void PWM_INIT()& E- j) K5 W2 S7 y& b4 ^
{1 Z( Q3 s7 y( A* Y% ]0 z4 M
        CCP3CON = 0X0C;
# w# W5 y' }4 c7 K; P        CCP4CON = 0X0C;
% ]7 Q; u% }/ [7 `; m1 h2 \4 D7 Z) `. v        
" G" i( d" k" S3 L! j( K        CCPTMRS0 &= 0X0F;" m$ ^0 T4 U  \0 W# A" d: w
        
& B: C8 s' E) S. k/ c; u% F. f. q6 O        TRISG = 0;3 j$ O: A+ K" J5 q3 K
}3 A# t4 C: t5 x# x: k
: i5 Y5 C2 H4 t7 Z
/*
" B2 c; N$ v% M# ?3 p& C*@Function 主任务函数  @- _- s/ J# H0 A6 _% [0 X
*/% {9 r* G6 j, [6 n5 W: Y0 d3 ]
void Control_Task()5 o. D+ S: a; _% M
{. P0 O* G7 u3 M5 t
        static uint Time ;) _2 n. P9 L6 S- T  N" j( E/ a" o" r
//        static uchar State = 0;
, f7 ?% u' R, X' k/ A        static uint Record_Time;, M) }2 x6 j  [9 P( M6 `" u
        uint Delta_Time;
# L4 _6 A0 ~0 Y( S        
  D, p2 i& p& D0 ?9 D. o7 O" t        if(State == 0). i- z: {% m1 ~+ R
        {  z" Q( A( b! X1 Z
                Time = 1000;1 v  w9 o7 {6 g8 U* }4 ?
                State = 1;  P  B5 P6 b/ [  M4 p# J8 T
* t; j! B8 z6 J! [8 v% p1 q- M
        }
; X" S6 _/ o/ L* U% V' r- A        if(State == 1)
4 @& t' T$ E/ T7 W        {
& z: c+ h, ?% U) x5 X  N; ^                PWM1(Time);& b/ g- J: O5 H8 l# U  u2 H3 }# r% p
                PWM2(Time);
1 S8 ]. w( z  d! a! K                0 k7 i% i: P7 G( w
                Record_Time = cnt_1ms;3 s0 S/ r, W7 b' X* n4 S5 s
                , d: n; H9 T/ S- t& _' Y5 [0 U
                State = 2;
# r+ w: X, ~2 p1 `' B5 r' X+ F- _        }9 O; L& l8 U6 ~6 _# \1 [, c* }
        . n5 X# S  ?' A8 t; w" A
        if(State == 2)1 S# V6 [5 U# H  T* e) u
        {
7 W: s) ]7 K$ A                if (cnt_1ms < Record_Time)' k  Z& b" G) d4 l$ x' D
                {1 {; D& p- v4 n0 g
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        0 u' R5 {% d2 y4 Z
                }8 `, q5 r! j# x$ r! ?# |
                else
0 p9 \% Q" p9 [# B" H                {
4 H/ F7 H" Z, b6 ~& }6 I                        Delta_Time = cnt_1ms - Record_Time;                . _8 S( P: N; r; F
                }1 g0 v6 Q/ }! n7 y. Z( f' d
% Z. D8 M# i) g# U) M
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
. K/ [" U4 u! V' b7 {. v  H: m( I- ]4 {                {5 y$ @8 L* Z) W; @
                        Time = Time - 100;. N" A9 E# `  h  A$ k+ G2 }
                        State = 1;: w$ q4 E) O  O# ~6 A8 \6 Y. I- J
                        , F( v& x3 h; C5 |+ k3 F5 U6 y1 ?
                        if(Time == 0). U6 W' E" t8 y# ?$ x- o5 o- v
                        {
, I7 C0 R) F% v) n                                Time = 0;' X- n+ C4 V( i. n, D3 h, G! f
                                State = 3;
+ w4 j! q4 c" z; Z                        }6 f; V$ I) i/ r% I9 v3 m5 N& }
                }$ m0 q5 L" \1 y
        }% Y! u. ^$ B- R; N/ u
        ! f, E2 r$ G) m
        if(State == 3); I) G2 n" I* `1 K+ |/ Z
        {
! z6 }$ U2 W# Q# |. b& ~8 w                PWM1(Time);; R% |- U  Q3 _+ O2 m
                PWM2(Time);
$ ~' a; f- m9 K* M5 l4 E                3 X7 {( h% [. [0 X
                Record_Time = cnt_1ms;$ K0 r0 l( W9 o- [- {) E
               
( W* q3 W9 _, r' e& t% h. h                State = 4;
) T% Q4 I9 A- t        }
/ k, A6 @1 `* i5 ^% {) L* @( W        6 Z: X% I6 f. z, P# {# M0 r
        if(State == 4)/ k9 `3 i! U1 c. I$ S% M
        {
6 e3 C: V0 p6 a                if (cnt_1ms < Record_Time)
0 B0 L! M5 v' Q( _; T                {* ?/ j& |8 A5 N  U7 K/ ~0 N
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        2 |* @, i3 j7 }% K* y- r2 y
                }' ~* X7 k/ l, V4 T
                else
9 D8 _$ `: {/ [+ \: N. P, U                {( n( Z- W! _* J9 V$ k: X
                        Delta_Time = cnt_1ms - Record_Time;               
" ~* i. ~' [0 l- F5 R7 h6 r                }
6 ~' Z1 L( e9 O" ?, {/ o# ^) f8 W, \! {6 n- X" ~' u' k8 Z0 ~
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
0 a" V# P5 K0 N                {
9 Z" Z6 _  J2 z                        Time = Time + 100;
5 U9 F! d5 k9 x- b! E# X  L                        State = 3;
" y6 V+ N/ S$ q9 a& T                        1 c; |; D; z! b* n
                        if(Time == 1000)
9 I* v+ x8 @5 Q/ E                        {; w+ Q- N5 z0 K7 F
                                State = 0;+ G3 h5 G- h& A! M9 X
                        }
+ M! q, G: N+ }0 r) [+ @7 n                }
: O& b- D/ y+ ]0 @1 W        }% F1 r$ S; `+ N* h  r; m6 v6 I
}) X2 u8 r* q+ j$ e& v! l5 N
! u; O* ^' ?9 w6 z+ o  |; u- {8 X
void interrupt ISR(void)4 _: c4 t! {/ C/ P
{# l9 I: i0 D; z7 t; K  Z! d9 v
        if(TMR4IF == 1)
& q  C% z" Q) a# n( ?        {
0 y* m3 i  g: \* V- T                TMR4IF = 0;
9 i5 r2 U8 }1 |5 ]; j5 ?8 U- A                cnt_1ms++;
! [4 T4 h' X* @( e                6 \" _/ v" l! X3 B1 J
        //        LATF0 = !LATF0;
- r) o+ U& g! Q9 ?6 t        }          k7 U: Q. H: ?/ p5 v. W2 o4 H% p' a
}+ }+ a& [; p5 m. ?

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哈哈: u" |6 _5 P/ I1 k0 ~) A1 m

160

主题

620

帖子

1233

积分

四级会员(40)

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

积分
1233
3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!) p& f0 T/ }5 z- H& |

157

主题

597

帖子

1239

积分

四级会员(40)

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

积分
1239
4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!
% z* h! I2 o* |2 o* [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:25 , Processed in 0.071947 second(s), 35 queries , Gzip On.

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

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

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