(基于Arduino的)物理交互设计基础669.74HC595实验9.1实验目标利用74HC595芯片实现LED流水灯效果。9.2实验器材序号名称规格/型号数量备注1主板ArduinoUNO12面包板Half+13电阻33084电阻10k15LED普通8颜色不限6IC59574HC59519.3理论学习集成电路74HC595介绍通过前面的学习,发现Arduino本身的IO口数目很有限,对数字电路不是很在行的同学难免会担心将来遇到需要多于板载数字IO口数目的情形。这里介绍一种常用的扩展数字输出的集成电路74HC595。只需要3个引脚就可以实现8个数字输出。74HC595是一款漏极开路输出的CMOS移位寄存器,输出端口为可控的三态输出端,也能够串行输出控制下一级联芯片。特点如下:高速移位时钟频率fmax25MHz电源电压范围:2~6V标准串行接口(SPI)CMOS串行输出,可用于多个设备的级联低功耗:TA=25℃时,Icc=4A(MAX)注:关于74HC595集成电路的使用,请参考该IC的详细技术资料(特别是商家提供的技术参数。)(基于Arduino的)物理交互设计基础67图4.9.1集成电路74HC595的引脚说明图4.9.2集成电路74HC595的时序图(Z-sate:请参考“三态门”):下面是网络上的资料,为了方便参考,故附于此处。参见:74hc595芯片使用方法,21IC中国电子网(引用日期2015-02-13)。(1)74595的数据端:Q0—Q7:八位并行输出端,可以直接控制数码管的8个段。Q7S:级联输出端。将它接下一个595的DS端。DS:串行数据输入端。(2)74595的控制端说明:MR(10脚):低点平时将移位寄存器的数据清零。通常将它接在Vcc。引脚编号名称功能说明1~7,15Q0~Q7并行输出(ParallelDataOutput)8GND电源地9Q7S(SQH)串行数据输出(SerialOutput)10MRMasterReset,(平时接5V)11SH_CP移位寄存器时钟输入(ShiftRegisterClockInput)12ST_CP存储寄存器时钟输入(StorageRegisterClockInput)13OE允许输出(OutputEnable)(低电平启用activeLOW)14DS串行数据输入(SerialDataInput)16Vcc5V工作电压(基于Arduino的)物理交互设计基础68SHCP(11脚):上升沿时数据寄存器的数据移位,Q0Q1Q2...Q7;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。通常的使用都在微秒级。)STCP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将STCP置为低点平,当移位结束后,在STCP端产生一个正脉冲(5V时,大于几十纳秒就行了。通常都选微秒级),更新显示数据。OE(13脚):高电平时禁止输出(高阻态)。(如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。)注.74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。注.74595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时ST_CP为低电平,OE为低电平。从DS每输入一位数据,串行输入时钟SH_CP上升沿有效一次,直到八位数据输入完毕,输出时钟ST_CP上升沿有效一次,此时,输入的数据就被送到了输出端。(3)595具体使用的步骤:第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。方法:送位数据到_595。第二步:目的:将位数据逐位移入74HC595,即数据串入方法:SH_CP产生一上升沿,将DS上的数据移入74HC595移位寄存器中,先送高位,后送低位。第三步:目的:并行输出数据。即数据并出方法:ST_CP产生一上升沿,将由DS上已移入数据寄存器中的数据送入到输出锁存器。说明:从上可分析:从SH_CP产生一上升沿(移入数据)和ST_CP产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰。即可输出数据的同时移入数据。参考:74hc595芯片使用方法,21IC中国电子网(引用日期2015-02-13)。(基于Arduino的)物理交互设计基础69shiftOut(dataPin,clockPin,bitOrder,value)函数shiftOut()函数能够将数据通过串行的方式在引脚上输出,相当于一般意义上的同步串行通信,这是控制器与控制器、控制器与传感器之间常用的一种通信方式。shiftOut()函数没有返回值,有四个参数,分别说明如下:dataPin:数据输出引脚,数据的每一位将逐次输出。引脚的模式需要设置为输出。clockPin:时钟输出引脚,为数据输出提供时钟,引脚模式需要设置为输出。bitOrder:数据位移顺序选择位,该参数为byte型数据。有MSBFIRST(MostSignificantBitFirst,高位优先)和LSBFIRST(LestSignificantBitFirst,低位优先)两种方式可供选择。value:所要输出的数据值。在一个执行时间内输出第四个参数value的某一位。1个字符有8位,若希望从最高位(左边)开始,则第三个参数为MSBFIRST;若从最低位(右边)开始,则为LSBFIRST。使用shiftOut()函数的主要原因是可以自行变化输出频率。需要从Arduino的clocckPin(本例中使用Pin12)输出,这样74HC595能知道dataPin(本例中使用Pin11)的正确读取方式。这些说明在芯片的说明手册中都有提到。这里节录部分来进行说明。分析时,请参考74HC595数据信号时序图。点亮的LED的位置需要将十进制数字转换为二进制才可以了解。例如:15310011001这时,应该是Q0、Q3、Q4和Q7这4颗LED发光。进一步,可以利用74HC595扩展很多很多的数字输出,靠的就是将多颗IC串联在一起,只需要将SH_CP和ST_CP接在一起,前一颗的Q7S接到后一颗的DS上即可。9.4实验内容实验中使用74HC595集成片来扩展Arduino的数字输出接口,电路原理和接线参考图分别给出。注意:请按照电路原理图来接线。参考接线图只是给出一个大概的布局(不能排除画连线时有会错误发生。)(基于Arduino的)物理交互设计基础70参考接线图图4.9.3实验电路原理图图4.9.4参考接线图代码清单//定义引脚bytelatchPin=8;//至74HC595的ST_CPbyteclockPin=12;//至74HC595的SH_CPbytedataPin=11;//至74HC595的DSvoidsetup(){(基于Arduino的)物理交互设计基础71pinMode(latchPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(dataPin,OUTPUT);}voidloop(){for(bytedata=0;data255;data++){digitalWrite(latchPin,LOW);//低电位表示启动shiftOut(dataPin,clockPin,MSBFIRST,data);digitalWrite(latchPin,HIGH);//高电位表示停止delay(500);}}附加内容A.若将上面程序中的loop()的for(bytedata=0;data255;data++);修改为for(intdata=1;data255;data*=2);//注意,此处data为int型即可实现LED的从低位向高位的单向循环显示。提问:为什么data不能继续使用byte型数据?(提示:一旦变为0,……)B.若再将shiftOut(dataPin,clockPin,LSBFIRST,data);中的参数LSBFIRST修改为MSBFIRST,则会变为从高位向低位的循环显示。9.5拓展驱动8段数码管实现通过74HC595来控制8段共阴极数码管的显示。参考代码a./**使用74HC595芯片来驱动1位8段共阴极数码管,显示从0~F和“.”*74HC595芯片的接线为:(基于Arduino的)物理交互设计基础72*ST_CP--Pin8,SH_CP--Pin12,DS--Pin11*OE--GND,Q0~Q7--数码管的a~h*///定义引脚constbytelatchPin=8;//至74HC595的ST_CPconstbyteclockPin=12;//至74HC595的SH_CPconstbytedataPin=11;//至74HC595的DS//数码管0~F数字和段码表存储于数组中bytecTable[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};voidsetup(){pinMode(latchPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(dataPin,OUTPUT);}voidloop(){for(bytei=0;i17;i++){shiftOut(dataPin,clockPin,MSBFIRST,cTable[i]);//下面两条语句用于在ST_CP上产生一上升沿,//将已移入数据寄存器中的数据送入到输出锁存器。digitalWrite(latchPin,LOW);digitalWrite(latchPin,HIGH);delay(500);}}参考代码b./**使用74HC595芯片来驱动1位8段共阴极数码管,显示从0~F和“.”。(基于Arduino的)物理交互设计基础73*相对与a程序,增加了当输出为“0”时闪烁。这段代码*只是为了演示将来进行此功能时的使用方法。*例如,“0”为危险状态,或者其它一些需要引起注意的情形。*-----------------------------------------------------------*74HC595芯片的接线为:*ST_CP--Pin8,SH_CP--Pin12,DS--Pin11*OE--Pin9,Q0~Q7--数码管的a~h*///定义引脚constbytelatchPin=8;//至74HC595的ST_CPconstbyteclockPin=12;//至74HC595的SH_CPconstbytedataPin=11;//至74HC595的DSconstbyteoePin=9;//至74HC595的OE//数码管0~F数字和段码表存储于数组中bytecTable[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};voidsetup(){pinMode(latchPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(dataPin,OUTPUT);pinMode(oePin,OUTPUT);}voidloop(){for(bytei=0;i17;i++){shiftOut(dataPin,clockPin,MSBFIRST,cTable[i]);//下面两条语句用于在ST_CP上产生一上升沿,//将已移入数据寄存器中的数据送入到输出锁存器。digitalWrite(latchPin,LOW);digitalWrite(latchPin,HIGH);(基于Arduino的)物理交互设计基础74//仅当i=0,就是在显示cTable[0]的字符的时候,闪