找回密码
 注册
查看: 508|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家。+ a" x2 w& P7 r$ V& z  [" b

3 V' e5 U' j+ D8 ?1 ~4 m/*  Z% G1 `0 s4 P/ W! Y2 k- \
*@Name:        PWM_led
0 ]2 j1 R( B# p" P/ `*@version  1.0
: \# X9 a( X- G8 `% @*@Author        xiaopan5 \" J& `2 Z8 P$ F! }/ M- b+ f& U
*@Date                2014.8.2
& t' R: y, A% C2 a*/) g0 u4 L9 U2 ~$ T1 K* }# x* P
  N- k8 R7 d, ~- d  C5 d
#include<pic.h>
- E6 h( q+ v6 G8 U. N+ B4 E* O+ s#define uint unsigned int
- I$ v2 }: {! x! Y& n' K! u$ f#define uchar unsigned char) M. L6 E& d/ m( R% S/ ?% s

( s5 v8 w+ t# u* F& c1 v) v: G#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
7 a. C/ Z7 t$ P/ G3 Q# t#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        3 E+ q8 @! s; f+ C3 Z- V5 M
. R5 a0 k% n( ]
uint Time = 0;
* ?/ t* N, N1 t0 j+ \uint cnt_1ms = 0;; L4 G6 r1 q( v' }* H, W1 i
uchar State = 0;7 o9 W3 {; W/ j% u3 u' i

) H: g: F! s. |, J* e: G1 n+ A( Hvoid GPIO_INIT();
$ m/ L- x6 k; g9 O7 Wvoid TIMER2_INIT();
3 z% u  Z0 c3 e% B2 v9 T2 y2 Hvoid TIMER4_INIT();
+ D- e. T6 w; b$ c7 o- Y4 T( ivoid PWM_INIT();8 O& `, E! i% J, r( Z& d
void Control_Task();2 Q2 ~3 I# C1 R4 L& S1 r5 y% N
3 Q1 p5 u- o: h
/*
3 T7 V" _* Z- P3 t+ X*@function 主函数/ ?+ g2 d2 I) V; @( w
*/: R' N2 H7 D: Z: ^/ O
void main()
. G- i1 z2 Q( H. B) K+ t$ j) A4 h{
0 q. ?- n$ K7 ]& @4 O( x' U        GPIO_INIT();
+ i5 c7 M8 b3 w0 D        PWM_INIT();
/ P# j+ F8 G6 _( G! H* I        TIMER2_INIT();                                //PWM利用TIMER2: }; U4 R" b" \/ H% q
        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
. X! ~$ S( [" I        while(1)' _5 m. e) G# L7 t
        {
: b  q' h6 k( y                Control_Task();
6 k9 b4 L1 r9 A0 \: ], s& S' k        }' o1 j! Z1 n  X
}* o5 f, c  i/ O* B
/*+ O8 G/ r8 }: x) ^  K) B! K. }
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
: v% |! X- Z3 d; y*/
- e& B& O! H+ J0 jvoid GPIO_INIT()1 W! f1 ]1 a( Q
{5 _  z* y# |" k$ n. r1 e
        TRISG = 0X00;        //设置RG口为输出( B: p5 p" [' J3 j! v
        ANSELG = 0;                //设置RG口为数字量* D  k" e& ?* V7 @$ G
        LATG = 0;                //设置RG口为低电平
5 R% W0 k4 x% d8 C        1 W. V# l2 O, i- B6 u4 ?
        TRISF = 0;$ A2 J  ?- v" k1 |; Z
        ANSELF = 0;
' a9 V1 x* K9 i' V6 M        LATF = 0;
& V4 v4 A( w% Q/ l0 T$ a}5 j6 z: r& `! v& f0 w8 ?

7 _7 z, W, D9 G0 \! B/*
# D4 R0 o+ U, {. O4 l3 `, t3 V1 |! p*@定时器2初始化
2 ^! j/ M- d2 s, B*/8 M, W8 r: A& l! I- B4 {
void TIMER2_INIT()
) W$ Z+ ~( I9 q& e# C{
4 R' H  Z7 d* B; A        TMR2 = 0;  C# d. T6 \7 M6 n5 ~9 L$ F9 O4 h
        PR2 = 255;                //255) x1 h, t! i4 a( p/ B6 o
        
8 E/ T8 G* F  V2 R0 B' j        TMR2IF = 0;
7 d/ w6 U4 i# d# s% y# g        
9 Z, [: p- a% w( ^% _        T2CKPS0 = 1;        //13 l1 o3 @' x9 G! ?( \8 o
        T2CKPS1 = 0;        //0
, P# h$ I5 L/ o) V, C7 `- v  Z6 X        
6 I; d  h2 X: q. \" g6 y, O        TMR2ON = 1;        ; p& M7 ~. A4 ^
}! E0 r9 E6 W9 P. l4 _4 J! X$ o
6 `& O$ F: Y! R0 P, N( p, S# [
/*3 B+ C" Y; W" n8 L& W
*@定时器4初始化
1 M# t, {- E$ a8 S0 z1 S4 J*/
0 @# k$ @* C- b0 d& v  s: P4 A# Qvoid TIMER4_INIT()
% x4 ^+ w& G0 N4 O6 U0 o; }{+ w# S  C4 x0 |4 z# s* Z9 r
        T4CON = 0x0e;                         //0000 1110, k6 }- F) H, q  M8 T, p

* s2 y4 n$ |4 R( t4 d        TMR4IE = 1;2 `) H7 \9 c: F% D1 {6 o, P& V% j
        TMR4IF = 0;                              # O  M- a) }9 z9 \# `

8 I5 i! k$ Z8 o' X7 v# \6 H        TMR4 = 0X00;
* c; {( N2 h2 q- A/ \: t        $ ~# \! Z; f2 k. V8 D0 ]
        PEIE = 1;% w7 k' G7 d) I
        GIE = 1;
) {/ c% n: ?; O  D$ E; }}
# d# r8 M" ]: S# V3 [$ e# ]+ l$ W; \8 A! K
* s9 g5 J, A- g3 [: a* R
/*
( P% \# g* q: V$ m% D( b*@ PWM初始化( o6 V0 A+ l. a- ]" W: Q
*/2 f3 m' ?8 E* n0 v3 B
void PWM_INIT()
3 R5 _6 m0 ]9 l( E{7 I( \/ k3 q5 L) D
        CCP3CON = 0X0C;
# g4 Z+ G" B5 {; D        CCP4CON = 0X0C;
  ~% d4 B, B) J; a& c# r        1 }1 `$ Y% @# v
        CCPTMRS0 &= 0X0F;
6 i  m2 e$ o2 m# o' m        
2 a' D2 E3 m& I3 x! b1 A1 m        TRISG = 0;
; j; o4 ]4 C1 K$ \}
# v4 _; J, l: m
" q9 ?0 ~. @/ p" \/*
$ x- s& ?3 l8 k' t7 h' g$ a*@Function 主任务函数3 f& z! S4 g+ o- n; G1 t2 `. ?6 d. [
*/6 _6 l# P* o! r, i. P
void Control_Task()
7 C  X+ d7 z2 ?% `; t; a; I{
! h0 y+ K6 a9 |7 p        static uint Time ;
5 P9 D2 l7 `  g: E1 `$ j//        static uchar State = 0;1 d9 O- G7 a) \+ S% L1 y
        static uint Record_Time;
0 O$ N1 w& |0 v7 v" Z6 k% {% R        uint Delta_Time;
, |" v& b# |+ R: m/ r        6 t* F; R' s7 l, m' i( t
        if(State == 0)
* R5 Y7 R' n2 ?. J3 t6 X, l        {
0 E7 u- J. l8 S+ e                Time = 1000;
/ r3 X9 N" _! n                State = 1;6 z. K& |- B6 t5 V

% F" U/ J: m. N        }
8 T* {+ J: q$ O8 H: A        if(State == 1)  c* l! k0 I% m7 O8 ]9 V
        {! b$ B# J6 Q( _( f% T  M
                PWM1(Time);
) P3 i$ y- M0 R( G; u                PWM2(Time);6 ]+ d& {! l) ]: |0 X- q9 y* Z
                ) I, ^! O5 |, h& w) U% J. b) c
                Record_Time = cnt_1ms;# [! E: ~. i3 {  }
               
  _; z6 l1 `$ `- R$ ~. c4 b; {& k                State = 2;
; M5 E) C2 v& P/ ^4 ]4 ^        }
1 D4 p& s1 h. {! i1 j3 H$ n: r        
/ U% R/ U) f  P" Q4 G7 y        if(State == 2)0 o# s3 G$ G% k; W9 q
        {
/ l  }* k) v' F& s( F7 L) T4 M                if (cnt_1ms < Record_Time)
9 y9 I8 A! k2 }( r                {
0 z! D% V( C& A                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
) A+ v* V# f) O" K7 h6 Z/ d                }, h6 ]# G* P6 s
                else
" r) @! Z9 h/ F- ^% y                {( [6 @5 }6 X1 R; p# I
                        Delta_Time = cnt_1ms - Record_Time;                5 U% h) `* c1 x+ g" }5 l. M4 y2 ~
                }
3 Q2 P9 x& K8 n8 X9 _2 g$ i5 o
" o: q$ {' K  X4 Y: n2 Y3 K                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
! J( b8 Z! z+ U4 t                {. ^, r. h3 v$ G  o
                        Time = Time - 100;# d! A/ T0 r" _5 c
                        State = 1;
5 p' M: ?1 e$ r! L! D# b+ V                        
; ~: X* G- O' l# G/ j8 F' F( F. A                        if(Time == 0)
: C# a! T* u5 ?- h1 y9 V: s6 L                        {3 |# y+ H& z: N& I
                                Time = 0;" C# ]5 m/ H' j+ h5 }# I
                                State = 3;7 Y6 j, Y$ n" l& O! _$ c- p/ r
                        }
3 {7 s7 ?3 l9 ]                }3 E2 g! K, K- v1 _
        }
( b7 M/ ^% i' v8 s* \        
) ?2 H: j8 P: K+ v1 Y( [        if(State == 3)7 j1 ~- y& K, P5 j) i
        {
8 Z  O) Y, m9 ^9 |                PWM1(Time);7 }: v& }" [4 I9 d. q3 c
                PWM2(Time);" Z* x$ C3 Y3 e1 q2 j! c0 n
               
; Q: {# [7 ~9 D7 h                Record_Time = cnt_1ms;# X" g+ m; I2 S  a7 q2 I3 }: |0 `; H
               
3 Q; ]0 m, O9 Z& y: a, h  A" A$ h                State = 4;
0 W. x" w9 s8 [3 y        }
7 x$ s3 C7 Q8 t( m2 Y: `7 U        
* M% }5 l6 \0 R  c/ P# e        if(State == 4)
) U/ f$ Y" W  v) T( u+ c% i: |        {* z+ l" a- @8 G: z3 e2 A
                if (cnt_1ms < Record_Time)
9 y! s; P2 a  O+ L' n                {
3 H) n+ ^0 U" b: d                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
% O5 M' Z! z" X3 i$ Q1 I                }5 j! d( g( B+ j) E
                else
& B3 X7 G6 Y! x/ t% k                {
2 n) Z: D! `( k6 j( c5 @                        Delta_Time = cnt_1ms - Record_Time;               
8 G0 Z6 l9 V& O) K. r( R" B; O& K                }
2 A1 F! i+ n8 y
& T# Y  ~. T+ U9 L: h                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
1 F9 V& p& W: c- ]$ h                {
; h( ]7 ]! e: e6 ^: M                        Time = Time + 100;
, V9 M, A+ T, b/ S; a0 q" i% @                        State = 3;
" _+ h3 w2 I: @: Y# [2 I                        ' a' h" V. x' ?9 @: b
                        if(Time == 1000)
: G6 J; d2 a% ]- Z                        {
5 m4 ~) p1 Y/ I& R. }- M                                State = 0;% T+ a4 J( A+ k. R: I% Q
                        }, ^. K9 P' }# n- B* s  T' W: W
                }
1 L6 @3 p4 `7 [; ~        }
1 m9 E* U: u! A4 h}
5 u; K5 b# @% q' D4 C9 j
7 p% H5 f) ~" Y6 Mvoid interrupt ISR(void)
5 F6 W( Z# t* W% k3 t* c4 z6 X  I{/ i3 E# {9 u% e; O8 J0 i
        if(TMR4IF == 1)& I. h2 j, r' d& A1 ~# j7 |
        {# Y: y* R' P# m& u& g* ^8 a
                TMR4IF = 0;
1 ~) H3 U+ K) S7 z8 h                cnt_1ms++;
$ {% D9 N& I  y( ?- E; [! x4 a               
0 s6 R2 V# O) G        //        LATF0 = !LATF0;
2 N5 P& t& k2 p' g% y        }        5 K8 G7 F# H5 ~
}
- [3 w! q) d& H& s; K1 u

PIC16F1947原理图.pdf

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

该用户从未签到

2#
发表于 2016-7-4 14:27 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈! B& y0 [& V% E) a' @+ |5 B2 R: J" m

该用户从未签到

3#
发表于 2016-7-4 14:30 | 只看该作者
楼主辛苦了!; d1 o5 Y) F2 B0 B. J

该用户从未签到

4#
发表于 2016-7-4 14:42 | 只看该作者
路过捧场,谢谢分享!( W% {7 c: g* @+ \* z1 K9 ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-3 02:09 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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