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

51单片机的74HC164驱动六位数码管动态显示程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-11-16 10:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
#include<reg52.h>: B2 Z! [! ]8 E9 y' m4 |, {# H
#include<intrins.h>/ Q0 R, }3 B! a& q* K
8 A* @8 |, g9 s7 I$ b
#define uchar unsigned char
( H7 }7 O; i: m& F' H& R' j#define uint unsigned int
# N5 B- j$ J2 }1 {. {' }//74HC164
; r" x4 B' n2 B* V% |sbit CLK=P1^0;        // μíμ&ccedil;&AElig;&frac12;μ&frac12;&cedil;&szlig;μ&ccedil;&AElig;&frac12;±&szlig;&Ntilde;&Oslash;′¥·¢3 X$ V, u' Z0 e' l
sbit MOSI=P1^1;         //         êy&frac34;Yê&auml;è&euml;% p. ~9 U3 K/ F: W% Q
8 J8 x) o  y& [2 I) ?, ^
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
6 S9 B/ r  Q: s& I/ r* q                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //12ò&otilde;êy&Acirc;&euml;1ü
3 {1 Z$ P' M. _% J# m' W$ runsigned char DS_data[6];2 c8 K2 f7 p% G& a$ c: ?
/*****************************************************( c/ [& f. M- |" P! E) G
oˉêy1|&Auml;ü:êy&Acirc;&euml;1üé¨&Atilde;è&Ntilde;óê±×óoˉêy9 {1 M# D# x. K6 N/ z0 ]" l
oˉêy1|&Auml;ü:&Ntilde;óê±1ms
5 [3 u6 N5 j; s2 m7 |8 M
( [" f& m4 _  Y( G) L$ I* {0 f***************************************************/
3 H2 E" u+ I/ Z9 B8 mvoid delay1ms()% i3 U/ U& ~! G& I
{
; K. h' |9 s2 \9 n. c8 P! m7 W   unsigned char i,j;        ( ^9 f/ T2 G8 }5 H$ _
         for(i=0;i<10;i++)
: ]8 @7 }9 o, k          for(j=0;j<33;j++)
( g/ Y2 G/ _. {           ;                 
7 t/ D. G6 r% f, s! @6 q' s  t* S, j}3 x- F9 ?) l( p
void separateData(unsigned long dat)         // dat&Icirc;a6&Icirc;&raquo;êy
/ q1 S  \4 q. S2 q1 P$ S! a# f9 B0 `{/ G% X8 ^9 M8 s1 H( f0 _. m
   DS_data[0]=dat%10;
8 Z  B; O+ v0 J   DS_data[1]=dat/10%10;
$ a- {& s, t9 o4 H   DS_data[2]=dat/100%10;3 U" T; O: {! F. q. ?8 g" K  ]
   DS_data[3]=dat/1000%10;+ g' j/ E3 m; A, v# T+ Y
   DS_data[4]=dat/10000%10;
- d, t$ i& e2 [, Y0 N   DS_data[5]=dat/100000%10;" R/ P3 y1 o6 q1 V$ o4 ]7 s
}
$ A: v& W, q# E9 e& f7 d" Pvoid write_164(unsigned char dat). Q" c. g% g6 Q; D2 o
{
$ |- B2 @( w- e8 \8 j3 g& E9 C$ I' c   unsigned char i;
' x7 p- j2 A7 d   for(i=0;i<8;i++)
  n( Y) T: i3 C, h8 b1 I3 Q   {
$ L0 ~& Q2 g% Z& U+ C     CLK=0;            
; ^7 ]) [' K( m0 D" E1 \" k1 a     if(dat&0x80)  MOSI=1;: Q9 @  i( j3 O; S1 I/ n
     else          MOSI=0;9 v& C7 P. a4 Y( l
     CLK=1;               7 o- m" G' E- x/ m; W/ [7 }
     dat<<=1;
  {" H# |+ v5 O) j  }
% h+ d2 d# y; ]}+ m0 y  c# R; q! c: ]& P( }
5 [+ S4 D1 S! `8 {1 R( S
void display()# |, u# Z8 d( i0 C% X; \3 T
{+ Z$ R  D& H6 k; g, q' G0 w6 h+ f
   unsigned char i;6 v  o7 k7 c. A5 p/ S
   for(i=0;i<6;i++)
6 _. R% B1 w3 q# Q) E: g' T   {/ d6 C9 b7 [$ s) M! K& x, z) W3 q8 c
                        write_164(Tab[DS_data]);9 D4 r, H$ h) d: M- {5 b4 k' _) p
                        P2=0x3f&(~(0x01<<i));     //êy&Acirc;&euml;1ü&Icirc;&raquo; 12ò&otilde;μíμ&ccedil;&AElig;&frac12;&Ntilde;&iexcl;&Ouml;Dseg1&para;&Ocirc;ó|P2.5 seg6&para;&Ocirc;ó|P2.0' `1 r% @! ]1 ~' ?
                        delay1ms(); / i0 |4 z5 K& u, c9 ~9 n. Y* g0 c3 \
                        P2=0xff;        //êy&Acirc;&euml;1ü&Atilde;e: N# `+ |) V. c& R- S
   }$ w  h) x/ s- F* `* ?. h. r

! C6 R2 I0 @) h}" F: z) F. R- w. o- d# U) |' c

4 P' N0 \. E0 xmain()
* T) V' e1 g& ]8 |{& i) C. s6 o) q
   separateData(654321);" T4 P# C1 I# E9 |/ ?
   while(1) % k/ |! B2 L/ _) ~8 Z+ f
   {; d2 E5 D& W1 P  h1 s
     display();
% d2 o9 A) V0 z6 S- P   }0 X5 U% e! q: W  {' j5 U& J
}
2 T: u- Y4 d! I8 J 8 v- R2 d8 }5 m! `8 X" r( @1 ?
#include<reg52.h>
' U  M( S' X+ ~" q9 y* i#include<intrins.h>
4 C7 c# Q, x, S2 g4 J: A
# B% B- C0 e9 `( B; N#define uchar unsigned char
$ R1 @/ J3 y* @, S; l( G9 g, x#define uint unsigned int, j6 q6 c+ c% V$ }6 ^
//74HC164. _% H- d6 z7 w& D
sbit CLK=P1^0;        // 低电平到高电平边沿触发# ]3 v; J6 i! j. z1 z  R, k7 ~
sbit MOSI=P1^1;         //         数据输入
: F# K! e( Y5 D, W+ z) M7 L8 A
" E: c4 {! ^3 J8 W) \unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,. C0 x2 y8 r  S5 w0 j
                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //共阴数码管5 P9 ~* X; b5 g
unsigned char DS_data[6];
( R$ E3 [2 [0 y7 a' {/*****************************************************
% u/ P2 ]& Y- X0 [. Y, Z函数功能:数码管扫描延时子函数# V; E! y$ I( D/ }( D0 a- T
函数功能:延时1ms9 j9 D4 j0 K; R% A6 o; a

8 a' j; @! A3 H9 r  Q: [  P***************************************************/: W3 d) y$ v( Q0 G& A0 v
void delay1ms()
$ k; F2 J+ A3 P' `4 z" Z{
. L$ X1 `. I  O; o- K   unsigned char i,j;        
5 r4 ~/ E& `4 r; R) t" ^4 B8 H$ r         for(i=0;i<10;i++)5 k+ |# |1 _0 [8 B% C. e# f& ?* e
          for(j=0;j<33;j++)
; }/ G. q3 l! d           ;                 2 z* ?6 R0 ~  J; l. ~2 Z
}
: F1 L5 F! q, \; Y, }void separateData(unsigned long dat)         // dat为6位数
; H  G; G& ]; o( {' g2 `) u; i{/ H# {8 o( W$ K' \, X8 T
   DS_data[0]=dat%10;
9 J. U3 p- {, k& x" c7 }. g   DS_data[1]=dat/10%10;- K  H: Q" R% y% {5 s5 o
   DS_data[2]=dat/100%10;! O0 r4 t3 c: B7 ~( t
   DS_data[3]=dat/1000%10;0 M; D0 r3 f3 `0 N3 K+ w1 x$ u. h9 e
   DS_data[4]=dat/10000%10;# I- ^5 F; a: ], g! I2 A( G* ]8 s' i
   DS_data[5]=dat/100000%10;  E/ o. P+ r0 c0 {( M& `) C8 H+ v
}
) a% q) I+ l& B# n) svoid write_164(unsigned char dat)/ a0 f4 Y" u9 W3 s$ a
{/ M0 L$ E" s% Y0 B3 K, [0 h( {
   unsigned char i;
6 o) {& e% c: P% X   for(i=0;i<8;i++)
3 P+ o8 N- F3 o) o1 l2 q3 w   {/ [& w$ W1 T$ {1 k) b3 o+ s& Y
     CLK=0;             , r! c5 Q+ O7 W) E2 T% @; A
     if(dat&0x80)  MOSI=1;
: F8 Q8 G2 K$ N- s     else          MOSI=0;0 `/ [. @/ E; B/ C) C8 i4 ^
     CLK=1;               1 J4 a  B& D. X- B4 Y- a2 V$ n
     dat<<=1; : Y# G+ E! ~, ]9 }3 ~" Y
  }
6 d5 v$ H  X0 |- l2 W0 ~+ L4 C( v}3 f! b: l$ w9 b$ }8 j& i' O" V
, d$ `2 i2 P/ Q. \
void display()
1 i+ @  C" I. ^/ `- y' f  i" ^{
% S0 h% Z( C+ E9 j6 Y: l   unsigned char i;* P1 y! p! u+ ^9 Z. u
   for(i=0;i<6;i++)" w9 e$ h  e% G) K, N/ [
   {$ V+ W, U' j. P1 T! A+ f; [: {
                        write_164(Tab[DS_data]);
2 \* Y0 H" E# H" {                        P2=0x3f&(~(0x01<<i));     //数码管位 共阴低电平选中seg1对应P2.5 seg6对应P2.0+ _* `) l0 R* ^' X! G
                        delay1ms();
5 k. N7 f* i  j( R5 W5 @                        P2=0xff;        //数码管灭7 n5 E6 K' D: Y3 p* y
   }
7 c5 ]6 \  z$ \- \8 Z1 v% T: U! Z9 q. ^1 f9 C6 O4 X
}
$ k0 `& A5 P5 S# U( }# U9 `0 I8 z' N: e; z
main()
1 ^7 f8 x  p  k* f# `{
7 [7 i! e9 i7 w5 X! ~: t$ ~# L   separateData(654321);
* `/ i; Q2 ]8 b   while(1)
; @3 d" c( I$ V5 ^9 g% r8 L   {6 |0 m# M6 a% W" y1 G
     display();* I' T! n6 O+ X# T+ R
   }
' {  r$ q/ s. m( B  J. P9 p}
  Q( ?/ V8 q# _$ @: j& J& ^8 L. F5 ?3 R" D9 o! @: b  D$ M/ r

拓展并行口电路仿真.zip

76.67 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-11-16 13:16 | 只看该作者
位选控制亮不亮,而段选控制显示数字,利用了人体肉眼观察的能力。" M8 `- Y8 N; k3 a" Z
给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。

该用户从未签到

3#
发表于 2022-11-16 13:29 | 只看该作者
高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。3 c6 }9 s8 E) C% j
是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。

该用户从未签到

4#
发表于 2022-11-16 13:45 | 只看该作者
动态显示:动态显示占用CPU时间长,只要不执行显示程序,就立刻停止显示。动态显示使用硬件少,占用 I/O较少。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-13 03:11 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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