|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机+74hc595流水灯+ X; m$ c. j: x2 H% _
仿真原理图如下3 \; r$ r5 R6 f9 |+ N
![]()
0 E; N% H3 f. U3 Z' z
! z: d1 V/ o6 B3 M单片机源程序如下:% i% f, l% T# U! P6 V
#include<reg52.h>
7 u# I+ E3 D0 h5 b#include<intrins.h>
' O1 @% k5 k v' Z5 d//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用6 D* f+ z1 I: W0 z
! Y) e2 F7 Z6 R/ N& o- Y3 g
typedef unsigned char uchar;1 A5 R; }7 v/ {3 e7 { w
typedef unsigned int uint;
& w# P+ U+ M, M7 _# q% {- s- ^3 N% [, y7 E6 F
/**********函数声明********************/
( l, W* F0 {6 y" p+ ^+ ]void SendTo595(uchar byteData);
2 U& t+ T8 ^0 z% _1 H# d7 @/***********************************/
5 l1 c4 D x! ?' a9 p% I# J* c1 D/ y0 y3 Y8 s7 b
sbit DS = P3^4; //p3.4串行数据输入 DS5 O x) ^( e+ h2 O' F1 z, a
sbit SH_CP = P3^6; //串行输入时钟,上升沿有效9 n5 V1 y$ c& {' B
sbit ST_CP = P3^5; //串行寄存器时钟,上升沿有效# |1 \$ C( ~' T# T8 P' I4 W
char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
, T2 a; f) B2 ^$ g3 V- ?
2 t3 X N' \3 P1 j% U% ]void delay(unsigned int n)//延时函数
; u) L9 }1 W( }/ ?! P0 w{$ @% b2 ~8 s* c
unsigned int i=0,j=0;
6 y3 J N" i" M: M7 P8 K for(i=0;i<n;i++)8 }2 h6 ]# v0 s2 k" s0 V' `" A
for(j=0;j<123;j++);& Q9 m+ B, d4 }4 _5 M8 {
}
: ?3 G. Y2 D8 ]0 R1 l* t. }
4 m* o( q) G& {1 N' w3 Yvoid main()+ A" h. w, H+ {& a# k
{0 W/ t' ]0 g+ V4 i5 c+ I; ^/ u
int i;% T& \ f$ `" `% K; N, r/ t
while(1)
' v+ Y' M, }& g5 |( M$ L9 e {3 [( P' j0 \6 ~: y; w3 |/ s
for(i=0;i<8;i++)
2 ]/ I1 h0 B3 Z8 G {
$ A6 A' H* j+ w) u$ L! u L ST_CP = 0;
" r( e. d$ ~/ t2 S! d1 E8 _ ` SendTo595(LED[ i]); //二进制:0101 0101) S5 z" S( ~3 I$ }5 L
delay(500);
5 }- s7 @4 J, P( e9 u7 F! V }
7 e0 c0 W& J8 Q& _ }9 ^7 r6 B5 y+ {" Q1 R" `
}5 V0 i) q+ K% M! @8 z' ^( N4 U3 C
k& @& d. _2 t7 U- d
//发送一个字节数据给595再并行输出; c9 c& X, ]7 |6 G9 T6 f% j
void SendTo595(uchar Data)1 b8 p4 X; m; x+ h
{5 C$ b/ J: }7 s5 y5 ]
char i=0;
! {+ @; H7 p# J& ^$ G for(i;i<8;i++): {& E" W) H8 J) i' L6 w
{
* t h b1 k1 G! d1 Q+ e SH_CP = 0; 6 r; J$ O! y; r! ^, W/ C3 M, z
/ G9 V$ L: w0 X
DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
, a) }. \8 |' v2 w7 x) |
+ F3 P7 U4 w$ j% K, d, a5 n Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
9 n6 f; Q8 M. A3 z$ |( |: R5 ]* L6 x: {
SH_CP = 1; //上升沿让串行输入时钟变成高电平 并延时一个时钟周期8 ^5 n9 Q+ A' D8 r# P
_nop_();
8 x, q; c- G. _( U& P9 u: M% C4 l3 L
}
' Y4 t0 a) X8 R5 [$ G' g. p; {
& v( H8 R$ `/ }4 P! y) U/ [ /*位移寄存器完毕,转移到存储寄存器*/# C7 n# s# @! D/ A1 E# `1 s A( @ ~
ST_CP = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期
5 T* ]: J6 D: t/ a8 L _nop_();" G0 r4 ]! g4 y0 r1 X, p' j
_nop_();4 Y+ K. G$ o5 @ N2 n+ l2 o
1 R! @8 L O4 e% i. M) w# Z( p2 |}, {+ T" p* K2 a; m( n
|
|