基于51單片機+74hc595流水燈
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
#include<reg52.h>
#include<intrins.h>
//intrins.h函數,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用
typedef unsigned char uchar;
typedef unsigned int uint;
/**********函數聲明********************/
void SendTo595(uchar byteData);
/***********************************/
sbit DS = P3^4; //p3.4串行數據輸入 DS
sbit SH_CP = P3^6; //串行輸入時鐘,上升沿有效
sbit ST_CP = P3^5; //串行寄存器時鐘,上升沿有效
char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay(unsigned int n)//延時函數
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void main()
{
int i;
while(1)
{
for(i=0;i<8;i++)
{
ST_CP = 0;
SendTo595(LED[ i]); //二進制:0101 0101
delay(500);
}
}
}
//發送一個字節數據給595再并行輸出
void SendTo595(uchar Data)
{
char i=0;
for(i;i<8;i++)
{
SH_CP = 0;
DS=0x80&Data;//&為按位運算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個式子為0
Data=_crol_(Data,1); //左移一位 將高位補給低位,如果二進制數為01010101 那么_crol_(1) 為10101010
SH_CP = 1; //上升沿讓串行輸入時鐘變成高電平 并延時一個時鐘周期
_nop_();
}
/*位移寄存器完畢,轉移到存儲寄存器*/
ST_CP = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
_nop_();
}
Keil代碼與Proteus仿真下載:
基于74hc595流水燈.7z
(61.62 KB, 下載次數: 39)
2022-6-1 15:55 上傳
點擊文件名下載附件
|