找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:7 q; D/ i9 M8 o0 W3 W2 G

4 e' x  j0 j# I/ S6 G/*0 P1 t3 r  Z) m3 E: R
*@Name:        PWM_led
- V0 J7 _9 l, X*@version  1.0! N4 o2 G; o6 e8 J; _
*@Author        xiaopan
( J. \" R' F% X# ?% L" A; c( d*@Date                2014.8.23 @/ j7 n3 i3 Z0 W# ?$ N
*/
9 M6 R, k8 ]. y% Z% o# y, D0 A0 X4 t4 b# l( K  H( X3 x8 @
#include<pic.h>0 ]8 s3 ~# z" G, F2 U  {$ `
#define uint unsigned int
6 P- G+ z+ |/ H* u4 l2 V#define uchar unsigned char
  H7 u; I; R; q+ o: c7 \8 l/ }, E6 Q5 l! j8 d' o2 ?+ R
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        4 q- a, t1 U$ `) W, A
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        6 H3 l$ Y4 l; q2 |

- |" W6 |  q! l' W7 H& |% {2 |1 Cuint Time = 0;
! P- ?5 w: \7 y4 Z5 ?/ puint cnt_1ms = 0;
7 Z4 Y, }/ ^, c4 @uchar State = 0;, t) V7 w9 {: E0 y/ `' j6 W5 P

: C! }9 ]+ @' bvoid GPIO_INIT();
3 m" Y4 X, I! @3 R& d9 W" _void TIMER2_INIT();( K9 Q" i! I  K: y7 Z7 D
void TIMER4_INIT();- d% Y  p* @& O% \8 Y# h
void PWM_INIT();
) {' E# U1 P* Mvoid Control_Task();3 y2 W2 n+ [( l4 g( t# K) i, ?. e1 |
7 \7 y; i; ^) Z& u8 n& n; E
/*8 _' _$ D, ?+ S: n
*@function 主函数
# p2 H& V$ K9 ^& g*/
1 I$ e& e" X2 h7 B( e0 }void main()
& Q$ a9 a# D+ W5 `  ?9 k# U{3 p) R2 O! w  V8 f, Y4 u
        GPIO_INIT();
5 B! z1 w' D3 F  k, u8 s        PWM_INIT();
1 G& g8 ^8 c. C        TIMER2_INIT();                                //PWM利用TIMER2$ y: ~, L6 k( U
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
( K3 N. ?: [2 \: C* l        while(1)
# n8 C4 F+ C3 m7 f" d        {) b# N5 c3 {! j8 A5 b' @
                Control_Task();
  l) P# Z. t% x2 T) r  D4 z        }( Y+ K% k  T- _$ c
}5 U. t' R6 q2 `- q9 z0 R
/*
: R$ T4 d( N  S* R0 J*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
6 K: f& b, ^: |*/
% @& H: N' N$ e: k4 b; kvoid GPIO_INIT()( }* y9 y* r& a3 y* O3 a
{+ l" y  e* r; S
        TRISG = 0X00;        //设置RG口为输出7 T# k- F  u( U' l; b$ N+ U4 H
        ANSELG = 0;                //设置RG口为数字量1 p. D2 e3 A5 ], u
        LATG = 0;                //设置RG口为低电平7 X% R/ p9 d/ y0 J% R
        . k  e0 g$ j/ ]* O6 r: _
        TRISF = 0;1 _# q. V9 H% X
        ANSELF = 0;
) o, b1 ^# `, Y5 N        LATF = 0;0 m/ J+ S/ n- z. j/ Q! d4 }7 p
}% o/ d2 Y. ~. x; V
' O, N+ d, O+ h* F
/*8 ]9 R. p8 H3 k8 K4 E% @
*@定时器2初始化
7 l( c- P  e( a- \*/6 `9 d8 V3 S2 g
void TIMER2_INIT()# k' V# E& R8 d3 `! W
{
6 P6 b3 N0 @0 @, V6 \        TMR2 = 0;
. b( C/ M4 }3 s/ c3 a        PR2 = 255;                //255. A, o7 G0 y4 {) |/ x4 U
        
4 z$ Y) M0 u6 Q' N1 P        TMR2IF = 0;
7 S$ a* P) G2 q, V* a. H% S        6 z2 {8 S9 G! v( Q. U
        T2CKPS0 = 1;        //1) Z( h! w/ }; b9 P) f0 M
        T2CKPS1 = 0;        //0
* i1 l9 B2 s. u2 v$ W! e        
4 v0 ?# y) ]* C& H        TMR2ON = 1;        / y  j, {# ]9 O. _
}
& \, _$ f" b! P0 G6 p+ h9 O; D0 s; ]& R/ b
/*0 q1 ?. }8 }- O9 W
*@定时器4初始化
' W+ R) \+ i+ K0 U6 K, ^5 P, _7 y*/
8 L9 t. \* l/ S6 f2 vvoid TIMER4_INIT()  C, V+ A' R0 y: W& f, ~
{
" J2 H/ g* e3 B8 T        T4CON = 0x0e;                         //0000 1110
: K$ @4 c1 I6 e9 k/ e) L
( H5 _& F7 ]* Z1 z: y; t0 x- U0 t        TMR4IE = 1;
3 P1 C  n0 m7 D6 ~' b        TMR4IF = 0;                              8 L$ f5 i- X  r) B- v: Z; e0 ~

7 o; _3 s" A" M        TMR4 = 0X00;# c7 |* N3 V/ m! y
        8 o" G/ a$ v- J" V, o6 D
        PEIE = 1;: p2 Z) O+ P3 o, A: f/ g8 C+ l7 m
        GIE = 1;% ~8 O* S" D' e6 D/ e
}$ e2 H0 L5 U# [- M4 C: k  e

8 N0 [( C* ~7 M. k3 d8 a* }. E: m3 e! ^' }0 f" i2 Y
/*$ O* Q- S7 M* B9 D
*@ PWM初始化
) f0 M7 @) r+ |0 c' q0 M2 c9 u*/8 b; W( U' W, l- q5 L3 y  E& F; j
void PWM_INIT()  C: K2 h9 J0 M  ?
{
( f. D$ |" ]: C9 Q- g4 y        CCP3CON = 0X0C;
+ }! @5 Z" U0 Z0 I. x: h3 ?        CCP4CON = 0X0C;1 Z* v& K( y3 h/ ^- H/ D
        " ]5 i5 c2 |4 g9 }6 V
        CCPTMRS0 &= 0X0F;/ Y6 P) n3 X0 N* [- D
        
1 n/ U7 m* v# O; y/ u, p        TRISG = 0;
( O1 F4 w$ a: i* G}
( l. X  M( o  g5 Z0 e" S% }7 o$ W7 R/ X  t8 A
/*  Y& T3 e$ `* ]. E
*@Function 主任务函数
2 ?2 Z  i- g( w0 z*/$ x- q; U! B4 \0 G! T1 k
void Control_Task()
; ?3 @) {$ A+ \, x1 {: N{& H& s( i/ I' N' t1 s0 a# r
        static uint Time ;. w  O$ F! i+ z$ E8 K3 U/ o
//        static uchar State = 0;) _  O; Z0 b7 I; l# ]5 T
        static uint Record_Time;
3 P  l" M- B" {3 J        uint Delta_Time;
/ r6 O. N$ K3 I3 O) K        
! L4 l9 W; R) k# p        if(State == 0)
$ g- a! N, `$ E; C  n: C/ F$ Y" X        {# {) c7 J( {& W" s+ L( d
                Time = 1000;
, X1 S- Y* w" T2 }: M$ Q* ^0 x                State = 1;
$ _. B2 L  l4 y
1 @! X; `7 \; w  b! L        }2 C1 y* t+ b: V% h# ?0 X
        if(State == 1): H3 u' ~9 r7 j. @
        {* ]; y7 P) `; q8 X- q* e
                PWM1(Time);
# `' M" Z6 d- n3 @7 B* b                PWM2(Time);+ ^( y! A) o- g9 g/ L; p: E
                : x8 ]' p" k7 Y1 b
                Record_Time = cnt_1ms;
+ O  a/ D0 q1 A& A               
- L. v+ G5 A& Z2 M2 z; P                State = 2;
$ l( v2 [8 G1 j, i3 U" V        }
* ?* Z3 {& \* [$ u* c& q  s2 I        & I2 k4 L8 h& R+ ~  ]) f* z
        if(State == 2)
" h8 D) m0 o( L: V5 l        {* G! f! U" n( N8 s) y
                if (cnt_1ms < Record_Time)# }3 Q' N( A" O* x! N: i
                {* {+ `& y3 E( T+ ]- x5 d  }& v# S4 ~
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        8 J# Z; ~5 B! G6 z
                }) h6 Y. \) b+ o/ ^2 o4 O
                else
3 J; \& t3 c& |, R                {
- h9 P  r# }' p9 D: S+ r                        Delta_Time = cnt_1ms - Record_Time;               
% H: C7 ?1 ?; U- P6 z& d7 w0 ~9 I                }
$ k; t0 |' h* \
6 ~: V0 K- c8 f2 K8 ?                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
: z7 D3 ?9 v& _                {
/ _/ b, w8 G' l" a# b& a) Z+ ^                        Time = Time - 100;
& W6 r1 V" ~! k+ _, E& {5 T: u* L                        State = 1;# n& ~" A2 J( B" |% L( P
                        
4 Q2 F! c# w! e7 P% E. i                        if(Time == 0)% ?( ~, @8 E  a( x
                        {# a' T7 H) Y1 y  Y
                                Time = 0;8 [! E1 j8 K8 D& ~
                                State = 3;
5 ]  G8 J7 F6 g+ u, K                        }& W* k4 k( O! A+ B
                }; R7 j" i& m$ @0 Z% w/ u
        }
! p5 F2 f( Q4 M% H) m        
& j' r% Y6 a; H1 }6 d5 Y        if(State == 3)
3 Z; K, ^, P: ~        {
3 G/ ]) O5 [& G                PWM1(Time);
' G" V7 U. O( {                PWM2(Time);
8 S& d( w' R, v  K# I% S               
1 d1 m# Y+ P6 I4 w! F/ Y7 l                Record_Time = cnt_1ms;- N( P7 S; y) Q; O
                9 E5 l; ?: j' ^% c* A% \. W& V
                State = 4;, {+ O  A3 [6 D2 a9 }2 o
        }8 y" I& h: [- n" H
        , C& h. a5 S9 ~/ ?+ Q% ~
        if(State == 4)+ K8 }. Y& w" m) X: W4 e% z+ A  K
        {
# e  c; G5 m, A7 V) A                if (cnt_1ms < Record_Time)( a' X/ T3 A/ G; A4 h- @
                {
9 r& L( {* q& X                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
; I; H3 S" @. R, C                }5 e2 Y8 {* U, c
                else2 i2 k: `* j8 Q! L7 N* ?) A
                {% T  h9 M2 Q* b" J. U; @
                        Delta_Time = cnt_1ms - Record_Time;               
" O, t1 C6 }9 u* l! ^- y! W                }/ ?  b/ X$ K/ [& a/ Q
& y, r# _' F3 J3 Q
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
7 H3 Z& `: _& Z                {3 D% a# J% y6 G  J. d
                        Time = Time + 100;
# |' P$ R+ F) ~& i0 J8 |                        State = 3;
- I7 n- h6 j0 c. A2 Q) L                        
+ N' n% Y$ ?9 M& T9 l  t& D3 D                        if(Time == 1000)
5 Y5 j/ ~3 d. u# B                        {
0 p% f6 g# ?* k/ H$ L9 Y                                State = 0;3 z9 G6 n# S9 Z
                        }- a" _$ ^% D0 W6 \
                }# Y8 r) \; E& y5 f" M0 L7 G
        }+ a5 I& S9 J2 y
}/ [3 {0 _9 o* v5 C/ @% c7 U

* `% Y  [- e  K9 T/ ]9 dvoid interrupt ISR(void)/ s# d& z; E8 X, p% `
{4 c" Z: [4 c3 X
        if(TMR4IF == 1)- g: M. ?1 l* L$ y2 y) V
        {
& J. R$ m* d9 U7 e6 J: E. M                TMR4IF = 0;
' K6 B7 u8 c  F3 _) J$ \, f                cnt_1ms++;
+ G' q9 X* p! Q/ e5 \0 ~. Z               
" S6 |! j- F4 C( ^' F        //        LATF0 = !LATF0;* ?* d2 s8 R5 |+ B) f. P+ H4 Z  A4 c3 |
        }        & J6 `0 `% u+ E5 _! M( X) X1 H
}

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 10:39 , Processed in 0.058220 second(s), 34 queries , Gzip On.

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

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

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