|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机+74hc595流水灯
( e' O0 C i' o仿真原理图如下
8 X9 Z" u/ U+ [9 R& s' y+ ~( b, w1 w3 w![]()
+ z+ i* g5 L+ h+ j$ t9 X2 z
2 z7 s. X7 Y0 J$ S B* {单片机源程序如下:% e6 x, i+ n5 _
#include<reg52.h>
K- \3 f% R; E; K' h) @#include<intrins.h>. K( Q& ]- e3 `! S8 n7 @- h) E9 Q
//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用
% V$ k) ~5 S% J5 d- m( A+ w) U- R) @; p# l8 C; e1 Y
typedef unsigned char uchar;: K/ B, [3 M) [6 C. q
typedef unsigned int uint;7 G& t# F l' _8 D0 a3 ^. M$ v$ n
3 E1 h0 c# q F& b6 C; L
/**********函数声明********************/
$ ?+ M5 t$ L+ L6 {void SendTo595(uchar byteData);3 j$ [3 \2 ?& u+ b2 C
/***********************************// H8 Z$ J: X# W, p
/ Y3 i$ }& F4 }0 l' `9 _# qsbit DS = P3^4; //p3.4串行数据输入 DS
) D v( n% X, N( |sbit SH_CP = P3^6; //串行输入时钟,上升沿有效
0 i9 E/ {' M; ~) q: q O! x9 dsbit ST_CP = P3^5; //串行寄存器时钟,上升沿有效. J' }- O. T! ~ c3 k
char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};4 t0 k% K5 R( |$ M& }; C' E; z
2 G; U. I0 m0 D2 v
void delay(unsigned int n)//延时函数% H( J5 L F; y! |8 O+ {2 M
{6 c; N n! ]) c g6 ]. W
unsigned int i=0,j=0;
' v$ B6 }. ^0 s, T' \# x! n for(i=0;i<n;i++)# o5 \5 ~( y8 \7 ~
for(j=0;j<123;j++);3 R* M# l- U) a* t% C
}
) E1 u4 f0 F1 M1 \" y& ^
; P7 v8 U2 n6 e j1 ~void main(); @: C. D; Z1 l5 x% W
{+ g+ D y1 G5 L4 {
int i;/ Y) \& O" L0 G2 R% D! M
while(1)
x7 C% N5 N, ?0 K {+ D0 G$ Q: f( o
for(i=0;i<8;i++)
4 J" D" h) @: i {1 O, _. P* [! O% i6 a& I
ST_CP = 0;) z9 V* C" @: `* R5 v
SendTo595(LED[ i]); //二进制:0101 0101- q! K( j* x3 J: W
delay(500);: N7 W* r# A( Z5 e% x
}
4 F2 L6 R5 x/ w9 m* v* K }- l. q+ ]/ f) }$ w: r) k, a
}
2 z1 x8 Z$ T+ a5 m# i, i
- D# P4 s. q' ]//发送一个字节数据给595再并行输出
9 r" o- F m. V) K0 A- hvoid SendTo595(uchar Data)
5 M# p. `; m) t# G. J/ {! M4 _{" g; C; q( {7 _9 P, }8 a/ A
char i=0;$ Y$ ]: w6 {# s( c# ?9 G
for(i;i<8;i++)$ V/ ~0 \# H J7 w; D' a
{! z! S1 |% j) U' B, ~
SH_CP = 0; 8 m J+ h i5 z& I
' b% k/ Q+ s1 ^3 @3 G# P DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0# ?- ^- A+ g1 C; @1 S4 m
' j! ]' L9 G0 v; x; c3 }- [ Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
R j& [5 J: G6 H
. I, \% {* }" z0 ~' `( Y5 ] SH_CP = 1; //上升沿让串行输入时钟变成高电平 并延时一个时钟周期' y8 B* _0 R! N+ W" e/ D1 J, a& O
_nop_();
* t5 S2 g6 s' f$ `7 T, a7 B& p" ~: h8 E
} * Q5 r* e: G: d
* U: \/ @, ?! T/ T, u3 ]6 k
/*位移寄存器完毕,转移到存储寄存器*/
% k3 E8 ]. d1 X# g- ^0 k: x' _/ Y, M ST_CP = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期
; W: l' c: c4 x9 R( o _nop_();
. }1 m- S# E1 q( o _nop_();
8 r$ w2 e4 i* N5 E/ G9 {+ T
5 ]2 m7 x1 c4 d$ `}
2 H: a P1 Z' ?$ B. K |
|