|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机+74hc595流水灯9 M5 _0 [/ h( ?
仿真原理图如下: I$ P! ^( I; B
![]()
! O e: O( j. j
9 E8 k" \" G/ l q单片机源程序如下:7 d! x* o9 q6 k2 E- ~
#include<reg52.h>
`% ?$ b- P% K$ C+ l( Q#include<intrins.h>
2 m' y q& s; A; y3 ~0 @! A//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用) X \8 t5 U% t1 T. V* J" e8 M
% C" Z, r; C' i! j! C3 c3 R; ttypedef unsigned char uchar;
5 r: |! s0 }0 d4 X+ ^: }$ y- Rtypedef unsigned int uint;, x% n7 D' ^) B
1 t. v; W" C$ `% G+ C
/**********函数声明********************/
( p* d, \. y6 {+ evoid SendTo595(uchar byteData);
4 J0 @& a" N( i5 P, d) X/***********************************/
+ Y& p* P0 M$ Q) i8 q0 D& R$ }: u8 Z$ o1 _* g/ A: X ^
sbit DS = P3^4; //p3.4串行数据输入 DS7 O. Q2 r+ @$ e% S9 j: M5 B; I8 b
sbit SH_CP = P3^6; //串行输入时钟,上升沿有效
3 L+ u j2 {! Wsbit ST_CP = P3^5; //串行寄存器时钟,上升沿有效
" [7 d+ X+ v* _5 F3 p char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
( Z2 @5 t2 P+ O. t O7 ^: O% y
0 f# V( l2 I4 r# u1 ~: ]void delay(unsigned int n)//延时函数; K( r. G! Y3 L9 e! g8 a+ y
{% J p" u5 K- o9 g1 w# e
unsigned int i=0,j=0;2 A) A( [" \' G: v. a8 E8 g
for(i=0;i<n;i++)
; H) ?4 w9 }2 t- v for(j=0;j<123;j++);) k6 X# F# R8 z! G3 j3 t
}
" x/ m' H& D3 H# u; `# u, O# ^3 V
% y* l3 l# H/ l1 R w* H& \4 Wvoid main(), Z" l% _. x& `8 ]! f
{ ^* `5 g& C1 C; K4 x8 L' K8 G9 I
int i;
2 `! `$ r2 o: T8 I' f& v( Q, n* ] while(1)+ Q3 ? H: H, G' o4 B: b1 l0 _9 Y
{2 s6 F" W0 s8 [: R" P. O
for(i=0;i<8;i++)" C* Z- u2 P7 U9 P+ r8 I: ]
{. N X2 d) x0 Y& X& @8 I# H& ^
ST_CP = 0;
0 r& B* ?3 }5 E SendTo595(LED[ i]); //二进制:0101 0101& v9 V& z& E$ ~1 s
delay(500);* L# @9 p$ g) v% m6 ]2 ^
}
( W; Q5 o8 Q( _. o/ u) |7 B5 e: U9 f \ }0 L! C) G5 w( j
}% M5 h0 _3 N* I: |) C$ U @
) y! i4 ]: Z% Q& J, T; T% v- r3 W/ o//发送一个字节数据给595再并行输出
: F; N. ^, W7 H3 [' G5 Rvoid SendTo595(uchar Data)
# v; I; J4 s- S1 q8 t{
8 O5 y* z% Q+ Q. r- q char i=0;# l% O0 O2 ]9 \7 U/ j$ N2 U$ c
for(i;i<8;i++)
5 J5 I& M$ `6 H- ^. o$ F; J" n) P {
$ |7 G1 t" ^% B! z) q2 ] SH_CP = 0;
$ N% k3 Z& ?& g$ F, `4 K & ]0 e5 ~6 W0 Z) y* C
DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
, ~ a+ H1 Q. M " [- P; T- L; q& D1 q
Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010 Y u: h- g8 @4 ]$ e0 E1 W, V
1 B) K+ H2 B* }$ \4 ~. O4 b& e5 {
SH_CP = 1; //上升沿让串行输入时钟变成高电平 并延时一个时钟周期3 x+ k+ D& l, K- T, j9 ~; l
_nop_();( E G1 q- k+ b" N- u. I, ]
6 m* R3 J: r" U) k# ]' s
}
7 t. H4 r$ R7 t2 S' E" ]; i( o. N$ L/ ^- @
/*位移寄存器完毕,转移到存储寄存器*/: R) c H- h7 L q( l3 F6 o* c
ST_CP = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期
3 b: O4 D4 `* l _nop_();( B. B7 J3 |; H( J; l! G, U
_nop_();7 [1 t$ |( T" j# ?3 P- S9 W- \
5 ~/ y# T0 ?1 E( g4 o# w/ k- ~}; `7 h2 X; G) `% x) A) ^
|
|