EDA365电子工程师网

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

作者: jerryli    时间: 2016-6-28 14:44
标题: PIC12F508单片机学习三个实例,请批评指正
PIC12F508单片机学习之一——定时器& X3 {4 b9 Z- m
0 V$ z1 P2 s3 h# D: A3 l* X& j
PIC12F508单片机是没有中断的,定时器只能是查询方式。
7 Y' E4 h: V% K' @6 y7 o$ L) E1 D$ h1 y) E. u$ W$ J1 U
编译器用的XC8,编译环境IDE用的是MPLAB X IDE。
  c$ F7 g/ k5 V
5 i6 n+ D$ ]  C9 {5 F  z//***************************************************8 ]* b) W9 S- Q6 {1 z# W- H' N
//             __________________( o' r) {1 M( l0 D3 o
//             VDD-| 1            8 |-VSS
2 }4 X$ r3 F' d5 ?//             GP5-| 2           27 |-GP0/DAT6 V5 S% m! `& {7 i; H# k
//             GP4-| 3           26 |-GP1/CLK
1 j; ?" Q, L) K  V8 F//GP3/RMCLR--| 4           25 |-GP2
7 T. D% X, y7 L9 H; b& b; @0 S. T5 \//             |________________|, p: n6 Y! p, B- l
//               12F508
* F) ~; K* R) ~. M0 |( k% W1 r//***************************************************- }5 X& J3 o7 _, `8 U
  Z4 q9 w' H, D8 E8 F1 B* g; X
//定时器模式试用
. m( _& S; u: e" [5 q#include$ _0 i! [$ e; V* G) V( t
#include
0 [& X  q6 n) G9 J7 }' \7 @7 a9 a8 v# e1 Z" n$ O( w7 ^
// #pragma config statements should precede project file includes.$ {3 b" b, A! S
// Use project enums instead of #define for ON and OFF.
% v; _. W5 D2 L; y9 B0 A" s# }
( u& F$ B; `1 M* @' E// CONFIG- `7 }' V8 p5 P- i
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)& z! Z0 V  d# Z2 W
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled)
  |  ^: r9 E) g, R; Y#pragma config CP = OFF         // Code Protection bit (Code protection off)% _% d& @" h! m" y+ A
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)) o! m6 k$ W8 w2 \; R8 j
2 f8 T% v! h/ X+ j* e; y/ R* n/ l
#define uchar unsigned char
7 M: x5 e0 r7 g) ]4 Q% P' U5 V* e  H#define uint unsigned int
4 ?! m0 q4 m' _' [. Euchar  count;
. f* q0 C% C+ M$ c6 u  R' ~//uchar  GP3_F;
6 W7 u+ ^  b3 dvoid Init(): z! l6 C+ [8 a2 F
{" ~8 P5 u2 c9 F6 }- e% O# ~) u* y
       TRIS=~0x3F;  //GP3输入,其它输出) r7 v- u5 o5 e% P$ {; L9 \2 Y
     OPTION=0xC5;//分频器给定时器 64 4MHz        x=257-tJ/4F* y1 i. `! @/ e' y4 l, Z5 Y: y/ I& Y
     TMR0=0x63;   //10ms x=257-tJ/4F  `0 X* T4 ~( W% ^% _9 z# b
}8 z5 N  ]2 O" w0 r3 P$ x1 D
void  main()2 q4 d7 l4 a3 G* {% l
{  $ H: b* k, @- ]- F# i
Init();  ' \% B; f" K  ~& o7 Q
while(1)3 g8 w% n! e3 S4 {, n0 ~& l# O4 n" P
      if(TMR0==0xFF)! X6 p) Q5 a5 T2 C4 y9 e
      {+ Z- u! ?4 F6 |( @# P9 s0 d, {. I
       TMR0=0x63;   //3 ?9 U, ]( l; o  c; U8 B
       if(++count==50)//1s! B: ~7 J. K  j  M
        {
; Y2 t9 y$ S7 L' K# F2 I5 n' S         count=0;
; `5 F( W, o3 u4 g( \         GP2=~GP2;//LED闪烁% H& }/ e( L+ }4 I, L4 f' Q
        }" u* A) G6 s7 w
       }* Q, f. p4 |$ A9 g1 k% j
    }
8 W, |" Z  x( k6 ?8 r}
% l1 U% ?" ^0 L3 D* w8 f, A
/ G* _$ U' I$ ~: L8 Y1 B
3 B4 S  E0 v9 E3 vPIC12F508单片机学习之二——看门狗和休眠模式试用
9 N' _, f2 R8 a/ q: C5 T0 q6 m8 N8 L- h$ n6 E# [# p
PIC12F508单片机是没有中断的,复位情况只能是查询方式。
* L: p# R3 M- A0 l' h0 P
* @2 u8 F5 a- K# c+ @' n; x- I编译器用的XC8,编译环境IDE用的是MPLAB X IDE。
' D- N! |: m3 m: ]$ R# S. X9 b. C4 Q6 b1 |6 o. R! v
下载器是PICKIT3.; I/ i4 j! _% b

# ]1 m7 L5 H9 l7 P) S+ j( T1 ~% d//***************************************************# ^- [8 ?( Z* v0 w. _
//           __________________7 `1 C7 _, Q* |. \) ?6 W" Z/ @
//       VDD-| 1            8 |-VSS
  A: K3 b1 ^. Z# C7 L5 z7 W# _' ]//       GP5-| 2           27 |-GP0/DAT4 F3 K9 d- l+ q9 ?
//       GP4-| 3           26 |-GP1/CLK* U5 U9 W" {( v6 ^  i9 C# d
//GP3/RMCLR--| 4           25 |-GP2, z$ U% y, e' l) K: b% Q6 U
//           |________________|) F5 v6 k5 o6 D8 N( k: V2 w4 |4 l
//               12F508
$ Y8 T' [1 o! H1 A  X//***************************************************
- n- U# |1 J2 p9 f// 看门狗和休眠模式试用
9 {2 ~, V/ B+ y" S: g7 Z* {3 {  C; U: ~0 g6 C7 @! S

# v# Y/ A4 ^8 I$ ^% f#include
! Q6 }3 P! v8 L4 x! p* r7 C  T8 ~#include
  H8 {$ R5 g$ Q8 @& E. w! I6 j/ @/ ]
// #pragma config statements should precede project file includes.
. n- N' Y& ?0 }// Use project enums instead of #define for ON and OFF.
- p. C+ N$ l" \# a7 v8 X4 p& z/ N- g( n( r
// CONFIG
4 Z( _+ B. \! o#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)
$ G" Y5 j6 s8 |2 u3 w: O#pragma config WDT = ON        // Watchdog Timer Enable bit (WDT Enable )
, j  p9 y* v0 a2 o. }+ `/ P#pragma config CP = OFF         // Code Protection bit (Code protection off)% Y9 m) [. {  r& s. b& M
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)/ T9 ~8 Q$ ^! E" V  v

- \  _" Z# o: W- z1 _; S#define uchar unsigned char: o$ l$ ^! E$ k( p8 j. i% p& v4 }
#define uint unsigned int
" |% F! R% u6 e+ Cuchar  count;
$ R( Y0 H+ s0 C8 n5 u! b$ C//uchar  GP3_F;8 P& e3 y- L" u; R
void Init()
9 t8 i+ v7 {6 u/ @& B& e+ r5 O{9 q+ z' T4 \2 }
    TRIS=~0x3F;  //GP3输入,其它输出! ~0 Y" z, }/ `' ^7 i; b
    OPTION=0xCE; //定时器分配看门狗 时间是18Ms*64=1.152S
, e0 B. e) ~* h  ~' E9 ^}* E% ~$ `- @1 Y
void  main()+ a" O' c! ?7 l0 Y+ m- e8 t
{  : D) K. T& U7 `5 E  E- {
Init();, o0 b6 B' l* l; d7 p3 o
; Z, R: y, e6 r# x1 T0 L
   % P: W% k5 B# x4 G7 |# t9 G, T
while(1)" w0 Q/ r! p9 C% o' P
     {
- e$ f0 y; l4 l3 J$ K8 X( ]/ r9 m& j1 b7 V" M: C9 |$ t! q
    if(nTO==0)      //看门狗引起的复位  T5 Y$ Q1 [3 H, o! z: L9 g2 x
   {
" h# p. H% `" v2 o, {      GP2=~GP2;/ c1 l$ e; U, n: a$ f( R
   }   
/ T( W- b! S' B0 y, Y! f9 L         SLEEP();2 J6 a$ T) S$ W0 o7 m7 Q# }
    }
* n4 D+ m  T8 j$ E}! i) q$ ]! N7 A
' z% x7 g8 E5 Z, O& I  C4 g
3 u0 ~, v3 e. E7 F8 o$ Z" L3 L
PIC12F508单片机学习之三——按键唤醒$ _; a8 Y. `; R: }) ~2 u& @9 \
  1 w( f1 G: G. R
PIC12F508单片机是没有中断的,按键中断只能是查询方式。
8 v$ h5 U- w  i& S2 d3 z3 v+ r
- a) i4 A7 w# u+ W$ ?/ I( `. s/ g1 R编译器用的XC8,编译环境IDE用的是MPLAB X IDE。
* @# U+ l- t* e3 b* C1 `: M, \% M7 _9 V, _( A- w1 D! V8 Y
下载器是PICKIT3.
6 w* B: i- i, y" @8 X& B
- {# m# b( E1 C" G- E8 W1 o7 H//***************************************************
" u8 {3 y5 f$ L# P- Q5 y1 x//           __________________$ w: q: M) ?' F( K
//       VDD-| 1            8 |-VSS0 a8 I' z$ W  a& m5 N( S) A
//       GP5-| 2           27 |-GP0/DAT8 v/ y5 |# Y% q/ |# K
//       GP4-| 3           26 |-GP1/CLK
1 b" e- C& c. b' c3 s4 `' P1 T5 ?; s//GP3/RMCLR--| 4           25 |-GP2( E( o* Y/ g; @, f0 ?
//           |________________|
) v/ G( N# r% I$ L# t; z//               12F508. o4 y8 @6 n7 Y- T
//***************************************************
9 z* I: j% m) N$ g
7 l, f, H& B" m$ Z& s/ f. @//看门狗 休眠唤醒+ u2 Z! _8 P3 Q) R& }2 r6 C
//按键唤醒
( n: e( K/ d' R, G) e8 k
' f- t' ?9 g& L. q, V#include
& D8 n+ Q) L( ~; o7 e#include
( r  S2 g6 H* d4 {( v
; }5 B$ ~, }: V, D// #pragma config statements should precede project file includes.% |0 E- {+ q2 P5 I
// Use project enums instead of #define for ON and OFF.  h8 b# D# ]6 a, X! s% ^
: k8 @/ }7 ~. h% p
// CONFIG7 k2 y1 A) r2 j, f- W
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)
+ m% v# t8 ]! D' i' O#pragma config WDT = ON        // Watchdog Timer Enable bit (WDT Enable )
, W/ `4 w: E: w3 S( ]#pragma config CP = OFF         // Code Protection bit (Code protection off)' Y! u- C0 h: z0 r, Z
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)
4 V1 {; I2 S" K" J9 U
0 ]) x; I2 [& Z) t5 }2 X" }#define uchar unsigned char# [+ `/ a7 Y3 e) a& ]( `
#define uint unsigned int
( h3 a2 w7 V% L1 ?: ^" e. p#define LED1 GP58 ]7 X5 C6 k/ E2 C. y' A
#define LED2 GP4% ~  E& C) ?) ^. |3 `
#define KEY  GP3/ B4 O! z+ S$ I6 `
bit   KEY_F;
+ o9 I; I4 w# p- [9 L/ y* ^2 Tuchar  count;3 H/ n! y& M& C2 y
//uchar  GP3_F;
7 D& w* }; y* t  }  h$ [# kvoid Init()" C( j9 T/ L& G( }4 D
{8 S# G( @! G, p- Q$ L6 u' `
   TRIS=~0x3F;  //GP3输入,其它输出
! A: l) x  y, F9 R5 r, |% S: `   // OPTION=0x07; //这个寄存器上电复位均为1# V. |  O) Z/ }0 W- j* h- R
   //  OPTION=nGPWU|nGPPU|PSA|PS1|PS2; //引脚中断唤醒禁止 弱上拉禁止定时器分配看门狗时间是18Ms*64=1.152S
- p6 h! ]! @  m' P    OPTION=0x1E; // 引脚中断唤醒使能 弱上拉使能  定时器分配看门狗时间是18Ms*64=1.152S
3 X- }' g2 }+ d8 N4 {  // TMR0=0x63;   //10ms
8 Q5 B1 E$ R8 L; h7 X}) T! |- z; ^) L* f2 F6 `" R6 A
void  main()7 |' u4 F9 `- Z6 Q  S
{  
9 I! m3 `8 _, o9 ]4 JInit();   4 R6 B7 u) h2 g8 z
while(1)" h% q& s1 ]& o1 B& J: t. X- ^
{
% J0 Z$ c- j" J! E% A0 A    if((GPWUF==1)&&(KEY==0))   //引脚引起的中断唤醒
0 o% W! _$ }3 t( ^8 G7 g   {
7 A% i$ t7 H" k4 g' ?5 D     LED2=~LED2;
$ h8 S( _- ?! h1 l+ X- Z$ u  P; B   }: h4 v  A5 W8 L9 y
    if(nTO==0)      //看门狗引起的复位
( q; G: d$ ?4 U' Y$ o1 d0 i1 v   {
. l! m6 |4 f  m  j) B4 U; J      LED1=~LED1;1 |! e: y/ N1 q6 V1 W
   }
* t+ X5 a6 H% q6 N& R6 ^         KEY_F=KEY;   //读出休眠前的按键状态。$ |) q) F) [' H& Z$ Q2 o# d7 s9 F* g
         SLEEP();- B3 q* w" V8 C5 p! m1 V
    }
作者: jerryli    时间: 2016-6-28 14:45
资源多,学习不止步# Z( v, ?  e' r, t& Q

作者: Hh0203    时间: 2016-6-29 10:47
路过捧场,谢谢分享!" V& E6 q8 f) h) Q1 \

作者: yhg-lee    时间: 2016-6-30 10:25
赞一个~




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