找回密码
 注册
关于网站域名变更的通知
查看: 447|回复: 3
打印 上一主题 下一主题

PIC16F676使用74HC5951驱动8位数码管时钟

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
6 V; S! M- ^) N/ L' Y
//基于pic16f676宝贵的IO,本程序使用2片74HC595
# `2 G5 m( a) [" }2 o% `+ r//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
9 U9 J5 [4 O  R% V! r1 v//小弟初学,水平有限,大家多多指点,不吝赐教。, p* b& z& {1 |; g" E, ]6 _- {
//QQ交流:2713446914 \2 z: U1 O& [2 n9 N" }1 q8 v
#include<pic.h>//PIC16F676-SOP14
; n6 T; S' n& y: r' m; B#define uint unsigned int' Q2 w- v- U2 ]: @
#define uchar unsigned char
( s$ ]: C  q. k! s% f; Z* ^#define SH_CP RC0//595端口
" P7 ~4 {; i. L# v$ |#define DS RC18 `$ r2 k( \. j6 z4 j  o5 n
#define ST_CP RC2* i; |# I+ o* n- U3 A
#define key0 RC3//按键端口9 _( E4 L5 a6 K9 _2 B2 F2 T" d
#define key1 RC4( Y9 g5 w: X. v' y0 a5 d+ h' W# B
#define key2 RC5& b3 b7 |8 v5 \8 @8 D
#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
" Q1 J! y! ~$ Lconst uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码
. d" ?0 i# q/ l* ?% \( X" R6 ~uchar sec=0;+ p, U8 J% X( c6 {7 H& F4 [' ^/ g) F
uchar min=0,hour=0;
0 [& m, W0 a7 G8 R/ Guchar count=0; 3 v& K/ Y. X$ I/ }
__CONFIG(0X0002);//外接16MHZ晶振
  i* C! q6 c1 K2 ?- g. C2 Nvoid delayms(uint z)   //1ms延时函数2 F; u3 e- f; k# m. i' O8 c9 H) Q+ F
  {
! i/ }* Z8 X2 a, I/ e! x  uint x,y;
! U# ?2 G5 \: U# J  for(x=z;x>0;x--)  j7 W3 F; j0 Y4 U' E/ G/ W2 C
   for(y=100;y>0;y--);  E9 f8 I& ~- g% Z& e1 S
}1 \5 m, B+ T( R3 f7 W* X5 a7 a
void delayus(uint z)
9 \. ^2 |1 h* W4 q% {{! x. j) B6 g7 t8 u9 C- v$ f7 ]' p
  uint x,y;
. n/ Q) A+ F' ?  for(x=z;x>0;x--)
3 P9 o; |+ e  g    for(y=10;y>0;y--);# Q9 b: M# \2 C, [7 r9 n9 N/ O
}
4 X9 f2 Y- ]# B. Evoid serial_input_595(uint dat)
5 y7 R1 M9 _+ N6 S9 d{8 d0 `1 y+ ]$ S
  for(uchar i=0;i<8;i++)
! c4 Y3 l, J7 f    {6 S2 k$ J# d- G# }8 ?" D
      if(dat&0x80) DS=1;else DS=0;
* z! k+ @/ H& ^, j: P      dat<<=1;
( B8 U1 c+ I  C4 _      SH_CP=0;delayus(3);. E+ R' x+ H: u
      SH_CP=1;delayus(3);7 l/ c( t  X# y
      SH_CP=0;delayus(3);4 A0 M+ P( s# A2 a
    }5 _8 L: B1 b9 n3 N7 F, W" Y* \
}
% m! J& v" f) r- ~void parallel_output_595()
3 v3 |. H( x. B* L' R! d{
3 p9 {4 t) q" l8 r; d7 I; V  ST_CP=0;delayus(2);5 U6 y- `8 m5 P# a! K
  ST_CP=1;delayus(2);0 u7 o: b  Y4 t( E1 u/ M: R
  ST_CP=0;delayus(2);2 \5 J) S# c) E8 [8 ~  [
} " @( a; V! p2 c( A
void distime()//显示时间
( T' D2 l  q1 {7 Q- M: Q- H{
8 |! q- n. h. k0 V% G      serial_input_595(0x01);
8 l# B8 B" U5 l5 Z7 J      serial_input_595(table[hour/10]);
1 v; D+ y3 l- p# H; z& p9 w( ?2 ]      parallel_output_595();
3 J, X# i' T& q+ C# K      delayms(1);. a; H- R( U: ]2 w
      serial_input_595(0x02);
) P2 B% x! _/ j4 d" ~+ }      serial_input_595(table[hour%10]);
( o) H! a6 T: p      parallel_output_595();" t- @1 c) ]! t& U1 ^6 E7 d# U
      delayms(1);
* @; P6 V- U2 x0 ~5 E      serial_input_595(0x04);4 R3 x, S9 `3 v1 E' C
      serial_input_595(table[10]);4 r5 |& L7 L& I5 r' b6 m6 Q! H
      parallel_output_595();
1 X( r4 z0 [1 \9 n      delayms(1);0 E% C; j9 v# D' z3 v' j! a
      serial_input_595(0x08);8 v4 W+ R) z, n' n) F
      serial_input_595(table[min/10]);# F3 r' X- Z  k
      parallel_output_595();
" Q2 Q" E; t* Z+ _0 I, O- Y, e      delayms(1);4 C1 G" z' I( Y
      serial_input_595(0x10);/ v2 q8 R( T9 K: l( @1 Y
      serial_input_595(table[min%10]);
8 a- c4 D9 b/ d3 U  f$ q      parallel_output_595();  
# q! H$ e$ L3 g4 E. `  k' `- L5 o      delayms(1); 6 K* W1 t! D% j% r; m* Z  D4 X
      serial_input_595(0x20);8 U! }, H  V/ B1 Q6 U. f
      serial_input_595(table[10]);# {/ k. q+ f' z2 g  `7 i
      parallel_output_595();6 M8 V) @1 ^5 v) L
      delayms(1);  9 u, o& ~3 R/ [
      serial_input_595(0x40);$ M5 O" D9 z* [( |+ ]
      serial_input_595(table[sec/10]);
7 K5 L2 n& X1 {, c      parallel_output_595();0 [8 y* L% H- `% [& h" t, l* t
      delayms(1);% U  r' B" d4 z# n/ `: ]
      serial_input_595(0x80);. s: P/ A9 q/ M4 B; K7 C
      serial_input_595(table[sec%10]);1 d( Y  {, @" S0 S6 w
      parallel_output_595();* k6 ^$ y4 Z. C) Y- p: v7 F
      delayms(1);
2 d; D1 w, |( J7 K( h. [, Y}
, l# |3 H2 [/ [/ ~& z( [void keyscan()//简单按键处理,实现调时。( w6 A+ p. s) g* G* q: N
{
+ `$ H2 ~4 [1 x% |  if(key0==0)
# r, Q% \0 K4 G  }2 h+ V     {
) f( _# ?, i* y7 n+ Z& B       delayms(10);6 \* @# c6 D- c. v" `7 j4 m
         if(key0==0)" ~7 `, f& t, q. t: M8 r
            {1 F! r; ]$ P/ O$ s. V' U
              sec++;
3 q) l# d+ V1 v# R% v( q              if(sec==60)
4 `0 l0 H7 E+ o/ V. B                 sec=0;5 h, U- a" {& y: r
              distime();
2 q2 g, h2 a- ~0 G9 ~( `2 K3 O2 B7 |) Y( ~2 V
            }
! u  Z8 Q5 ^0 r* I- O, \3 [       while(key0==0);  [# G. r. f# j& W- ?" c/ P
     }
* ^6 u" j) X1 i* w( b* \, J+ R   
  w. w% C. L3 s3 K% C+ r( c$ l  if(key1==0)/ O( u; E" i2 x! I$ y) o* P
     {  [+ N: Z4 U* |: n$ a6 L8 T
       delayms(10);
* C: ^+ a7 P5 b7 k. U        if(key1==0)
$ I: n! Y  @0 W+ Y# v            {
3 o0 Z  |  C0 g- p) A6 h4 v              min++;
- T- D; b5 P9 x5 `; M. [# S. r              if(min==60)
0 a8 _7 ^1 D; m                 min=0;1 E' w1 b# V0 S$ U0 [# g6 g: K
              distime();  D' {; F( W2 v0 ^/ I0 v* Q: m7 |2 a
            }- P" f6 a- K" u. _# \
        while(key1==0);
  {$ V8 R! X9 B; M% S     }
9 F! {7 g4 }1 |; \   if(key2==0)
( z8 e$ m8 z- q/ A9 Z, Q( J       {
: b6 {8 q* i( m% ~4 R' L% C          delayms(10);
& E: z# J8 U6 b- e           if(key2==0)
  t8 R( ~- s! ~" f* C7 D7 r, K              {- h& H  \& l& X* a1 i
                hour++;8 e# G! {; s! `, r
                if(hour==24)8 d! c& K8 i/ v4 p) K
                    hour=0;8 V" G1 j% Q& y  B) }# X6 l) x. ?2 J
                distime();6 c- G" M8 e. [6 }/ k/ S  D! n
              }
& y8 s7 `% ^0 p& w          while(key2==0);3 `3 m- m8 N5 ~! ^' P
       }7 g$ l- v1 v8 C$ J, x, G7 C
}
  e6 }& U) W# H, Q- ^" evoid main()
; R) Y8 }9 _  }! ]- M" e{
- o3 C; @4 V( A4 c) ]% ^* @0 W  TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写7 J$ c) h* A3 s  X3 S4 o" ?
  TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读5 o; H) {6 h- c9 r! n) l
  PORTC=0XFF;
8 s' X0 \4 V& {) V% v2 Y/ E. D  ANSEL=0X00;3 T, ?5 K& X9 ]- u6 Z
  T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms) \" E- ^. y0 i* T* O
  TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间
) q( r% P* `6 `( C  TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;4 l' `! J+ }0 H) V! O
  //TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样$ f" G9 G4 v3 ?4 M
  // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。3 h! n3 S! g% q' i% k9 {
  TMR1CS=0;3 u. \+ a. A! @, y7 p3 G( b; w9 F" K/ y6 t
  TMR1IF=0;
: m" V; E+ K; S! o  TMR1IE=1;
; R# I, j$ ]8 e8 t* @4 f: `  TMR1ON=1;! d: |7 s/ F5 a6 W7 @1 O$ B3 a
  GIE=1; $ ?* n: y$ K* Z/ ~4 o$ N
  PEIE=1;! A) K/ G' t$ w7 f4 p
  while(1)6 a, `# p  z5 X
     {
/ S  f  a: K# K! {8 G/ r       distime();0 h5 L# j# f& c+ I
       keyscan();
/ T/ @3 v2 j; H      }
! q2 ~* c: X2 Q* A}+ z2 r/ [4 t: P% H/ T1 p* }" A
void interrupt TMR_CONTROLL()
5 y. k; q/ {' H1 r( R: x{
+ e) u5 _  {9 A. O! V# D, P  R# Zif(TMR1IF==1)
# d' q; V0 c" c  {
/ K) j9 W% W9 s/ z6 ?: l2 ~# l    //TMR0=6;
! ?/ Y5 e/ d2 O    count++; $ C, H" z7 v5 L' E+ C0 `" \* `
    if(count==100)//16M crystal7 P% h2 u5 d" v. h( e* i
      {: A# q, `+ N+ I/ m, ?+ L
         count=0;
9 C! E3 I0 \# m( I; t         sec++;      
( |: y! A4 C2 C8 m' [, R0 ^         if(sec==60)
% q8 g5 u: ~+ ?             {; R5 u" q* b4 U6 F" a
               sec=0;( `( I, G! H! o2 o
               min++;! {( @0 w5 j- ^+ `- o
               if(min==60)9 o% G7 E$ Q1 ?/ R, X4 Q: G. G+ W
                   {" J! O9 C3 d# u4 X8 F$ {9 P
                     min=0;) @: P. r0 _! Q% Q/ b, E
                     hour++;  g9 w2 R* |2 q) @
                     if(hour==24)
2 E- \9 R' M3 I( E$ K                        {
- o' b8 ^# \! y6 c! I( O                           hour=0;. k' A; F2 Z- X2 }2 U. B
               
% H5 w# w6 [2 [3 h                        }
: B4 z- x% l1 b7 i9 p                   }
5 G$ [' T; Z6 f8 U/ w             }, a( t) F8 a* j1 h% G
      7 ?# [2 Y' `; L" E
      }
1 I0 I3 M* Y. u5 \2 _1 H9 ^- J! q        //TMR1H=(65536-5000)/256;. x; V" w& \. {9 k% N
       // TMR1L=(65536-5000)%256;
1 Q0 u( D( t1 {& W3 ~& b         TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;! U2 s' \! ]  `1 R- \  {7 L
         TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;
' r* P$ @1 g5 x# f9 n. {1 a         TMR1IF=0;2 w  Y5 ]" V. U! m5 \0 ]
  }3 j9 r1 L) t1 Z8 h4 Z7 _. h
}  

676_595_TIME.rar

15.71 KB, 下载次数: 3, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2016-7-4 14:24 | 只看该作者
支持楼主!加油* ]1 Q3 i$ l3 g

该用户从未签到

3#
发表于 2016-7-5 10:37 | 只看该作者
支持楼主!加油' \) h& p. o! m

该用户从未签到

4#
发表于 2016-7-27 17:38 | 只看该作者
支持一下,很不错哦!7 a" p- \) f7 ]+ w; b# E& Q" D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 11:15 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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