找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:
/ P( b* G- A8 m, b3 x( m' c0 E3 i! J7 Q4 A$ ^% C. F/ U0 ?
/*
- i- J0 s* @& E- o7 O$ E: m*@Name:        PWM_led0 c3 Y% F) U6 Q, p3 @1 n; ~
*@version  1.0
/ Q+ B) e/ _5 b# I0 Y*@Author        xiaopan- n' X  x4 ~: S
*@Date                2014.8.2
/ v. f( @; o/ T/ H7 W*/
. J; i# ]+ w2 r2 q" t
6 P2 M) W2 J, C- d' N#include<pic.h>
9 G8 U, u) _# p$ o- l1 H#define uint unsigned int
! O7 b/ c+ K( G. m#define uchar unsigned char
! p" I$ ?3 r: C  E, W' l0 ?2 ]2 L
! i! k# s0 c! a7 H" y. x6 s% ?( ?#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
$ s, ?8 Y2 G9 ?#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        8 g( B3 O/ w, O9 A% A
/ @* Y2 F" S1 \
uint Time = 0;/ k4 `, D& [" ?! s: S
uint cnt_1ms = 0;
6 Z2 V1 i: f! Cuchar State = 0;. G3 v7 A6 t+ G) [$ Q6 B" u
1 I/ D4 R# }1 o8 M& g' i+ W' g
void GPIO_INIT();
% R" l! H; D; W! v; a1 H& Cvoid TIMER2_INIT();
8 M* r* _; x, [! H" h0 c- O" a+ Bvoid TIMER4_INIT();
- B2 R, `- N, evoid PWM_INIT();+ Y- @5 ]- N/ A0 O' g& v4 f4 ?4 P2 z
void Control_Task();
3 \( h; S1 ~/ r0 E/ C. A
0 ]1 |/ B" k: ~# O  r& m/*
2 L& I, g6 z9 i*@function 主函数
( W! u6 h* z$ w*/
. J$ E8 p8 W. U3 N' t' P- Yvoid main()
! R- w; d% z* o' ], `{
6 A6 ?* Q5 n: j% j, n! |8 P7 C9 G( _        GPIO_INIT();$ H; Y. W( N3 l9 R
        PWM_INIT();
0 o: J. H; M* @, V4 V' S  R: Y        TIMER2_INIT();                                //PWM利用TIMER2
" K: B9 c/ k8 [( L# Y$ o' e0 z& M        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
! k6 M# J- r0 K, a" E2 o        while(1)* Q2 ^8 A: z0 i- N2 I
        {
1 Q% e. {2 i# F                Control_Task();" [& i! m. V$ q3 ^0 v- E% j  N
        }2 X4 ^/ h# F. |" i3 V6 U) f6 j$ @
}
& r7 y, ]0 x, Z: ^: E) P! u/*  r7 N, c, Q9 d$ x3 I0 b
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4
" A5 N% j# B4 Z/ e*/5 g) x% ~* k+ m  N+ \( ]* O
void GPIO_INIT()- E4 m" W. n: @" b' k
{
8 o; z/ z9 [. W$ `4 y- x        TRISG = 0X00;        //设置RG口为输出$ w/ i+ j- R) o- e0 I7 H. e: O: n9 p
        ANSELG = 0;                //设置RG口为数字量% M& {) p5 v3 H) H& o. Q$ ]' @
        LATG = 0;                //设置RG口为低电平: i7 I+ }. w& o! D! o
        8 w, [. l6 _) F2 P& |1 u2 A6 {
        TRISF = 0;. ?( F9 w" c. ~' D* k6 G
        ANSELF = 0;
  Y2 q8 `( g6 F  h; v( H- g        LATF = 0;4 w+ K2 r2 H$ [9 o/ u; A4 Q6 M
}
0 `' E* t. @# z
; H$ v; a' Y( Y1 h/*9 D# L. M4 m, H( f
*@定时器2初始化
# }* \3 N7 t! d) C*/
" Z6 G4 e! W( {0 K. `void TIMER2_INIT()4 L/ q7 {1 G$ ]# D
{5 z) u9 a2 w: K6 u+ E1 J9 j! Y
        TMR2 = 0;1 i6 `' A. k0 c4 f7 f/ \7 `; B& b
        PR2 = 255;                //255
4 n7 n! r9 G) ^          ]) A8 I$ z! _+ m
        TMR2IF = 0;& G8 b! X; h/ E6 `
        
& m6 @1 S5 U; W, o8 f        T2CKPS0 = 1;        //1
0 C4 q: Z- Z4 u        T2CKPS1 = 0;        //0# E5 D9 @5 |5 I1 m  s5 R  N4 f
        
& u& k& p' t* D; ?! h* ?        TMR2ON = 1;        
# v4 H- e5 H2 e. i- g* j}7 J: ?& ~0 M7 a6 a2 d- u, `
# w6 F/ g& s; e, J- }- C
/*
, h! Z0 `- v: M1 o" G*@定时器4初始化$ @  G9 h" L3 Y
*/
! ]$ v2 g& N8 M8 f& Kvoid TIMER4_INIT()3 w* h) `+ h5 x# Q6 E% i( Q
{
7 ^- r) Y" O* Q) x! j: C- K, Z        T4CON = 0x0e;                         //0000 1110
$ A9 k8 e2 [, F; u( U, q1 C' e3 x0 @8 U3 L) U! P8 p$ X* a) L
        TMR4IE = 1;2 }( @. ^( K4 l2 f
        TMR4IF = 0;                              & }! V8 ], V; N* d) y, i

' ?4 ^" G4 x, D2 {: n. |4 F        TMR4 = 0X00;6 `7 }2 A) n$ P; p# x. ~0 y: A
        
8 \1 ]: ~* Z* v5 v! @. h        PEIE = 1;8 u$ W' ]( D. Z" \0 E5 j
        GIE = 1;- u2 P( ?& e2 L& |4 F) z8 L
}
/ x6 _) E, y/ L. j/ j9 n( N) k
9 F5 R" @7 \5 l1 B6 R6 W7 [% b3 n1 Q. p/ R0 z
/*( T8 n. V$ n( l1 Q/ s) q
*@ PWM初始化# Z% d% @: _' R& L! r2 ^( p
*/
. b/ a/ J1 L9 n  |7 @5 Kvoid PWM_INIT()( {5 r) k/ d; e
{
) ^% z# @- l6 W) l# J! _$ _- a3 m        CCP3CON = 0X0C;
* ]- O: X9 A. w+ q( y- t. \        CCP4CON = 0X0C;- Y3 v' ~9 o& \" A/ |
        
: x( [5 P. a! D3 V* F' F2 E* L        CCPTMRS0 &= 0X0F;) m6 v$ i8 \' u, I; Y, i+ g
        
% z' E6 r# T8 K9 `        TRISG = 0;
6 t) k- N# }  N. R/ J}' y* n/ U1 \! l7 |9 g/ C5 j

7 v# |2 Y3 ?3 L- o/*9 I2 v7 k3 d2 I) _+ P
*@Function 主任务函数
% `% m( A& ?/ A6 \- S5 W3 ~8 O0 O*/
1 S/ Z& U9 v* ]& S6 I' l! h: p+ x# pvoid Control_Task()
/ x3 G' \; D& |: G$ ?. n5 C{3 v0 Q& c/ [% P( ]+ E& ?- G
        static uint Time ;
1 m; m0 d% L' r  x+ l0 f//        static uchar State = 0;
4 n& m- D5 R' A8 ]* b        static uint Record_Time;
% e* B$ x! {- S  q# O7 S- D* a        uint Delta_Time;1 k/ x. C. n" T6 }7 v
        ! B: h  p4 A$ l8 d' T
        if(State == 0)9 `) ~% s' G- Q9 t, v
        {
/ s3 ]1 o5 O/ \; D9 n                Time = 1000;
3 x* U! \, n( Y$ |- [% y- e                State = 1;
: Y: F2 T3 i3 g8 @2 u! r! S9 r. @, w! L, m( r
        }% O+ E) Q* e% M6 J* [
        if(State == 1)5 ^  `8 [. c' i; Y4 |1 A( c
        {, j: S! w% l# O# v  B
                PWM1(Time);
4 O9 i* U$ F7 f, v0 c                PWM2(Time);6 p* \; h3 a+ ^: d0 \9 ~
               
: k0 Q3 L2 r) Z                Record_Time = cnt_1ms;
- T- l& l+ V9 ~3 {3 e                % f! A; x% ^$ }! J
                State = 2;; `: {, S0 g1 s8 m4 g; Y
        }
7 [* o& J# U1 I6 ]        
1 l! E7 v% {- A% M$ ~& W        if(State == 2): t' Y. J* r3 j8 ], W; S5 I
        {$ y/ h- G. m% E
                if (cnt_1ms < Record_Time)0 v, R8 B; J7 W" a; e  a9 @3 V
                {
& o! F6 h" e. t0 N                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
' l0 W5 r) K1 P  c                }
' v4 L, y/ W2 G+ v1 M9 {: D* d                else( u2 E5 V$ z8 w6 j4 M
                {
/ f" o; ]* e2 E                        Delta_Time = cnt_1ms - Record_Time;               
2 c, u; M. l3 x- s0 [# @- I                }
7 K5 @3 F8 Y2 R9 o4 t
( r0 ?( E& x9 C4 }5 c2 k                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
. _8 Z* f/ ]8 G                {# U& q6 J, D* O# h" A. _& {/ Q
                        Time = Time - 100;
" z, E, z6 z& p# R1 [2 C1 D                        State = 1;% k6 Q% G6 |, }& x
                        
4 ~! o# _4 q2 n! T7 r* G                        if(Time == 0)3 k! D% B2 o* L' g8 N) m3 q
                        {
$ h5 ~: e; m7 Y* o$ I" s& J* R                                Time = 0;
( _6 j% l( K! ~% ~5 E9 A$ h6 v                                State = 3;5 l, x" X, W% v# J7 v* g
                        }# F) N; j0 @" l3 h$ r$ o
                }& d4 B5 q& `! v2 ]
        }
9 e' U8 i. P* J5 y        8 ^) u. Y  P% S- V% n
        if(State == 3)
1 U) l5 x$ y) D( u9 r! E        {. D6 y6 ~; ]0 i7 A+ Z5 c2 p
                PWM1(Time);( r1 s  n; `* C9 [& y
                PWM2(Time);
! o* g5 k& N$ R2 d# C               
2 f$ U  U+ P: U2 x                Record_Time = cnt_1ms;
+ K4 _2 Z# O! p2 C               
  K& M5 _8 L9 ^6 s. |                State = 4;
! J6 L! V* g5 n5 x# v3 U        }, U' x( ~! s7 R! T+ A
        
2 ^  B3 R& h: M% @+ p9 ]0 U        if(State == 4)
2 m0 K1 a7 w& C: T  S4 n        {
# E5 \) k$ k  O% O0 Y                if (cnt_1ms < Record_Time)
* N3 n. `8 j/ w  n, N                {( a& t9 E* \2 _) ^, H  K
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        5 M+ n* }- k7 ~' q
                }
" X! M* J0 {3 _  g* Q+ c, t& v                else
6 J+ G( \& V/ d& G, N                {
/ j$ f( N* h! F+ D, Z: M                        Delta_Time = cnt_1ms - Record_Time;                ) ?0 [- B+ x! h0 I, y
                }5 N- Z9 S6 i7 z& [1 f8 d+ |

: g. ^, X9 Q6 ^* s& u$ q: a                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT" f; Q! S2 F- r) F4 u! C
                {
6 S/ l8 d2 D* d1 Q4 d                        Time = Time + 100;
) k* G! b% E, E/ T                        State = 3;
' c' X: J8 N) }  j  D; K* {# \                        
4 X. w6 d! X9 z' n2 c8 X- o                        if(Time == 1000)( m. d1 ?0 ?- t7 s2 [8 C1 A
                        {
- y" k7 @# b# [, V) f- @9 `! d                                State = 0;
9 ]0 ^8 ?: i" ~, b/ I8 X( A                        }
) o7 x1 x  ?) `: B                }
, ]! A, P7 N* a/ l: }$ M% s) o        }
) O9 G" l5 k% Y9 Y# b}: ?! y9 Y; {( d: I4 ?$ n4 s

8 T, t4 y% k" Hvoid interrupt ISR(void)4 h- f: Y; L+ L; }
{9 k- @1 G+ M. x9 I: A) ^
        if(TMR4IF == 1)
4 V( r4 }! Z& I1 b; @        {
& Z6 Q+ u# ^* Q1 r3 a% p$ m+ T( B                TMR4IF = 0;+ a3 m) ^" l; a" @* j! K
                cnt_1ms++;
, g1 O" ]# y  j2 `$ n. L, C7 \) Q               
+ [9 s% u: G0 G7 s/ }2 q        //        LATF0 = !LATF0;4 O" w1 q7 g5 \2 j
        }        ; s2 D5 l3 P. u$ @' I$ j% l
}

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 13:55 , Processed in 0.059589 second(s), 35 queries , Gzip On.

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

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

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