|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机+74hc595流水灯. H" n; X3 c9 E; {) J% q* v1 O
仿真原理图如下
3 ]7 S' d7 u% G& ^![]()
+ W- \) z1 r+ E
( d0 I5 s7 Y/ t* y/ S0 t1 t/ C3 O单片机源程序如下:# ?9 O8 }1 Q( X% y
#include<reg52.h>7 T P6 Z# c* I
#include<intrins.h>
* ?# j# t! {6 Z. @+ n) ?//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用
' }. i& I* G/ r6 x L' e4 P
, _! u( L4 u8 ztypedef unsigned char uchar;
7 j+ T. @+ j: y! O/ L$ U$ [5 @typedef unsigned int uint;
+ }, D) l# }( p. e' Y- b
) h w) B0 s. t4 B. K% o/**********函数声明********************/
- l! @6 v& f2 B/ P& O3 ^, Hvoid SendTo595(uchar byteData);4 ?6 [* |# @7 Z' L8 f) M6 O) m3 I
/***********************************/
T2 ^# \* D0 X. S' P: M
5 c) \% R" Y+ Q$ W' Osbit DS = P3^4; //p3.4串行数据输入 DS
4 j, C) |; L& p4 \% q, esbit SH_CP = P3^6; //串行输入时钟,上升沿有效- @$ l" p5 u9 {( \1 e
sbit ST_CP = P3^5; //串行寄存器时钟,上升沿有效6 J8 ~0 M( |# _0 P: p! @
char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
2 s* a( m- `; P6 l" W4 B6 \, Z; g1 I0 a/ S! Q0 e8 m
void delay(unsigned int n)//延时函数
* a. h% L( j2 e{
1 [+ U- d! t2 m1 O& F7 N unsigned int i=0,j=0;' [% \2 }3 r( y! g: _ `; ]
for(i=0;i<n;i++)
* t, o. L! z8 g5 t1 Q& I/ G for(j=0;j<123;j++);5 L- l; v7 q. h( C \' p/ P" Q+ g! v
}* A1 z# P- C- l% b* |% S
3 N) q/ y! y, A7 H: Q( W
void main()
! w) o" `5 l; I- V2 A# L* q{
H0 H0 C- ?; P W5 W9 Z( o6 [ int i;+ s: A) d! `# k' q: p6 s- u1 ^
while(1)
0 N& O1 t# i0 B1 a4 Z {
$ W6 Y: O5 U' U% I5 k6 `' n for(i=0;i<8;i++)
1 i) ~; a; w. J7 Y% |- c' {. F* O {
% { {$ n* g6 s8 \6 G* N0 J ST_CP = 0;' L' b8 S; x% }
SendTo595(LED[ i]); //二进制:0101 0101" f2 `9 I* E( a3 I- ?# C* C
delay(500);6 N& \9 \! I/ b. u; q
}* x* D( m; Y; F
}" @9 i; \! ~/ E" l W
}6 w4 Q' o7 T( l! a, m' n
. H# v% [5 n& r9 C
//发送一个字节数据给595再并行输出
* O6 }4 c3 k7 w) H3 W8 Avoid SendTo595(uchar Data)
! ^9 i( @' i0 X1 R' K{
$ f; W* `6 E: ?( ~ char i=0;" t7 p) i# @, @
for(i;i<8;i++)0 f8 I2 X2 Z+ X- C) v; N& [. r9 l
{
7 v+ G, H4 y. U9 G5 X* |& B5 | SH_CP = 0; % U. Q. C, u" p& j0 Y8 q
9 l- Q( b9 O4 ?# T/ N8 J0 d/ @ DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
5 F( j2 r+ V2 ^0 U4 v0 k
$ p- }$ Z- d7 |9 u7 M$ T Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010- l. W/ U: h+ ^ L0 a: C5 ^
$ E# E( O; x1 y0 Y4 j SH_CP = 1; //上升沿让串行输入时钟变成高电平 并延时一个时钟周期4 b3 ?) ]% N% ]' T0 n' m; \
_nop_();
6 R$ `0 Z& n2 I# O
3 v, e6 w {9 [& J3 N }
6 T7 d( p- ?" D& H
$ }0 c t- U5 Y: d- {( i8 E- G /*位移寄存器完毕,转移到存储寄存器*/1 u0 T6 G& V P! A+ I+ v
ST_CP = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期# }, d/ ^: P& g7 `) u/ s* q
_nop_();
* f* r, E: u2 f6 T _nop_();# S9 Y% h+ o" I) [
2 N) R- M. v/ Z9 q
}" F4 B r' t1 W* k1 t
|
|