74LS164在单片机中的使用
- 格式:docx
- 大小:193.88 KB
- 文档页数:9
74LS164简介74LS164是一种8位串行输入/并行输出移位寄存器,广泛应用于数字电子领域。
它由TI(Texas Instruments)公司制造,是74系列(TTL)的一员。
功能74LS164具有以下主要功能:•8位位移寄存器:可以将8位数据进行位移操作,并将结果存储在内部存储器中。
•串行输入:通过一个输入引脚,可以逐位地输入8位数据。
•并行输出:通过8个输出引脚,可以同时输出寄存器中存储的8位数据。
引脚描述74LS164具有如下引脚:1.DS(Data Serial Input):串行数据输入引脚,用于输入通过位移操作需要存储的8位数据。
2.SHCP(Shift Clock Input):移位时钟输入引脚,用于控制位移操作的时钟信号。
3.STCP(Storage Clock Input):存储时钟输入引脚,用于控制存储数据的时钟信号。
4.GND(Ground):接地引脚。
5.Q7’(Serial Output):串行输出引脚,用于输出移位操作的结果。
6.Q0-Q6(Parallel Outputs):并行输出引脚,用于输出存储的8位数据。
7.VCC(Positive Supply):正电源引脚。
工作原理74LS164工作时,可以通过两个时钟信号控制其行为。
下面是其工作原理的描述:•存储器清零:在存储器清零时,将SHCP和STCP引脚设置为高电平,并将DS引脚设置为低电平。
此时,存储器中所有的输出引脚将保持低电平状态。
•位移操作:在进行位移操作时,将SHCP引脚设置为低电平,然后将输入引脚DS设置为要输入的数据位状态(0或1)。
接下来,通过将SHCP 引脚设置为高电平,使得数据在寄存器内进行位移,具体移位方向取决于输入引脚DS的状态。
重复进行8次位移操作,即可完成8位数据的输入。
•存储数据:要将位移操作的结果存储在内部存储器中,需要控制STCP引脚的信号。
当所有位移操作完成后,将STCP引脚设置为高电平,将移位结果存储在寄存器中。
74HC164N单片机驱动程序
74HC164N+单片机驱动程序
74HC系列IC广泛应用在数字电路上,主要在单片机电路比较多。
其中,74HC164N是8位移位锁存器,一般用
来驱动数码管,因为有时候单片机的I/O口数量有限,
有时会出现单片机I/O不够用的情况,这个时候就需要
外接IC来扩展。
74HC164只需两根I/O口就可以控制8
位输出,特别适应数码管、点阵屏、液晶等的驱动。
这
两根线一根是CLK、一根是DATA,只要结合时序,两根
线就可以输出512种状态。
下面是C程序;
void sendcode(uchar SC)
{
uchar i;
for(i=0;i;>;=1;
}
}
这个是74HC164N的驱动程序,注意,要将CLR接高电平,,A 和B接数据脚。
如果要发送位码,只需调用这个
子程序就行了,例如,发送0x03,只要写sencode(0x03),就OK 了,实际使用是非常简单的。
74HC164的驱动和应用74HC164的几点说明:1.74HC164是串行输入,并行输出的;2.它的并行输出其实是有延时的,只是延时时间小,可以认为是并行输出;74hc164封装和真值表:真值表中文解释说明:H-高电平 L -低电平 X -任意电平↑-低到高电平跳变(上升沿有效)QA0,QB0,QH0 -规定的稳态条件建立前的电平QAn,QGn -时钟最近的↑前的电平看真值表的第三条和第五条:就可以知道,在保持clear为 H, clock为↑状态下,AB都为H时,移位寄存器移入H,而当移位寄存器移入L时,必须令B为L,而A不受约束。
所以可以把AB断相连再接入单片机数据端口。
还有一种是A脚直接接高电平,B脚连入单片机数据端(P2_7)时序图:1. 首先区分输入输出信号。
这里CLEAR、A、B、CLOCK是输入信号,Qa~Qh是输出信号;2. 拿尺子开始扫描……2.1. 首先可以看到CLEAR的下降沿后输出全部置低电平。
结合后面的一个CLEAR 下降沿,可以得出结论:当CLEAR输入下降沿时,无论A、B、CLOCK状态为何,输出全部拉低;2.2. 尺子向右移动……找到Qa的第一个上升沿,可以看到这个上升沿是与CLOCK的上升沿对齐的,可以得出结论:输出在逻辑上与上升沿同步。
此时将会注意到在此之前已经有3个上升沿但输出始终为低电平,尺子移动分别比较这3个上升沿,其A、B输入分别为10、01,于是可以得出结论:Q a = A · B。
2.3. 尺子继续向右移动……可以分别看出在随后的CLOCK上升沿处,Qa全部按照A与B进行输出,从而验证以上结论。
此外Qb~Qh的波形为Qa波形依次移位得到。
集中实践报告书课题名称 利用74LS164芯片扩展8位LED 串行显示接口电路姓 名 学 号 系、 部 专业班级 指导教师※※※※※※※※※ ※※ ※※ ※※※※※※※※※※※年月日利用74LS164芯片扩展8位LED串行显示接口电路一、设计目的利用74LS164芯片扩展8位LED串行显示。
学习和掌握单片机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
二、设计要求1. 要求将片内30H-37H单元中数据,8个数码管,用扩展串行的显示端口显示出来。
2. 要求做出实物。
三、硬件电路设计74LS164是串行输入并行输出的移位寄存器,每接一片74LS164可扩展一个8位并行输出口,可以作为LED显示器的8根段选线。
实物如图3-1所示。
系统总电路原理图如图3-2,为89C52单片机最小系统与8位数码管的连接图,分别用8个74LS164和8个LED数码管。
部分硬件电路原理图如图3-3所示。
图3-1 电路连接实物图图3-2 总电路原理图图3-3 部分硬件电路原理图数码管中有8段LED数码管显示器由8个发光二极管组成。
LED数码管显示器有两种不一样的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管显示器。
本次设计采用共阳极LED数码管。
在单片机应用系统中,数码管显示器显示常用两种办法:静态显示和动态扫描显示。
所谓静态显示,就是每一个数码管显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。
这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种办法单片机中CPU的开销小。
我也是研究了好几天才开发明白的所以废话不多少,直接上硬货一,代码部分:(1)相关寄存器配置:串行口控制寄存器SCON串行口控制寄存器SCON的格式D7 D6 D5 D4 D3 D2 D1 D0SCON SM0 SM1 SM2 REN TB8 RB8 TI RI 98H 位地址9FH 9EH 9DH 9CH 9BH 9AH 99H 98HSM0、SM1——串行口的4种工作方式选择位SM0 SM1 方式功能0 0 0 同步移位寄存器方式0 1 1 8位异步收发,波特率由定时器控制1 02 9位异步收发,波特率为时钟频率的1/64或者1/32 1 13 9位异步收发,波特率由定时器控制寄存器的十六进制操作控制:复习一下例子:SCOM = 0x020X02的0代表在高八位,2的位置代表在低八按照8421 8421顺序操控scon SM0 SM1 SM2 REN TB8 RB8 TI RI8 4 2 1 8 4 2 1还不懂的画再来一个例子明白了就跳过往下:例如问配置REN置1,发送8位时间置1,接收标志位置1怎么配置答:0x1A好接着往下:(1)代码原创:#include <reg52.h>#include <intrins.h>unsigned char count;sbit ST_CP = P3^5; //P3^5 串行锁存寄存器时钟RCK,上升沿有效void main(){SCON = 0x00;//工作方式0while(1){for(count=0;count<8;count++){SBUF = 0x55;while(!TI)TI = 0;//左移一位将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010}ST_CP = 1;_nop_();_nop_();ST_CP = 0;for(count=30000;count>0;count--);//串口通信太快了,延时一下方便看示波器时序}}(1)代码解析51单片机通过直接操控SBUF寄存器会自动启动发送8位数据,期间TXD作为时钟线,每发送一位都会置1一次时钟线TXD,因此74HC595的SCK引脚只需连接51芯片的TXD引脚即可,51单片机会自动拉高拉低发送.二,protues仿真部分:(1),74HC595引脚功能:9 脚:串行数据出口引脚。
单片机并行I/O口的扩展方法摘要:由于在MCS-51单片机开发中P0口经常作为地址/数据复用总线使用,P2口作为高8位地址线使用,P3口用作第二功能(定时计数器、中断等)使用,所以对于51单片机的4个I/O口,其可以作为基本并行输入/输出口使用的只有P1口。
因此在单片机的开发中,对于并行I/O口的扩展十分重要,主要分析3种扩展并行I/O口的方法。
关键词: MCS-51单片机; 并行I/O口; 扩展MCS-51单片机有4个并行的I/O口,分别为P0口、P1口、P2口和P3口,4个并行I/O 口在单片机的使用中非常重要,可以说对单片机的使用就是对这4个口的使用。
这4个并行I/O口除了作为基本的并行I/O口使用,还常作为其他功能使用,如P0口经常作为地址/数据复用总线使用[1], P2口作为高8位地址线使用,P3口用作第二功能(定时计数器、中断等等)使用。
这样,单片机只有P1口作为基本的并行I/O口使用,如果在单片机的使用中对并行I/O口需求较多,对于并行I/O口的扩展就非常重要了。
下面通过具体的实例(8位流水灯设计)来给出几种不同的并行I/O口扩展方法。
为了更好地说明以下几种不同的并行I/O口扩展方法,假设利用单片机实现流水灯的设计。
采用单片机的P1口设计流水灯,电路。
由图1可知,8只LED直接连接在单片机的P1口上,通过对单片机进行编程即可以实现8只发光二极管产生流水灯。
1 使用单片机的串行口扩展并行I/O口单片机有一个全双工的串行口[2],这个口既可以用于网络通信,也可以实现串行异步通信,还可以作为移位寄存器使用。
当单片机的串行口工作在模式0时,若外接一个串入/并出的移位寄存器(74LS164),就可以扩展一个8 bit并行输出口;若外接一个并入/串出的移位寄存器(74LS165),就可以扩展一个8 bit并行输入口。
,单片机外接一个串入/并出的移位寄存器(74LS164),这样就可以扩展8 bit并行输出口。
多位LDE数码管段位在线确认及段码数组的编写方法当我们拿到一块成品的多位LED数码管显示电路板,或将买到的多位LED数码管安装到电路板上后,首先需要做的工作就是为LED编制段码表,因为,只有编好段码表后才能对其进行编程控制,也就是我们在数码管驱动应用程序中见到段码数组,本文将就前文提到的两位数码管、经由串行输入/并行输出芯片74LS164控制显示的电路,进行段位编码,与有兴趣的朋友共享,或许有朋友会说,现在LED数码管的应用,多是由单片机的一个输出端口的8位I/O端控制8个段,用另一个输出端控制数码管位,很少用到164了,其实不然,商品板多为164或595控制,即使自己设计时,考虑到单片机控制端口的多少,是否够用等因素,这种串口控制的芯片也是不错的选择,况且,即使是单片机端口直接控制也是要根据实际接线顺序进行编码的,此时只要更改一下程序中的输出语句即可;闲言少叙,书归正传;以AT89S51单片机为例,首先,连接好线路,164的数据输入端DAT连接单片机的RXD端,164的外部时钟端CLK连接单片机的TXD端,两个共阳极与+5V电源端连接;至于164的8个输出端经限流电阻与数码管连接的电路图在本空间相册中能够找到,仿制一下很容易的,不同之处在于,这种共数据端多公共极的模块,不论多少位数码就用一片164就可以了,在此就不多说了。
编程如下:#include<at89x51.h>main(){while(1){SBUF=0x80 ;while(!TI);TI=0;}}接下来画一张11行10列的草图,而后编译并下载上面这段程序,在电路连接正确时,必有一段被点亮(或未被点亮),此时在表格左侧第一行的第二个位置开始填入被点亮段的代号,(代号的定义见上篇文章附图)而后,将程序中的0x80依次更换为0x40;0x20;0x10;0x08;0x04;0x02;0x01并逐次编译下载,结果填入表内,最终得到全部段码代号的排列顺序,据此根据74LS164输出共阳极控制“0亮”、“1灭”的原则,得出各数字字符编码,见以下附图:到此,这个两位LED数码模块就可以编程应用了。
基于74HC164的单片机测试电路作者:张俊张耿旭郑杰来源:《电子世界》2012年第06期【摘要】在开发单片机系统时,常需要对系统进行调试,本文主要介绍了一种基于74HC164芯片的调试电路,应用在atmega128单片机系统上,配合调试程序,可以很方便的对单片机系统进行测试,也适合初学者学习单片机。
【关键词】单片机;74HC164;atmega128单片机1.前言74HC164是高速硅门CMOS器件,与低功耗肖特基TTL(LSTTL)器件的引脚兼容,是一种8位边沿触发式移位寄存器,串行输入数据,然后并行输出。
本文中使用了74HC164和8位的数码管作为输出部分,输入部分采用了四个键盘设计了该系统。
2.硬件设计本测试电路以atmega128为核心,原理图如图1所示。
从左到右依次为4个8位数码管,74HC164芯片的8个输出引脚分别对应8位数码管的8位输入引脚,最左边的74HC164芯片的输入引脚DSA、DSB一起接到atmega128的PC0口上,接收单片机发送的数据,最后一位输出引脚接在右边的74HC164芯片上的输入引脚DSA、DSB上,往右的芯片都是同样的接法。
4个寄存器的CLK脚都接在单片机PA0口上,接收单片机发送的时钟信号,上升沿触发[1]。
在程序初始化之后,当需要显示4位数字时,单片机只需要依次的发送相应字符的字符码,就可在数码管上一次显示想要显示的字符。
单片机PC0口每发一个电平,PA0发送一个上升沿,电平信号往右移一位。
3.软件设计在设计完硬件电路后,可以通过编写测试程序下载到单片机中,使用S1、S2、S3和S4四个按键进行测试,本文所使用软件开发环境为AVR STUDIO+WINAVR。
首先我们需要编写显示相应字符的字符码和显示子程序:int LED[19][8]=//数码管数字显示表{{0,0,1,1, 1,1,1,1},// 0{0,0,0,0, 0,1,1,0},// 1{0,1,0,1, 1,0,1,1},// 2{0,1,0,0, 1,1,1,1},// 3{0,1,1,0, 0,1,1,0},// 4{0,1,1,0, 1,1,0,1},// 5{0,1,1,1, 1,1,0,1},// 6{0,0,0,0, 0,1,1,1},// 7{0,1,1,1, 1,1,1,1},// 8{0,1,1,0, 1,1,1,1},// 9};void display_led(int mun){ int i;for(i=0;i{if(LED[mun][i]==1)data_h;//PC0口置高电平elsedata_l;//PC0口置低电平clk_l;//PA0口置低电平clk_h;//PA0口置高电平,发送上升沿 }}然后编写主程序,主程序流程图如图2所示,整个主程序为一循环函数,在循环扫描S1、S2、S3和S4四个按键。
采用74LS164芯片实现液晶的四线控制
引言
随着科学技术的飞速发展,电子产品越来越向智能化、小型化、人性化、低耗能等方面发展。
而液晶显示屏的兴起,为述要求的实现提供了可能。
液晶显示屏大致可分为段式、字符式、点阵式,或者单色、彩色等。
大多液晶显示屏都实现了标准化和模块化,采用通用的控制芯片(例如SED1330、SED1520、HD61202等)实现与单片机等的简单连接。
在实际应用中,考虑到产品并行的数据线和控制线连接。
在实际应用中,考虑到产品的成本和体积,采用并行的数据线和控制线连接,使用起来不是很方便。
因此希望采用标准的工业总线I2C、SPI等连接,而这类产品却很少见。
本文巧妙地利用液晶显示模块的特点,采用一片74LS164实际液晶的四线控制。
电路简单实用。
1 点阵液晶显示模块简介
本文介绍的是一种采用SED1520芯片控制的122×32图形点阵液晶显示屏,它主要由驱动/列驱动及122×32全点阵液晶显示器组成,可完成图形显示,也可显示七个半(16×16点阵)汉字。
主要技术参数和显示特性如下:
液显示模块驱动原理图
2 四线点阵液晶显示屏驱动电路
系统采用一片74LS164以串入并出方式与点阵液晶显示模块FM12232C连接,通过四条信号线(SDA串行数据线、CLK/A0串行时钟线即液晶显示模块的A0数据/指令控制线、。
74LS164在2051单片机LED显示电路中的应用
林敏;于忠得;舒奎
【期刊名称】《大连工业大学学报》
【年(卷),期】2001(020)002
【摘要】AT89C2051是一种高性能低价位单片机,但因其引脚少,给系统设计尤其是LED显示接口电路的设计带来一定难度.笔者采用串入并出移位寄存器74LS164圆满地解决了这一问题,文中详细介绍了该接口电路的构成原理与软件.实际运行表明,该显示电路可以成功地应用到以AT89C2051单片机为核心的智能仪表中,而且LED显示清晰稳定可在线调整发光亮度.
【总页数】3页(P123-125)
【作者】林敏;于忠得;舒奎
【作者单位】大连轻工业学院自动化工程系,辽宁,大连,116034;大连轻工业学院自动化工程系,辽宁,大连,116034;大连轻工业学院自动化工程系,辽宁,大连,116034【正文语种】中文
【中图分类】TP274;TH86
【相关文献】
1.动态显示电路在AT89C2051中的应用 [J], 庞(山严)英;曹海建
2.MC14499在AT89C2051单片机显示电路中的应用 [J], 牛洪涛
3.读一篇文章,作一个单片机电路(八):基于AT89C2051串口的LED数码管显示电路 [J], 黄亮
4.基于LED数码管的单片机显示电路实验平台开发 [J], 钟达
5.MC14499在AT89C2051单片机显示电路中的应用 [J], 牛洪涛
因版权原因,仅展示原文概要,查看原文内容请购买。
74LS164在单片机中的使用作者:huqin 来源:本站原创点击数:406 更新时间:2014年02月15日【字体:大中小】在单片机系统中,如果并行口的IO资源不够,那么我们可以使用74LS164来扩展并行IO口,节约单片机IO资源。
74LS164是一个串行输入并行输出的移位寄存器,并带有清除端。
74LS164的引脚可以查看数据手册。
proteus仿真图和代码附上。
#include<reg51.h>#define HIGH 1#define LOW 0#define SEG_PORT P0sbit DATA = P0^4;sbit CLK = P0^5;unsigned char Timer0IRQEvent = 0;unsigned char Time1SecEvent = 0;unsigned int TimeCount = 0;unsigned char SegCurPosition = 0;code unsigned char SegCode[10] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x 07,~0x7F,~0x6F};code unsigned char SegPosition[4] = {0xFE,0xFD,0xFB,0xF7};unsigned char SegBuf[4] = {0};void LS164_DATA(unsigned char x){if(x){DATA = 1;}else{DATA = 0;}void LS164_CLK(unsigned char x){if(x){CLK = 1;}else{CLK = 0;}}/********************************************************** *函数名称:LS164Send*输入:byte单个字节*输出:无*功能:74LS164发送单个字节***********************************************************/ void LS164Send(unsigned char byte){unsigned char j;for(j=0;j<=7;j++){if(byte&(1<<(7-j))){LS164_DATA(HIGH);}else{LS164_DATA(LOW);}LS164_CLK(LOW);LS164_CLK(HIGH);}}/********************************************************** *函数名称:SegRefreshDisplayBuf*输入:无*输出:无*功能:数码管刷新显示缓存***********************************************************/ void SegRefreshDisplayBuf(void){SegBuf[0] = TimeCount%10;SegBuf[1] = TimeCount/10%10;SegBuf[2] = TimeCount/100%10;SegBuf[3] = TimeCount/1000%10;}/********************************************************** *函数名称:SegDisplay*输入:无*输出:无*功能:数码管显示数据***********************************************************/ void SegDisplay(void){unsigned char t;SEG_PORT = 0x0F;t = SegCode[SegBuf[SegCurPosition]];LS164Send(t);SEG_PORT = SegPosition[SegCurPosition];if(++SegCurPosition >= 4){SegCurPosition = 0;}}/********************************************************** *函数名称:TimerInit*输入:无*输出:无*功能:定时器初始化***********************************************************/ void TimerInit(void){TH0 = (65536 - 5000)/256;TL0 = (65536 - 5000)%256;TMOD = 0x01;}/********************************************************** *函数名称:Timer0Start*输入:无*输出:无*功能:定时器启动***********************************************************/ void Timer0Start(void){TR0 = 1;ET0 = 1;}/********************************************************** *函数名称:PortInit*输入:无*输出:无*功能:I/O初始化***********************************************************/ void PortInit(void){P0 = P1 = P2 = P3 = 0xFF;}/********************************************************** *函数名称:main*输入:无*输出:无*功能:函数主题***********************************************************/ void main(void){PortInit();TimerInit();Timer0Start();SegRefreshDisplayBuf();EA = 1;while(1){if(Timer0IRQEvent){Timer0IRQEvent = 0;if(Time1SecEvent){Time1SecEvent = 0;if(++TimeCount >= 9999){TimeCount = 0;}SegRefreshDisplayBuf();}SegDisplay();}}}/********************************************************** *函数名称:Timer0IRQ*输入:无*输出:无*功能:定时器中断函数***********************************************************/ void Timer0IRQ(void) interrupt 1{static unsigned int cnt = 0;TH0 = (65536 - 5000)/256;TL0 = (65536 - 5000)%256;Timer0IRQEvent = 1;if(++cnt >= 200){cnt = 0;Time1SecEvent = 1;}}741ls164内部为8个D触发器,用以实现数据的串行移位,741ls164特性见表3。
单片机以串行口方式0〔移仿寄存器方式)输山数据,3片74Lsl64作为3排共阳数码管的串/并转换显示接口。
74ls164为TTL单向8位移位寄存器,可实现串行输入,并行输出。
其中A、B(第1、2脚)为串行数据输入端,2个引脚按逻辑“与”运算规律输入信号,共一个输入信号时可并接,共同作为输入脚。
cP(第8脚)为时钟输入端,可连接到串行口的TxD端。
每一个时钟信号的上升沿加到cP端时,移位寄存器移一位。
8个时钟脉冲过后,8位二进制数全部移入74lsl 64中。
MR脚(第9脚)为复位端,当该脚为低电平时,移位寄存器各位复0;只有当它为高电平时,时钟脉冲才起作用。
Q1一Q8(第3—6和10一13引脚)并行输出端分别接数码管的h—a(因为串行n从低位开始传送)各段对应的引脚上。
在给出了8个脉冲后,最先进入741。
s164的第1个字Ll数据到达厂最高位。
再来1个脉冲,第1个脉冲就会从最高位移出,进入下个74L5164的第1位。
3片741‘S164首尾相串,而时钟端则接在一起。
这样,当输入8个脉冲时,从—9片机RXD端输出的第1字节数据就进入了第1片74LSl64中,而当第2个8个脉冲到来后,第l字节数据就进入了第2片74Lsl64,而随后的第2字节的数据则进入了第1片74LS164。
这样,当第3个8个脉冲完成后,首次送出的数据被送到了最下面的164(第3片)中,其它数据依次出现在第二和第一片74LS164中,实现了数据在74LS164中的串行输入、并行输出。
表3 74LS164特性表。