EDA365电子工程师网

标题: PIC12F508单片机学习三个实例,请批评指正。 [打印本页]

作者: fish1352    时间: 2016-5-30 17:07
标题: PIC12F508单片机学习三个实例,请批评指正。
PIC12F508单片机学习之一——定时器
: |: T. q( F) u8 G$ j3 O
& C& o6 J0 P( G0 F$ _' J. bPIC12F508单片机是没有中断的,定时器只能是查询方式。
( E8 A  [* ^2 P8 B) }* S% Q7 ^) \( W# p
编译器用的XC8,编译环境IDE用的是MPLAB X IDE。3 @, L  _$ n1 }

# B, j4 ^3 V4 \- g8 u- h//***************************************************
% n- ?" K6 m( S2 m2 d! b1 [- w//             __________________
+ t; C, L1 y0 T0 U; m, g//             VDD-| 1            8 |-VSS
' {$ L" W7 }( ~$ J" M//             GP5-| 2           27 |-GP0/DAT7 y; w" U) x/ ?
//             GP4-| 3           26 |-GP1/CLK: F" R& K) s" O3 e6 `
//GP3/RMCLR--| 4           25 |-GP2
+ Q0 V, K! W5 c//             |________________|
1 b6 Z/ c: g' P* w1 k//               12F5086 t. m. w. B: ~4 d; A, T& u3 R- h
//***************************************************
) Y, K; e. b7 G# S1 A3 b* d) U5 l5 J- k- {# k" N
//定时器模式试用
, f9 p/ E4 Z  Z: X. P#include
. B9 d2 \: J& W3 @" A#include6 W& {! ~6 O2 R  b$ `  B2 a
/ `7 w# ^, C3 r4 J) n9 v
// #pragma config statements should precede project file includes.$ I4 u7 E# U7 ^# c
// Use project enums instead of #define for ON and OFF.9 z' J8 |1 D9 H) a+ N8 d
3 e( m$ t. e% Y% W! x
// CONFIG6 ?* W) l3 X- ^
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)( J8 o& I2 m+ l" ^# ]( @
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled)- g6 Q; s: I, `# E' {
#pragma config CP = OFF         // Code Protection bit (Code protection off)
7 B5 \. r. }) x9 c#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)
: y  X1 M; _0 Z6 @/ M5 Z5 d9 g
# W6 B4 ~5 F* m$ E, r  ~#define uchar unsigned char1 O1 h# }0 q* M" ^9 j9 J0 a
#define uint unsigned int
8 i9 N& R) i6 m' P6 O9 {' zuchar  count;- H/ E2 M- w- }+ Z6 ]& T4 ~
//uchar  GP3_F;
) q/ i9 \9 I4 W. r& mvoid Init()
! f) R% b6 X7 R9 b' F" P{
; \4 F! R% P  ?3 t& I4 W1 K* }3 \       TRIS=~0x3F;  //GP3输入,其它输出2 e/ X9 |2 \( V4 ]1 t. J: ~. ?1 g
     OPTION=0xC5;//分频器给定时器 64 4MHz        x=257-tJ/4F
1 t3 d0 x0 e4 G/ A     TMR0=0x63;   //10ms x=257-tJ/4F
! d8 g1 Q$ p) g}- Z* V$ k4 W$ }& y* ]' ?% e. ~
void  main()9 U5 H% b% i0 C7 a
{  
! j' j; u- V+ |, pInit();  
3 B2 v, n0 e1 t& D1 f! X" cwhile(1). I7 ~$ |# f: T5 j
      if(TMR0==0xFF); H7 I. q) M6 n
      {/ N2 f$ V  q6 S5 m
       TMR0=0x63;   //
/ ^) y5 r3 J! g; a7 M       if(++count==50)//1s
% f# A2 g# B; R0 o9 G4 g- }        {
7 W4 P: Q6 C1 {& ^; j# |( S         count=0;
5 |! o3 p! k+ a3 ?4 W: C5 w         GP2=~GP2;//LED闪烁5 N$ a7 ]& X4 V* e
        }
2 Q+ n) w4 _: U2 q/ U; W       }& t3 |& |0 X+ {% e5 V
    }2 }0 R! X$ B7 j. J. P" R' `
} 8 `3 n( g( B7 {$ j! ]

# T' l- }  N1 N* F
  |0 c- d5 f# k9 C; d& gPIC12F508单片机学习之二——看门狗和休眠模式试用' A/ h) J- U- J# M
! s3 T9 g9 u/ J$ k( E
PIC12F508单片机是没有中断的,复位情况只能是查询方式。7 R1 ~. T  n: o

% ]+ j  ^. C# d编译器用的XC8,编译环境IDE用的是MPLAB X IDE。6 l6 Z# L$ m: g0 s+ L
. k' G7 i# Q; f4 T5 |4 ?& w/ n
下载器是PICKIT3.
4 F0 i. ?3 I( s5 M+ b2 C* V: j
3 ^* j! a: L5 B" p& V* m//***************************************************
4 J" ~+ M6 z, {% V( n3 S//           __________________
  N2 \; }1 j+ a9 D1 E9 N3 Y- g//       VDD-| 1            8 |-VSS
* b2 G% |$ g2 W3 ^- [; A. N//       GP5-| 2           27 |-GP0/DAT, {% [# l/ |1 R/ g: m' k$ l9 B2 |
//       GP4-| 3           26 |-GP1/CLK
- |! i0 c8 C0 `2 \. b" {, J& c//GP3/RMCLR--| 4           25 |-GP2
2 @5 F3 d  _) L% F# p( i//           |________________|
9 L' d, \8 i1 ?9 \//               12F5081 m8 y4 Z* ?+ h/ y1 [# ~$ F
//***************************************************
$ z- s' j( ?( G0 M$ s// 看门狗和休眠模式试用
% p& X1 \: ?) I* k5 R
* O* ~1 N, ?2 y" F1 s4 W$ y$ O  O0 |
8 s0 m: p* G  q#include
) l5 b1 p  [# k$ x2 |2 J$ ~, J. m$ D#include( }- t) ^% b2 [0 m; y, H
2 Y3 w) {" `/ _- h$ J+ ^- A
// #pragma config statements should precede project file includes.
1 C9 `/ |, [2 [4 M1 j: x$ K// Use project enums instead of #define for ON and OFF.
) d) G- B* B. V2 P! b/ J. P, Q- {1 A8 Z
// CONFIG4 f0 i) q) m' Q5 X( K
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)$ N9 I, J. Q0 j" M1 F' ]3 s6 P
#pragma config WDT = ON        // Watchdog Timer Enable bit (WDT Enable )# B5 i/ P- ]" a' H# f) a; D
#pragma config CP = OFF         // Code Protection bit (Code protection off)
( l' `+ D4 g& S/ u( y6 g( m#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)
. {4 S1 e3 C, u! W, n1 P  w# W- H  i+ _& R
#define uchar unsigned char
2 d( T( G2 a2 J; d/ g. a1 ?/ P#define uint unsigned int
# f7 b% ?; b) H2 S' Q2 {2 B' Zuchar  count;
' f$ c0 C# s& [" Q- i) U7 }//uchar  GP3_F;9 b- U& q" ]0 I* H
void Init(). l; {- j  t; O4 s) d- ?0 A
{
# f( g& h0 _- S7 x/ r; Y3 `8 W- E    TRIS=~0x3F;  //GP3输入,其它输出
! i2 }0 M& ?, i- Z3 Z3 X" W    OPTION=0xCE; //定时器分配看门狗 时间是18Ms*64=1.152S
* p2 H. s; l3 r( G  \}
( d& T* C4 K& D# c2 s" Hvoid  main()9 _% X2 V0 K0 D4 R3 k/ Q) U& q, `
{  0 q: c" m" F: T9 q: D6 e
Init();
, p) q1 M; J7 I5 S. D
7 c* U. H3 D4 G# C$ n   5 |' G: k2 }" p6 k3 I2 g
while(1)3 W1 M7 d0 a) b7 b1 i* b
     {
: |: m# j6 W. ]8 W/ u4 W: y" C6 x
3 P5 }! R, q5 R. n2 Z2 F. N; y: j    if(nTO==0)      //看门狗引起的复位$ ^, d% ]5 L/ s$ `
   {
# ]1 w! D$ t) [: @- U' i( A      GP2=~GP2;( P! j- I2 P) j- H
   }   
) _8 e& c- v" s" t0 {         SLEEP();
5 Z" V6 |' a! a% D5 u5 H2 k2 }    }% T8 E$ W4 d& o8 p0 I# ]. v7 i! ^
}
( `' B/ T- c% T* |0 ?$ o- h3 y* V9 ^- l& ], g" j. A
9 H' m# t3 d- T
PIC12F508单片机学习之三——按键唤醒
0 v8 v; V3 g4 _  
; b; h6 G3 y- B. }PIC12F508单片机是没有中断的,按键中断只能是查询方式。
, }* Z8 o5 A1 C. U2 j  q; O1 N# ]: _% t; i) ?
编译器用的XC8,编译环境IDE用的是MPLAB X IDE。
% P  N8 b/ i- a% d3 |
) R4 p$ y- v; M6 A+ \下载器是PICKIT3.2 J0 c  B8 i& _+ w3 S
9 C& j1 N1 f6 M3 X: z
//***************************************************
1 f- H- o# w2 c* ~: p//           __________________
$ u( X2 }5 X( E+ [, |" d//       VDD-| 1            8 |-VSS" V1 i. L9 v/ J# P- W/ |4 O4 n
//       GP5-| 2           27 |-GP0/DAT
3 f! s5 ]/ a2 M% t0 g4 i: E( V1 F//       GP4-| 3           26 |-GP1/CLK
9 M9 c7 L) _. w: i8 g0 [% @: ?//GP3/RMCLR--| 4           25 |-GP2
6 D+ H- v) C& E& u" H9 k//           |________________|! s& \9 m( A! \6 P: j" _+ l4 V
//               12F508
$ W5 o9 y4 _. |+ V//***************************************************) [# U8 T9 U- }8 A5 o. _

: [& G: r& g) w7 `& r9 B& z//看门狗 休眠唤醒
% u' t% R; {9 M4 |5 f//按键唤醒: c# @, g; W0 [8 c

1 L$ W; S6 A1 V6 E- B#include: c' ?: t& c# I' u" V5 Z
#include/ D  _1 b- e! z* B2 }

9 ~6 M9 B& V* f// #pragma config statements should precede project file includes.
" p0 c/ G& y) |5 U' E* l2 G// Use project enums instead of #define for ON and OFF.
, G  ~) o" b" c" K2 `9 ~' X0 s; P+ B3 y/ ]
// CONFIG
7 z8 T+ z; S: e# L#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)! x9 Z8 o/ @+ V$ M9 P
#pragma config WDT = ON        // Watchdog Timer Enable bit (WDT Enable ): N! r: _8 @4 i. ?" m
#pragma config CP = OFF         // Code Protection bit (Code protection off)
( w! ~: ]; p* g# A#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)
8 t3 R! {. V  N# B* w
( O5 }+ Q' C  h#define uchar unsigned char
8 E2 R+ _3 C/ K#define uint unsigned int" W* s4 t* M7 T- }8 ^2 s' j
#define LED1 GP5
0 S5 n" h3 O( i#define LED2 GP44 B) r; v' [4 J
#define KEY  GP3
+ I! F5 Q/ n( L3 ]3 Kbit   KEY_F;
. N3 k$ |4 t1 x! q% ]uchar  count;2 R  T: s# i, t
//uchar  GP3_F;
0 ^3 M9 H7 f, A( ]# p5 K* {/ Wvoid Init()
8 ?' Q$ O3 ~/ R) y{- J$ |" ^* D- E3 u1 j
   TRIS=~0x3F;  //GP3输入,其它输出$ f: y: \: H, W2 }" }1 O7 X. K
   // OPTION=0x07; //这个寄存器上电复位均为13 D8 V2 p6 _5 h* k0 P
   //  OPTION=nGPWU|nGPPU|PSA|PS1|PS2; //引脚中断唤醒禁止 弱上拉禁止定时器分配看门狗时间是18Ms*64=1.152S6 B% z8 K, n$ w  P
    OPTION=0x1E; // 引脚中断唤醒使能 弱上拉使能  定时器分配看门狗时间是18Ms*64=1.152S4 C1 E; G5 I6 l4 z
  // TMR0=0x63;   //10ms& G3 e6 P+ P4 w! o
}1 ]* ^* y0 m& w% q
void  main()
$ X5 G3 u* k2 E0 Y; |{  
+ \) M, v: K( i  o  e& G' pInit();   + K# u% O8 T5 R+ b& i
while(1)
+ |; x0 a8 o. }+ ^# @0 h{
% d* r6 K# ]; a! u/ M! L' H    if((GPWUF==1)&&(KEY==0))   //引脚引起的中断唤醒
5 }# w: x+ o. \; N. `   {* Y* G/ I) e, @4 n9 h
     LED2=~LED2;
1 W' Z' b: w, ^9 Q! v   }
! A8 Y: r2 L- j  R- W$ X    if(nTO==0)      //看门狗引起的复位2 |& M6 R. z% o/ P4 X% V' X
   {" _' W) a! y* o! j$ \+ o# T1 K( W
      LED1=~LED1;' G' {2 r8 P3 n4 M; t
   }
5 k) V( T1 N# R) C         KEY_F=KEY;   //读出休眠前的按键状态。9 k' X. A" Y% R4 N5 v
         SLEEP();
. U- q( v8 }7 k. J: X, W, t    }
作者: duzy    时间: 2016-6-1 17:29
谢谢楼主分享!!
作者: 85486952    时间: 2016-12-12 14:18
楼主辛苦了!
& ?9 K) D2 r: P/ L  Z




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2