|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机+74hc595流水灯# `0 F% ~5 C5 v
仿真原理图如下
1 \; [+ S2 I6 O+ v: h: N 9 E+ C8 h: K( \2 e+ E
9 J2 e, Z9 o% `8 C! F/ c
单片机源程序如下:( I) l; h. m8 e5 X5 L" ~, b
#include<reg52.h>/ v! Z7 X2 K! N3 N
#include<intrins.h>
0 W/ L3 q4 ?# c* G7 d//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用
1 O5 ]- Z% K) {2 W X! c! B' a
7 ^# `- W9 L h- G, I! e; atypedef unsigned char uchar;
% m2 L/ `: n- F) W/ V; jtypedef unsigned int uint;
5 ~# l% ]3 i& p* g/ S$ t: ~
; t% u; N( _' w9 I4 s+ [/ w8 Y: v/**********函数声明********************/7 B7 r. ]0 J9 [/ C# w
void SendTo595(uchar byteData);
+ ~' a4 P9 N& t7 D/***********************************/' @! D7 {$ R! V" F. Y A' }
5 d) H# O4 V/ `
sbit DS = P3^4; //p3.4串行数据输入 DS% {! S) @2 K+ ?: @$ \% t
sbit SH_CP = P3^6; //串行输入时钟,上升沿有效3 w# D s+ F! x" J* R7 ]3 h; \
sbit ST_CP = P3^5; //串行寄存器时钟,上升沿有效
# X' E' N3 Q8 J a char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
9 k+ P# m+ I! {* p" r" l( T( x
void delay(unsigned int n)//延时函数
- \8 j7 m$ f8 P" j& M' p) _2 e B/ K{* A9 S! `8 G8 F( V* [$ I, d3 ]4 T
unsigned int i=0,j=0;
/ a3 ~8 h. k: J for(i=0;i<n;i++)
3 `* h4 U! T* u" P0 P+ h/ ^ for(j=0;j<123;j++);. y, V/ |* \ x; }* |* t1 i
}5 a9 o3 { F6 \ B; A
- @! C2 ?; p3 `# @
void main()+ ?8 a$ k* U6 h/ y. m9 u& j
{# s6 I) V8 o M% w- i! g
int i;6 B' ^5 ~/ A9 F& {3 d8 u
while(1)1 {& Y' l$ _; X
{
7 x, E& M: I% n( M2 S( q) W* F for(i=0;i<8;i++)- Y( U* d2 a- t- @" N9 e- h
{
( s3 z4 T& F+ }, q L0 o0 g, o ST_CP = 0;& Y2 Y; p$ c0 i' G- @: P8 ~
SendTo595(LED[ i]); //二进制:0101 0101
% Z& g1 V3 R& v# o+ E+ ` delay(500);/ V" |8 `; b. J; T4 ]
}+ D1 Z$ t$ R' t4 \
}( V* o% m5 I& `" k* c3 x
}5 f7 t9 i0 y) {5 L- p+ Q
4 h4 f+ _, d1 \
//发送一个字节数据给595再并行输出( m% k5 S1 a8 W. U3 N c% W& `6 S& J
void SendTo595(uchar Data)6 n. w7 {, E+ e+ z( |
{
l$ C% w9 H8 ?7 j, F7 o char i=0;3 V3 R) c) R2 o( C H
for(i;i<8;i++)
) J; i5 p- P3 _# m1 M9 p. A) ]* s {
0 Z* H0 N% m7 \5 {# d3 G" S SH_CP = 0; 6 p$ b7 h% m+ [. p+ k
4 O# U0 t" w* i+ c8 H6 Z5 U/ E DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0 {' B* W2 c) I" g. p2 v& ~
: x& t; K7 ?# S8 b& `, D& g
Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010+ [; D8 h* S; G+ i! R
4 |8 Y3 a4 J o0 ]$ I5 g& P SH_CP = 1; //上升沿让串行输入时钟变成高电平 并延时一个时钟周期, f+ `* U. _) Q, b2 f$ e
_nop_();
6 I/ C( n: I0 ~8 b9 I' \# y' Z
" e. N1 K. D# w% H% W4 i% y7 d' [ } ' [# e" h( ?; H1 r/ E
3 e' `; m/ b1 M' R
/*位移寄存器完毕,转移到存储寄存器*/8 U: z/ T+ s; X8 N0 w
ST_CP = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期4 g- \9 k T2 M+ o6 z, K$ `' G1 p+ W
_nop_();
( y4 C% v3 e" g1 c& U/ c0 @# u _nop_();
8 H8 O2 M7 t2 E( R- L# J, S
2 k* q& S2 W7 k}
8 B2 [ ]0 Y0 A' _ |
|