找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

159

主题

583

帖子

1229

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
小弟学习PIC16F1947,自己根据画了一个原理图(见附件),以后会把所有要做的程序都发上来,程序是用状态机写的,推荐给大家,程序 如下所示:$ o5 |9 Y" J; N" Z) q& n8 }" i
3 ^5 y4 g+ `% {
/*2 u/ `# R, S( v7 I5 ^2 {- o4 R3 F4 h  ?
*@Name:        PWM_led. T4 c0 z# E" R' X4 |
*@version  1.0" j' N- M9 @7 b! y( t) q
*@Author        xiaopan
5 v8 I0 f+ c/ F& @2 R, s*@Date                2014.8.2& R" `% E& F1 J! w# `! g- ^& b' ]
*/3 P$ m% Z' Y# O( H3 U) R
* B& K" `) K7 C# J# k5 [( }: o
#include<pic.h>, z% u3 q' Q7 |9 ~
#define uint unsigned int 1 q6 N: Z8 f7 q6 T
#define uchar unsigned char5 X7 L. P! d' b$ ~- x
$ Q1 \$ c" b( Q! d0 I( q+ c
#define PWM1(x)                        {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;}        //        X  X>>1        
7 R* u; ~5 D& H/ _#define PWM2(x)                        {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;}        //  X  X>>1        * e; l3 X( `) b" C( R+ l
# A- a# D$ }" e, s
uint Time = 0;5 p& d% ]* Y- L8 o- W6 S) p0 @
uint cnt_1ms = 0;
* @/ G# K) B) g6 ?+ iuchar State = 0;
0 ~2 E4 V- N4 N9 j, c
  B1 M9 [6 M0 @8 Uvoid GPIO_INIT();  \# Q4 `) ]/ D
void TIMER2_INIT();1 h8 \9 a- X" v8 G1 c
void TIMER4_INIT();, o0 ^% f  X( @& P$ s/ I7 _
void PWM_INIT();* w6 i, u" H7 I
void Control_Task();& h8 Z9 ^/ V2 r* u# }' j

0 @3 m! u" K% a/*- c- u' Y3 x% M; e7 C
*@function 主函数6 {* w" C, O9 s( i3 N
*/
! y/ A. W9 c. r' {. fvoid main()  v0 V; S' \- v' J9 G
{6 m" e5 D4 c. P3 a4 j
        GPIO_INIT();" @* K& V" Q! b6 @7 B" U" K
        PWM_INIT();
) s7 A, x0 |. J8 q3 G7 N6 C        TIMER2_INIT();                                //PWM利用TIMER2
" J9 P0 T; A; T( g3 L6 ~6 \+ G+ j        TIMER4_INIT();                                //定时1S出发改变一次占空比,调节PWM波形
4 A( A6 p7 S. v1 ~, C        while(1)
# m( X- x5 M$ f4 h1 X* |        {
/ u& b  f4 v% V( x* X5 H, D  l                Control_Task();5 x) M+ f# ?- F! b4 j! [
        }
: H6 f1 q  s/ v2 y}% d5 F0 t+ z+ T9 e8 a0 F7 u
/*& {1 C( ]9 i% u/ K9 G- A
*@Function                IO口初始化 RG0        CCP3        RG3        CCP4$ q* `" n0 U8 E7 u2 R( K- T0 `8 _
*/# |: P' p: O! _4 G: ?
void GPIO_INIT()( T! q4 s' X( V- f3 W
{
8 k0 p  g- ^* R4 n        TRISG = 0X00;        //设置RG口为输出8 m* ?1 o* {1 {0 s; A
        ANSELG = 0;                //设置RG口为数字量8 ^$ k8 i; z& y
        LATG = 0;                //设置RG口为低电平
# u  k1 C3 O2 B' k* w5 z& g7 G        
, a3 R/ I" Q: l7 S        TRISF = 0;
/ U# d$ I" a+ C& f        ANSELF = 0;
6 F2 C! I7 y  t- `5 O( _        LATF = 0;
, I+ C0 B% \5 v: V: K- J, u7 l}' a& y; q5 {7 K) p* T$ W; m

& e+ `& ]) j4 U3 X/ }' H/*
: B! g* i. W" `5 j  a1 q+ b*@定时器2初始化
* p  F  ~; X0 q9 q) R. o4 i*/  t$ ?! U' Q9 m' J8 o; g
void TIMER2_INIT()3 Y) u4 M* [+ |
{  Q3 Y; ^# l# X
        TMR2 = 0;
) ]- l  s& |! h        PR2 = 255;                //255
5 j$ O& y9 m6 z3 T! g) M$ _        
+ n  Z6 s! n" w        TMR2IF = 0;
8 j9 t, ~7 g5 Z- {, t1 ~        
1 W  t& o; b- r# ~0 n5 }+ d& `        T2CKPS0 = 1;        //1! ~1 H" K- F9 r+ Y' L" A8 ^# L
        T2CKPS1 = 0;        //0
! W8 b; i& D# |2 I+ L7 F) t        4 u8 V$ [: \  D3 H
        TMR2ON = 1;        " Q2 U! s) C5 x3 w9 B
}! ?  j7 I6 H  S* ?6 y) w& i

% z* i8 r/ h1 r' P9 a. w) }% }/*2 {' ]0 L" }. D; b) @/ O
*@定时器4初始化
" F* u; l) V5 }% U*/7 Z3 s! B  p) ]& S
void TIMER4_INIT()
5 I! _' \9 N  L, K$ n{+ i' i- K. ~* u/ f+ N8 L
        T4CON = 0x0e;                         //0000 11104 ?7 ~5 o# f* T" Q$ A" \- Q5 ~
! C: Q; m' ^4 [3 E5 _+ c% Q
        TMR4IE = 1;
( s" q$ W3 ?2 e- s! _  }        TMR4IF = 0;                              ' y: k7 N/ x# t
! I# C! S% i: g8 E* @  w
        TMR4 = 0X00;3 U5 y1 V9 B  W+ n. ?
          L- D  c5 X( r  n
        PEIE = 1;4 P8 A( ?9 l1 O# k3 `% b
        GIE = 1;! X" Z( ]5 l2 }8 g* U) Q. ^7 X8 ]
}' K6 k# L% f1 ?+ n7 H7 a* h9 }
* D7 P8 Q1 \7 w
" [7 C4 f# ]* W. e1 K% Q
/*
! [) B6 L  c2 ~, m; p# [*@ PWM初始化6 V4 n  o3 g' r8 z' M4 {: Y
*/
. C* M# A' q9 |. jvoid PWM_INIT()
: v; C1 ?6 k, n& S% B{3 ]. q9 m& P  o4 e( E2 t
        CCP3CON = 0X0C;
$ E# f6 P7 d3 |- S        CCP4CON = 0X0C;
* j5 R9 N. h: Z. f        
: d4 S' ?0 S$ F        CCPTMRS0 &= 0X0F;' d, u% E6 ?: X/ R
        ( C8 j( y$ z5 O# L) x0 ^
        TRISG = 0;0 n3 B( I2 H9 h, }6 _
}% u; [" }% [5 p2 a0 i2 E: x+ j

* Z* n0 T1 N3 Z9 ~( _/*$ Q) O$ M# L) o- g. ~9 l! C2 z
*@Function 主任务函数
7 A% F( y* P5 h# t5 v*/" o1 p0 a/ ?  d7 X
void Control_Task(), s: z' u3 Z5 B4 N) v4 ~, t8 R
{
. n7 p# w8 s1 w; z9 A        static uint Time ;8 W$ F0 {+ ?" L0 l+ I; c+ D
//        static uchar State = 0;
8 X2 l9 D0 J9 L5 X4 l/ D        static uint Record_Time;' v0 y' f8 H7 B" O
        uint Delta_Time;
$ a2 i" n8 @7 T6 L        
  J4 B% v' g! p2 P1 f0 `& |        if(State == 0)6 w7 m; ?  b5 W' |! k5 ]  S
        {# R3 [( J; a4 u  v; Z% z( I
                Time = 1000;
- T" H9 d; Y9 s& _                State = 1;8 \" Q$ Z) M! U
: V2 g9 d% c8 G7 ~
        }* {. m  ?" m6 V& c8 Y9 Q! a2 K2 g
        if(State == 1)
! \$ L, V1 R; k' W8 i* u        {
; j5 r& E2 }, X) m, t                PWM1(Time);; C8 E7 s- `9 p0 i0 b5 W
                PWM2(Time);( B( z! l1 G% X4 B$ {. c! x
                5 n0 R( w- o- {& ]
                Record_Time = cnt_1ms;, i1 i- L! r: b
                " O9 |3 F: `$ J; j
                State = 2;
8 P8 s/ P" r' H( ~! `: `        }% ^: Q4 m( e, R" q6 ^
        
" s8 d" k: z+ I: O        if(State == 2)+ ^7 [* ~3 v0 z4 @  ^5 b/ W
        {
! ?& g% m4 c4 U. @9 R' O8 k                if (cnt_1ms < Record_Time)# p5 E$ a) d7 j2 M
                {- ]0 H& J, y) L
                        Delta_Time = 65536 - Record_Time + cnt_1ms;        9 g) P; V# [0 o% g, T* ^
                }
% `* l5 S( z7 q* o                else0 L% {7 b1 l) c. a- h
                {
: S5 y, o: {% R: `$ D# W2 P4 R                        Delta_Time = cnt_1ms - Record_Time;               
. \5 N3 F* }, W1 R' n! Q; a                }! j! B% x1 K. t% P

/ v( y& J4 D9 t. ?; a2 S' K8 Z0 s6 Z                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT
7 y  P2 c' ^) {1 n2 z                {
( y) M: d% y: H" g+ K( R4 N1 x2 h                        Time = Time - 100;
' }) Z/ L4 m9 H& |# m$ _! c7 x                        State = 1;9 I$ B* ?5 b+ f4 V7 M
                        ! {4 ~9 P+ S! g2 g: n$ }9 a5 [
                        if(Time == 0)8 ^, x6 o) U; W$ O& @
                        {
2 [, i# H7 [3 }" u7 ]& C                                Time = 0;
! F1 Z$ `+ X! v' i7 J3 g/ A$ ^                                State = 3;) s: I  ]% _4 \8 L5 k( e% T
                        }- W% ~5 l, p" F7 D1 |, ~. }8 g6 w# g
                }
5 }# u* ]2 B/ u& A+ I1 b1 A/ I6 t4 T6 e        }2 Y2 r% T% i' s2 y0 J1 X
        2 Q$ a% f8 E( ^" F/ a% Q! B
        if(State == 3)
, b. o& D5 O( ?; p3 _. x4 R9 a        {
& o7 ]1 f! Q# u  B; `, V                PWM1(Time);5 F" O) g3 ]$ Z0 J' W1 J
                PWM2(Time);
/ m7 k/ V' u* N( E$ r                * \- h5 B" ^7 H5 J1 E- W! U
                Record_Time = cnt_1ms;
0 P2 |$ m% z! O) g* |% b" \               
! D! E+ @) j# D7 ^8 N- j                State = 4;
3 k1 F) w7 K/ H1 W+ w. f4 {        }" W' i/ L" Z1 x+ H
        ! G# r0 f$ i) a3 t9 |
        if(State == 4)
3 }) D% l2 S0 A        {
- u5 G7 i5 a( ~. m& i                if (cnt_1ms < Record_Time)0 s$ L* y- w, @
                {
, D9 s: v. P* {& a: T6 _                        Delta_Time = 65536 - Record_Time + cnt_1ms;        
9 i% I1 J# P+ c2 t                }
% ^1 h4 s! i( U: r+ {( N# C                else
9 ]/ y* L0 \0 y' H; x& \                {
  w# \& b! c; C) h) _                        Delta_Time = cnt_1ms - Record_Time;               
- n' j  y  o$ ^                }
0 p3 e7 ~; \  W2 v' c- p4 J/ e& ^! \$ W0 `
                if (Delta_Time >= 200)                        //300MS循环一次执行新的PWM_OUT/ y; H8 j5 p# s& F; h, A( d5 x8 f
                {
# a/ y6 A5 L' y$ Y" t" g                        Time = Time + 100;& R$ x+ O+ F1 e; y; t
                        State = 3;0 C( Z2 g, \+ a5 L' M
                        
/ P: y  [, d6 l: S3 R% H                        if(Time == 1000)
9 S2 V6 d8 y% i. v                        {
. [- V  N) W8 |8 @                                State = 0;8 }5 K- s$ s/ u$ C  n; T
                        }
- y8 t7 S% g4 m, {+ `; Q3 c, g1 Z                }- M7 e; M/ m# F/ D% j& J
        }; @. S* U, w. x3 [
}
2 x4 R! A6 D! Y1 n0 t( O5 d1 h# ?: C# i2 g2 p: A) D+ U
void interrupt ISR(void)5 U5 B9 {& e0 t
{
  \+ T2 V$ F3 Y1 \" {. k        if(TMR4IF == 1)
' `) D; l( N! s  n        {* s- @# e( U* D! G3 w5 \8 l6 |
                TMR4IF = 0;2 o+ u/ ]  z/ g
                cnt_1ms++;
/ n) e9 B8 V8 j; k, F. s/ ^# E                3 E4 Q  |" Y5 t3 `* n
        //        LATF0 = !LATF0;
" k1 {; s& d% J0 n+ ^: f6 t        }        : Y+ \2 j7 u; P% I
}

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 11:01 , Processed in 0.059963 second(s), 35 queries , Gzip On.

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

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

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