51单片机IO口扩展控制LED流水灯74HC595(普中科技开发仪)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiaoermeng/article/details/88093024

首先注意几个问题:
(1)之所以用IO口扩展,是因为节省IO引脚(设想假如控制LED就需要八个引脚,那么如果需要很多功能实现的话,IO引脚定是不够的).。
(2)如果定义位变量 sbit RCLK=P3^5;时候会出现error C231: ‘RCLK’: redefinition。要把RCLK换成其他任意的即可,或者把头文件由#include"reg52.h"换成#include"reg51.h"即可。(因为reg52.h里面已经定义过RCLK这个变量了)。

大家都知道74HC165与74HC595两个芯片的基本作用,在这里只讲595芯片,因为这里会遇到。
74HC595此芯片是串入并出,即串行的输入数据,并行的输出数据(一个输入端SER,八个输出端QA~QH)。
讲一下大致实现过程:
(1)595芯片读取一个字节的数据(可以通过函数调用实现);
(2)由于一个字节是八位,由于引脚14(SER)只能输入一位的数据,可以知道对于该芯片读取的八位数据(一个字节)进行移位依次输入。如下图
00
11
(3)并行的输出数据通过QA~QH引脚,进而控制LED。
000
如上图为芯片引脚图
其中写GND的,VCC的可以忽略不管。(用最简洁的语言教大家如何理解595芯片以及写出流水灯程序)。
其中①引脚11SRCLK)是移位寄存器时钟,(提醒你开始移动数据了)。
②引脚12RCLK)是存储寄存器时钟,即数据将从移位寄存器移到存储寄存器中。(提醒你开始存储移动好的数据了)
③引脚9可以用作级联。作为下一个595芯片的输入。
下面附上代码:

#include"reg52.h"
#include"intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define IO_led P0
#define IO_key P1
void delay(unsigned int);
void keydown();
u8 code smgduan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
u8 keyvalue;
sbit SRCLK=P3^6;//移位寄存器时钟(上升沿有效)
sbit CLK=P3^5;//存储寄存器时钟(上升沿有效)
sbit SER=P3^4;//数据输入端
u8 hc595sendbyte(u8 dat)
{
	u8 i;
	for(i=0;i<8;i++)
	{
		SER=dat>>7;//比如数据1101 1101右移七位则成为0000 0001则最后一位就是SER所取的位,最高位
		dat<<=1;//左移一位是为了取得刚刚所读取位的紧挨着的位
		SRCLK=0;
		_nop_();
		_nop_();
		SRCLK=1;
	}
	  CLK=0;
		_nop_();
		_nop_();
		CLK=1;//一个上升沿(如若不知道可以看此文章的图一)
}

void delay(unsigned int i)
{
  unsigned int j;
	for(;i>0;i--)
	 for(j=0;j<124;j++)
	{}
}
void main()
{
	u8 lednum;
	lednum=0x01;
	while(1)
	{
		hc595sendbyte(lednum);//595芯片读取一个字节
		delay(500);
		lednum=_crol_(lednum,1);//对于lednum变量进行左移操作
	}
}

何为上升沿,上升沿是一个瞬间,电平从0到1的瞬间。图3
以上为IO口扩展,用595芯片控制LED的情况。若对于该芯片还不了解可以百度其详细资料引脚功能,若有不懂或者错误的地方,欢迎留言_

猜你喜欢

转载自blog.csdn.net/qiaoermeng/article/details/88093024