找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

156

主题

543

帖子

1180

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。
8 J6 j' j' ]' K) B
3 K* K$ I( R1 l4 `. |3 r: {/** B# `5 [1 x3 V  ^! s
*@Name:        PWM_led5 _- E$ ~1 j6 A. z
*@version  1.0
8 l# l3 d5 W, R8 D0 Y. C! Q*@Author        xiaopan
1 m# V9 r( T  d. r9 k6 j*@Date                2014.8.2
) z( y& x& ]6 e9 W*/* ]4 e2 T3 q5 ]( e; r2 O$ Y5 [# a
( l/ I. L& S0 Y  q7 r  M
#include<pic.h>, g# ]$ g0 e* B  i, _: Z
#define uint unsigned int
# O# K5 w! Z7 k+ n# p: P* t6 W3 ]#define uchar unsigned char
- Q: e' N& r0 g
: ^, I2 g. |# E9 u4 X  m# [#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        . D, ?7 o2 }* `& p
#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        " T6 g8 e' V4 a! [: j/ ^
0 ]% D! F5 ]1 l/ t( X# R& z  L
uint Time = 0;8 X; R) R7 k9 o2 {, b( c: `
uint cnt_1ms = 0;2 q2 o# p( a& s: A; `1 c! R; M/ I2 s. ?
uchar State = 0;
* v+ O/ s% M$ L6 K1 V5 T/ N; |3 b  L! ~1 U# z
void GPIO_INIT();6 x8 b5 C4 V0 l. y1 O
void TIMER2_INIT();+ x- F( n$ T) K1 y  e
void TIMER4_INIT();3 C* a' N& z+ n0 x9 ~" @
void PWM_INIT();* Z) `, I& ], U4 E+ D. ^
void Control_Task();
8 y  S: K; A+ e3 v( w- i; S; g. \
4 `3 H7 l* {' U( R+ }/*
9 Q# W7 [0 g8 F; b1 I2 n6 A*@function 主函数0 T1 \# ~+ x1 C2 P" j/ {8 [
*/2 ]- A  I" N1 t/ o
void main()
- y( h- h: k( [0 k{* c  j2 R& h3 O- n* M
        GPIO_INIT();
5 M( V/ ?  j0 Q' ]: w& }! g# x        PWM_INIT();4 h$ V, L' E( }$ x* r# W4 c) d* t
        TIMER2_INIT();                                //PWM利用TIMER2! j+ l+ A: ]5 v6 ~
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形0 c$ g6 @" q# F/ b- C1 G
        while(1)
3 c8 D( @: e" L: E        {+ m5 {+ a  ~, [& R
                Control_Task();
7 C0 Q  f% R. u6 V4 U        }# `, j+ ?  \) v6 ^: N9 |
}
* N9 ~& b, u3 o  B( {5 N! @/*& C3 Q; w' W" g
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
! i$ f9 o2 l, h) r; B. D" {9 n*/6 D3 O. L1 t3 {" m( E: H
void GPIO_INIT()) h) `  m8 f" J
{
! V; V  `) {5 c( y6 q0 a% ^        TRISG = 0X00;        //设置RG口为输出2 s3 X" h" W+ F6 _
        ANSELG = 0;                //设置RG口为数字量" M, V8 E* h" ?  D+ m
        LATG = 0;                //设置RG口为低电平
* d; S& @4 R8 n" \        
) H5 d4 k* `$ Z" G6 G" [5 n) L: R        TRISF = 0;4 D. k8 q% N9 q" f
        ANSELF = 0;3 E- |8 N- p( a4 X  X4 |6 i/ J
        LATF = 0;
% V% g1 I* {" P}: x! w0 j/ Q7 F$ A4 o
- s- n, o( E' d* B
/*( B: }. {8 R0 @/ `' j
*@定时器2初始化
8 F" H; ~7 u7 Q0 G*/
3 Q- T! f* D; n8 l5 Ovoid TIMER2_INIT()
+ t" G3 Y* N8 j: k# S+ M; F- f{
& O7 W( `" d0 x- |7 Z0 S1 v        TMR2 = 0;! T" x/ ~5 K3 T& `% ^3 g
        PR2 = 255;                //255; E( N) g8 c4 [" G0 I2 x' v& n
        , ~. ], s) Z% j1 w& I  \
        TMR2IF = 0;3 Y7 U( J% K. F/ }" k+ S
        
" Q5 o, U6 I' A6 f+ Y4 [. O. Q4 Q        T2CKPS0 = 1;        //13 I- ?/ y% I. v/ q
        T2CKPS1 = 0;        //0/ f. K# ?, U) \4 D8 d$ A4 V# I) V
        , s' L! e, t6 \) k2 ~- s3 E
        TMR2ON = 1;        
7 _; A% _7 T% k" |}5 ~0 q- u, \9 j' Q1 z7 S  @
9 p+ R4 f4 h4 R* J, W* `6 g
/*$ j$ ?1 H2 U/ r; Z. e0 u% f
*@定时器4初始化
# j. L! G* i$ U*/
+ f0 d! \, v- Q4 {0 H8 w. j3 s9 w+ ~void TIMER4_INIT(). W5 ~2 j; b$ p
{3 n4 e/ f7 i' j. {+ S
        T4CON = 0x0e;                         //0000 11104 M9 N5 W$ M+ Y. T- b: K

# R/ f: x& x  D( M, _5 a1 q        TMR4IE = 1;
) B+ R; ^; I; z, b# P- U        TMR4IF = 0;                              
4 d: r9 t5 `5 K7 [  f; p* C* t3 T+ \# V. ^! n0 V* U
        TMR4 = 0X00;
! F" e! Y8 @" _* M1 t        ; e+ B7 H, f  |' @3 F' _" I
        PEIE = 1;) u' O9 Y! ]! k# g
        GIE = 1;
+ ^- g* p  _- v}
$ G6 Y- U6 x8 |' j& p, [
# V9 b: `! P5 _5 L
# ^2 a$ U" r' F" @. \2 B. \/*
" f: {& l" l; F! m/ N' `*@ PWM初始化
$ H5 V' E5 T0 |0 J) }# s*// \  d7 E) W( l* K
void PWM_INIT()2 H6 l; m, u7 {4 f1 R9 I
{' ?5 n+ P$ G: ~/ r2 L$ ~4 u
        CCP3CON = 0X0C;
) V' W- ^/ O& g/ I        CCP4CON = 0X0C;
. n3 b# d: w" l' S: I3 K) ?% z9 n        
9 [9 ~+ w% w6 Z3 y% B9 Z        CCPTMRS0 &= 0X0F;9 S! b' ?' l3 O2 ^: n% e
        
0 O$ H6 J$ a/ h# a        TRISG = 0;, t8 Y* }$ c( ?4 i
}3 E: `" d1 ]$ E' \* b
' Z; B( L' {: S
/*( Z4 n$ I" F( @, g) s, }
*@Function 主任务函数. O" \3 W: d- G' m, f5 Q% M
*/) q" n* B6 A9 J/ j4 b
void Control_Task()
+ [5 N6 ]: M' u) M! V{2 V1 N0 u- n" ?
        static uint Time ;
* c4 U. A" |  E9 b. q, \//        static uchar State = 0;4 B- V# m) ^! B  ]! O8 G% C
        static uint Record_Time;/ t1 r) a! o& H/ h
        uint Delta_Time;. L9 e+ \9 \) G: }
        . F& A; Y. [' D
        if(State == 0)
/ R$ W( k5 c( {  e0 _% j% h        {
$ G' n0 Q$ l' Y# G5 P0 b6 }+ S0 y- _                Time = 1000;
3 y0 V8 X! L6 c: V                State = 1;! H& Q' M/ l2 ^+ C( o$ v% ^/ o

, {* f8 K, r+ Q: s! S        }! A1 Y2 a" L* ?9 P% b) S; v
        if(State == 1), `* K2 l! x+ F$ k  g) |
        {
. t  ~  u  i4 R, C9 t& u5 W$ t                PWM1(Time);
) k* z; O" W! `* F3 T                PWM2(Time);! z1 b5 m' \4 i0 R& d! Q7 N
               
, G( r- U, |# S- u                Record_Time = cnt_1ms;: a! F9 I" A2 J" ^/ g: ?! L
                ( n  v7 G5 ?1 R9 n# J6 H
                State = 2;" B8 q3 _# \$ {2 b/ [+ O9 F
        }! j5 q/ E8 g( _3 V2 g# ?
        ' W: I9 U8 {4 ?
        if(State == 2)
1 ]( S, s) s& C& _( \        {
% @8 @! D1 h2 b                if (cnt_1ms < Record_Time)
4 b; O# S) o8 g: \" U% S                {6 O9 }+ Z5 c: {6 }, a" ?
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        9 `. T5 s- F! b& u6 u* X
                }
) U6 D; y% }! _. V; t0 B                else
" W) D; g$ D8 K9 i! ~                {* v" r: _% H2 y
                        Delta_Time = cnt_1ms - Record_Time;               
8 u6 ^7 A7 h7 b/ \3 \/ t8 f' c                }
" C7 h/ t1 D; E# A' i0 ?. y* I
/ k$ O* c2 l" ]2 v; N, w+ k  S* ^                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT9 O6 H3 m# s/ }0 o$ k( a- J
                {
; Q/ A( L6 y1 H# p                        Time = Time - 100;
" F) Z$ D0 v/ v% X                        State = 1;! G" H' Z+ |* b
                        ! B9 H/ G- ~& n7 p+ t" n# Z
                        if(Time == 0)
# X5 x0 W) m6 T                        {
, a1 `/ I( B/ H4 @                                Time = 0;4 `: A/ m1 X4 ^5 y
                                State = 3;. j) U! H2 G4 t3 v+ U; C8 T, d
                        }
5 X) z# B! P, M7 A, r: l" \                }
  X, w8 E7 d5 ]4 a3 u# Z; J1 |9 T        }
- X5 h5 o: C( X$ m        
8 Z1 s! w# p2 Y! h        if(State == 3)
& t3 W4 y/ o4 F7 N' A6 d; A        {
# i' ]; {  q3 \, B                PWM1(Time);
5 O3 g' C  S- l                PWM2(Time);
* \- z5 i+ s- q7 [0 N* i5 M                * Y' o& H' Q6 I  Q" U8 q, S
                Record_Time = cnt_1ms;
8 K- T" t9 m' O( S, U# ^+ f" t                4 [1 C6 [6 f& @# H: J8 e4 n
                State = 4;
0 v8 T4 B/ G5 J4 R& K2 V        }
/ v& Z$ W+ X& x& ?        " L1 G9 `' u% M8 F& ~
        if(State == 4)  G: U: c$ q. I+ T" p: B* {$ E
        {! |3 F- L9 b" J2 \3 M2 E0 V
                if (cnt_1ms < Record_Time): p$ n  |2 I; I$ r, W
                {
2 E5 B6 {# U3 Q9 I6 k$ @                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
; q! Y& u+ j: z+ n* g                }0 s. P# _) k1 q7 c
                else
, u0 |+ I: P3 V; r9 i6 J                {
8 z+ G3 H' D3 y, m# y4 |! x( u( T                        Delta_Time = cnt_1ms - Record_Time;                % N, j& y' v  j. c9 Z) e
                }
) x: a$ x1 {; S
9 f+ C/ g2 ?% x) S. I. C$ P4 w' }) y                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT1 P0 ]; u5 ?; D  ~5 X, t4 E3 F
                {
# x; G$ p" T( C3 }, j; g; D                        Time = Time + 100;
1 d0 m1 _. K0 o                        State = 3;3 |" q9 z; f2 p3 ?  y( ~2 M8 p
                        
/ S6 k& l4 c: [2 O; ]                        if(Time == 1000)
. N; A2 T( L0 ?- r& r* [4 j/ T) Y                        {2 t# ^* [# \9 x8 S, t
                                State = 0;
3 n! `, o; d8 F                        }
# {9 l( W# ^# V' S. I: t3 t                }
' h: S+ o+ u5 x- Q, w& G% {        }
$ s+ @, v! I0 o) D9 e) y}; E, q0 s9 f% _/ S& E2 v& D
# n1 i2 ^6 |7 q$ L1 d6 L# Q
void interrupt ISR(void)
* E7 ]9 |% F7 ]4 k$ ^{
3 G/ G4 E1 \' d8 w, K1 l        if(TMR4IF == 1)
1 [, |( e: \+ x        {4 F2 X7 ?- ^8 p/ o
                TMR4IF = 0;
4 w, w+ r4 D5 n                cnt_1ms++;% V' C  V+ w/ i1 J+ y0 |
               
( K- f: c+ C& ^5 v        //        LATF0 = !LATF0;! A0 g* q: o1 S4 X2 M  o% q
        }        
: _1 \) ~* ?, ^; z% a/ d; f/ D}
7 a' g( ?4 C  e, P' C

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哈哈: ?: G2 O5 `- C2 ]4 j; s) j

160

主题

620

帖子

1233

积分

四级会员(40)

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

积分
1233
3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!
! u7 i' [0 ^3 B" V, x$ Y+ `" `

157

主题

597

帖子

1239

积分

四级会员(40)

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

积分
1239
4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!& v# Q. `$ K) T* B/ ?/ A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:12 , Processed in 0.057418 second(s), 34 queries , Gzip On.

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

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

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