74HC165的联级编程实例
- 格式:docx
- 大小:278.77 KB
- 文档页数:4
74HC165 概述74HC165是一款高速CMOS器件,74HC165遵循JEDEC标准no.7A。
74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC165是8位并行读取或串行输入移位寄存器,可在末级得到互斥的串行输出(Q7和Q7),当并行读取(PL)输入为低时,从D0到D7口输入的并行数据将被异步地读取进寄存器内。
而当PL为高时,数据将从DS输入端串行进入寄存器,在每个时钟脉冲的上升沿向右移动一位(Q0 → Q1 → Q2,等等)。
利用这种特性,只要把Q7输出绑定到下一级的DS输入,即可实现并转串扩展。
74HC165的时钟输入是一个“门控或”结构,允许其中一个输入端作为低有效时钟使能(CE)输入。
CP和CE的引脚分配是独立的并且在必要时,为了布线的方便可以互换。
只有在CP为高时,才允许CE由低转高。
在PL上升沿来临之前,不论是CP还是CE,都应当置高,以防止数据在PL的活动状态发生位移。
74HC165 特性异步8位并行读取同步串行输入兼容JEDEC标准no.7AESD保护HBM EIA/JESD22-A114E超过2000 VMM EIA/JESD22-A115-A超过200 V温度范围-40~+85 ℃-40~+125 ℃74HC165 参数74HC165 基本参数电压 2.0~6.0V驱动电流+/-5.2 mA传输延迟16 ns@5V74HC165 其他特性最高频率56 MHz逻辑电平CMOS功耗考量低功耗或电池供电应用74HC165 封装与引脚SO16, SSOP16, DIP16, TSSOP168 位移位寄存器(并行输入,互补串行输出)简要说明当移位/置入控制端(SH/LD)为低电平时,并行数据(A-H)被置入寄存器,而时钟(CLK,CLK INH)及串行数据(SER)均无关。
当SH/LD为高电平时,并行置数功能被禁止。
CLK和CLK INK在功能上是等价的,可以交换使用。
74HC165汇编、C语言编程。
简介:首先shld置低电平,延时大约1ms,完成数据读取,然后拉高。
接着进入一个8次的循环,首先clk=0;读取so的值,在clk=1;依次循环8次。
(首先读取的是高位,依次递减)注意:本例采用的是显示哪个按键被按下,即将读取的状态赋值给P3口,再由P3口通过数码管显示!!!!(共阴极)(1)汇编:/*在本例中,P2.0--so;P2.1--clkP2.2--shld*/ORG 0000H//------主函数-------MAIN:CLR P2.2 //拉低NOPNOP //空指令SETB P2.2 //拉高MOV R0,#8 //循环次数MOV R1,#0 //存放LOOP:CLR P2.1 //拉低MOV A,R1RL A //左环移MOV R1,AMOV A,P2 //读入P2状态ANL A,#1 //读取第一位数ORL A,R1 //或MOV R1,A //赋值SETB P2.1 //拉高DJNZ R0,LOOP //减一不为0,跳转loop MOV A,R1MOV P3,A //赋值给P3口SJMP MAIN //跳转END(2)C语言#include<reg51.h>sbit shld=P2^1;sbit clk=P2^0;sbit so=P2^2;int n=0;//-------延时子程序------void delay(int i){int j;while(i--)for(j=100;j>0;j--);}//-----读信号子程序------void read(){int i,m=0;shld=0;//低电平读入信号delay(10);//延时shld=1;//置高电平for(i=0;i<8;i++)//循环八次{clk=0; //拉低n=n<<1; //左环移n=n|so; //将位依次排列,组成16进制数clk=1; //拉高}//首先读最高位信号再一次往低}//-----主函数--------void main(){while(1){read();//读信号P3=n; //P3口赋值}}。
实验十串并和并串转换的I/O口实验一、实验目的熟悉掌握串转并和并转串的I/O口扩展方法。
二、实验设备及器件PC机一台DP-51PROC单综合仿真实验仪一台三、实验内容1.编写程序,通过单片机的P1口控制74HC164的串行输入端口,实现串并转换,并验证串并转换数据的正确性。
2.编写程序,通过单片机的P1口控制74HC165的串行数据输入端口,实现并串转换,采用8位的拨码开关作为输入数据,验证程序设计的正确性。
四、实验要求掌握串并转换芯片和并串转换芯片的工作原理,学会使用串并转换芯片和并串转换芯片扩展单片机的I/O口资源五、实验预习要求认真阅读本实验内容,提前做好实验准备工作。
六、实验步骤串并转化步骤:1.短接A5区JP10接口,将A5区的CLK164、DINA164、DINB164、CLR164与A2区的P10~P13对应相连(CLK对P10等等)。
2.运行编写好的程序,完成一次串并转换。
3.使用C2区的逻辑笔或D1区的LED指示灯测试并行输出数据Q0~Q7数据的正确性。
并串转化步骤:1. 短接A4区JP11跳线,将A4区的165_PL、165_CLK1、165_CLK2、165_SER、/Q7、Q7与A2区的P10~P15对应相连(/PL对应连接P10等等)。
2. 将D1区的J54接口连接到A4区J98并行数据输入接口,设置拨码开关SW1~SW8的状态。
3 打开程序调试软件,下载运行编写好的软件程序,完成一次并串转换操作,把拨码开关的状态读出来。
4. 查看程序运行结果是否正确。
七.实验程序串并转换程序:CLK EQU P1.0DINA EQU P1.1DINB EQU P1.2CLR164 EQU P1.3ORG 8000HLJMP MAINORG 8100HMAIN:MOV SP,#60H ;设置堆栈向量NOP ;设置以下端口初始化CLR CLK ;CLK=0SETB DINB ;DINB=1CLR CLR164 ;CLR=0输出端口清零SETB CLR164 ;CLR=1MOV A,#0AAH ;用户输出数据初始化MOV R4,#08HSLCHG: RLC AMOV DINA,C ;串行输出一位数据SETB CLK ;移位时钟NOPCLR CLKNOPDJNZ R4,SLCHGSJMP $ ;程序结束,完成一次串并转换END并串转换程序:PL EQU P1.0CLK1 EQU P1.1CLK2 EQU P1.2SER EQU P1.3Q7 EQU P1.5ORG 8000HLJMP MAINORG 8100HMAIN: MOV SP,#60H ;设置堆栈MOV R4,#00 ;延时DJNZ R4,$MOV A,#0 ;变量清零SETB Q7 ;Q=1,端口设为输入状态CLR SER ;SER=0CLR CLK2 ;CLK2=0CLR PL ;/PL=0NOP ;锁存并行输入数据SETB PL ;/PL=1NOPMOV R4,#08H ;设置循环变量CLR CLK1PLCHG:MOV C,Q7 ;读入一位串行数据RLC ASETB CLK1 ;时钟脉冲NOPCLR CLK1NOPDJNZ R4,PLCHGMOV R7,A ;保存数据SJMP $ ;程序结束,完成一次并串转换END八、实验思考题对串并转换,思考编写软件程序,实现8位LED流水灯的控制。
浅谈单片机系统中I/O的扩展--基于74HC164和74HC165在我们的单片机应用系统中,常常会遇到I/O口不够的情况。
譬如说接有外部RAM而且要求有16个以上的按键,8位数码管以上的显示。
而且还不包括其它的外围器件。
这时整个系统的I/O资源就很吃紧了。
系统的扩展性也不好。
这时我们就需要考虑对单片机的I/O进行扩展了。
虽然专门的I/O扩展芯片市场上也有不少,但对于我们一般的应用,没有必要整的那么复杂。
用一些简单的移位寄存器芯片一样可以实现我们的目标。
下面我们首先来认识一下74HC164这款芯片。
这款芯片的作用是把串行输入的数据并行输出。
注意,它没有锁存功能,在允许输出的情况下,每一个时钟的上升沿,数据依次从最低位移向最高位。
因此,在做数码管的输出显示的时候会出现拖影的想象,在设计此电路时要注意考虑此情况。
下面是它的引脚图。
A1,A2是数据输入端,一般情况下两者连在一起,作为串行数据的输入端。
Qa----Qh j就是并行数据的输出端了。
CLOCK 和RESET分别为时钟和复位端下面我们再看看它的真值表,有了真值表我们才知道如何正确的去编写程序去驱动它(其它复杂的器件还需要对照时序图编写相应的驱动程序)呵呵,怎么样,这个表很简单吧,相信大家都能够看的懂。
当Reset为低电平时不管时钟为高电平还是低电平也不管输入引脚A1,A2为何值,输出的并行数据均为低电平。
当Reset 为高电平时,只有在时钟的上升沿,A1A2上的值才被移位输出。
看懂了这张表那么剩下的事情就好办多了。
下面我以级联的8块74HC164驱动8位共阴的数码管为例来阐述它的用途。
当然它的用途并不仅仅在于此。
你可以发挥你的聪明才智去应用它到你的设计中。
以上的连接中Reset脚要全部接高电平。
所有的Clock引脚都要连接在一块。
第一块74HC164的AB引脚接在一块作为串行数据的输入端。
第二块74HC164的AB引脚接在第一块74HC164并行数据输出端的H脚上。
74LS165并入串出实验74L165是并行输入,串行输出移位寄存器。
80C51单片机内部的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展一个或多个8位并行I/O口。
A,B,C,D,E,F,G,H 并行输入端。
QH串行输出端。
CLOCK:时钟输入端。
CLOCK INHIBIT:时钟禁止端。
当时钟禁止端CLK2为低电平时,充许时钟输入。
SHIFT/LOAD:移位与置位控制端。
SER:扩展多个74LS165的首尾连接端。
本练习TXD(P3.1)作为移位脉冲输出端与74LS165的移位脉冲输入端CLOCK相连;RXD(P3.0)作为串行输入端与74LS165的串行输出端QH相连;P3.2用来控制74165的移位与置入。
本练习利用串行口扩展了1片74LS165,从而实现了8个按键的输入,在单片机的P1口连接了8个LED 发光二极管,程序中实现了用按键控制发光二极管的亮与灭。
流程为8路开关-74165-3PIN数据线-8路指示灯。
由此可以看出通过165传输,只用了3条数据线,就实现了8个开关控制8个灯的目的。
从而节约了控制的连线。
74LS165 引脚定义:74LS165逻辑表:相关原理:程序运行照片:接线方法:1、用一个4PIN数据排线一端插入CPU部份JP53(P3口)的P3.0,P3.1,P3.2,P3.3。
另外一端插入74LS165部份的输入端JP21。
2、用一根8PIN的数据排线,一端插入74LS165部份的输出端JP28, 另一端插入8路按键开关的的JP48。
3、用一条8PIN的数据排线把CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。
运行后分别按k00-k07,可以看到d00-d07八个灯受控制。
程序流程图:汇编语言参考程序:org 0080hloop: mov scon,#00010000b ; 设定MODE=0clr p3.2 ; P3.2=0 载入数据call delay1 ;延时setb p3.2;P3.2=1 ;数据输出clr ri ;RI=0loop1:jbc ri,loop2 ;RI=1?是则到LOOP2 jmp loop1 ; 否则继续监测loop2: mov a,sbuf ;将SUBF载入ACC mov p1,a ;输出到P1jmp loop ;重新开始delay: mov r7,#00h ;延时子程序tt: mov r6,#00hdjnz r6,$djnz r7,ttretdelay1: ;短延时子程序mov r7,#02djnz r7,$retend。
************************** Copyright(C)CaKe ******************************* **********=============================================================================== =======================**文件名: main.c ============================**作者: CaKen ============================**版本号: V1.0 ============================**时间: 2014.08.16 ============== ==============**功能描述: 74HC165实验测试============================================================================================= =========******************************************************************************* *********#include <reg52.h>#include <intrins.h>//SPI 接口sbit CLK = P3^6; //串行时钟sbit IN_PL = P1^6; //把数据加载到锁存器中sbit IN_Dat = P1^7; //数据通过P1.7脚移进单片机内处理sbit RELAY = P1^4; //继电器sbit BEEP = P1^5; //蜂鸣器unsigned char bdata Key;sbit K0=Key^0; //位定义sbit K1=Key^1; //位定义sbit K2=Key^2; //位定义sbit K3=Key^3; //位定义sbit K4=Key^4; //位定义sbit K5=Key^5; //位定义sbit K6=Key^6; //位定义sbit K7=Key^7; //位定义bit M0 ,K0J; //位定义******************************************************************************* **********函数名:调用:beep();参数:返回值:结果:备注:蜂鸣器 (让蜂鸣器发出动听声音)******************************************************************************* **********void beep(){unsigned char i,j;for (i=0;i<2;i++){for (j = 0; j<255; j++){_nop_();}BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}******************************************************************************* *********函数名:74HC165函数初始化调用:HC165_Init();参数:返回值:结果:备注:IN_PL上升沿,CLK上升沿******************************************************************************* *********unsigned long HC165_Init(void){unsigned char i;unsigned int indata;IN_PL=0; //上升沿_nop_(); //短暂延时产生一定宽度的脉冲IN_PL=1; //将外部信号全部读入锁存器中_nop_();indata=0; //保存数据的变量清0for(i=0; i<8; i++){indata=indata<<1; //左移一位if(IN_Dat==1)indata=indata+1; //如果IN_Dat检测到高电平保存数据的变量加1CLK=0; //时钟置0_nop_(); //上升沿CLK=1; //时钟置1}return(~indata); //将保存数据的变量取反后返回}******************************************************************************* **********函数名:主函数调用:main参数:返回值:结果:备注:74HC165控制八个按键******************************************************************************* **********main(){while(1){unsigned long Input=HC165_Init(); //调用165驱动程序Key=Input&0xff; //将数据传给位变量RELAY = 1;P2 = 0xff; //清除if(K0&K0J)M0=~M0; //实现脉冲输入大家仔细体会K0J=~K0;if(M0) {RELAY = 0; P2 = 0x7f; } //实现脉冲输入if(K1) {beep(); P2 = 0xbf; } //K1 为1时开启蜂鸣器和2个灯if(K2) {beep(); P2 = 0xdf; }if(K3) {beep(); P2 = 0xef; }if(K4) {beep(); P2 = 0xf7; }if(K5) {beep(); P2 = 0xfb; }if(K6) {beep(); P2 = 0xfd; }if(K7) {beep(); P2 = 0xfe; }}}。
74HC165的联级编程实例三篇篇一:74HC165的联级编程实例#include<reg51.h>#include<intrins.h>sbitCLK=P2^5;//时钟sbitLD=P2^6;//移位,置位sbitSO=P2^7;//输出#defineLED1P0#defineLED2P1inthc165(){inti=0;chardat1=0,dat2=0;intdat=0;LD=0;//允许数据数据进入165 _nop_();LD=1;//for(i=0;i<8;i++){dat1<<=1;CLK=0;if(SO==1)dat1|=0x01; CLK=1;}for(i=0;i<8;i++){dat2<<=1;CLK=0;if(SO==1)dat2|=0x01; CLK=1;}LD=0;dat=dat1;dat<<=8;dat|=dat2;returndat;}voidmain(){while(1){LED1=(hc165()&0XFF);LED2=((hc165()>>8)&0XFF); }}篇二:74HC165联级编程实例#include<AT89X51.h>#define uchar unsigned char#define uint unsigned intsbit DS=P1^0 ; //595sbit SH=P1^1 ;sbit ST=P1^2 ;//sbit MR=P1^3;sbit CLK=P1^4;//165sbit INH=P1^5;sbit LD=P1^6;sbit SO=P1^7;//msec(511);0.5s//msec(2);2ms//msec(1021);//1svoid msec(unsigned long x) //延时 {unsigned char j;while(x!=0){x--;for(j=0;j<116;j++) {;}}}void hc595(uchar *p,n) {uchar i,j;for(;n>0;n--){i=*p;for(j=0;j<8;j++){DS=i&0x80;i=i<<1;SH=0;SH=1;}ST=0;ST=1;ST=0;p++;}}void hc165(uchar *d,n) {uchar i=0,j,c=0;LD=1;LD=0;LD=1;INH=0;for(j=0;j<(n*8);j++) {CLK=1;i=i<<1;i=i|SO;CLK=0;c++;if(c==8){*d=i;c=0;d++;}}}main(){uchar *P,*D;uchari,a[5]={0x00,0x00,0x00,0x00,0x01},b[5]={0x0ff,0x0ff,0x0ff,0x0ff,0x0f f}; P=a;D=b;hc595(P,5);hc165(D,5);P3=b[4];while(1);for(i=0;i<34;i++){if(i==8){a[3]=0x01; a[4]=0x00;}if(i==16){a[2]=0x01;a[3]=0x00;}if(i==24){a[1]=0x01;a[2]=0x00;}if(i==32){a[0]=0x01;a[1]=0x00;}P=a;hc595(P,5);a[0]<<=1;a[1]<<=1; a[2]<<=1; a[3]<<=1; a[4]<<=1; msec(511); }}篇三:74HC165联级编程实例74HC595 74HC165程序例子(AVR)硬件说明:ATmega48/88/168的PB5是SPI时钟输出,接74HC595/74HC165的移位时钟输入端;PB4是SPI的MISO数据输人,接74HC165的数据输出;PB3是SPI的MOSI数据输出,接74HC595的串行数据输入端SER;PB2接74HC595/74HC165的锁存时钟输入端。
(31条消息)74HC165级联电路篇(三)
74HC165其实和74HC595一样,也有级联功能,74HC595级联在前面已经整理过,这里说下74hc165的级联。
前面基础篇也讲到74HC165是个并行输入转串行输出的逻辑芯片,该芯片除了串行输出外还有一个串行输入引脚,74HC165的级联功能就使用到这个串行输入引脚,也就是引脚10(DS):
下面就讲下74HC165级联的原理:
从前面的两篇74HC165文章知道,74HC165并行转串行是通过移位寄存器实现的,当PL为低电平时,并行数据(8bit)进入移位寄存器,当PL为高时,进入移位寄存器的数据就从DS引脚进入寄存器,然后在每个时钟的上升沿往输出引脚Q7移一位。
根据这个原理,只要把输出Q7(引脚9)连到下一级74HC165的DS引脚(引脚10)即可实现级联功能,如下图:
最后再以图文并茂的方式总结下74HC165级联后的工作过程,如下图:
74HC165的级联电路就整理到这里,下一篇是级联的编程,总结下如何读取74HC165级联的数据。
5.3 74HC165输入扩展汇编、C 语言编程。
简介:首先shld 置低电平,延时大约1ms ,完成数据读取,然后拉高。
接着进入一个8次的循环,首先clk=0;读取so 的值,在clk=1;依次循环8次。
(首先读取的是高位,依次递减) 注意:本例采用的是显示哪个按键被按下,即将读取的状态赋值给P3口,再由P3口通过数码管显示!!!!(共阴极)(1)汇编:ORG 0000H//------主函数-------MAIN: CLR P2.1 //读入按键信号NOPNOPSETB P2.1CALL READ //读取第D7键值MOV P3.7,C//赋值显示CALL READ //读取第D6键值MOV P3.6,CCALL READ //读取第D5键值MOV P3.5,CCALL READ //读取第D4键值MOV P3.4,CCALL READ //读取第D3键值MOV P3.3,CCALL READ //读取第D2键值MOV P3.2,CCALL READ //读取第D1键值MOV P3.1,CCALL READ //读取第D0键值MOV P3.0,CSJMP MAIN //返回主函数//----读信号子函数------- READ:CLR P2.0MOV C,P2.2 //读取信号SETB P2.0RETEND(2)C语言#include<reg51.h>sbit shld=P2^1;sbit clk=P2^0;sbit so=P2^2;int n=0;//-------延时子程序------ void delay(int i){int j;while(i--)for(j=100;j>0;j--);}//-----读信号子程序------ void read()int i,m=0;shld=0;//低电平读入信号delay(10);//延时shld=1;//置高电平for(i=0;i<8;i++)//循环八次{clk=0; //拉低n=n<<1; //左环移n=n|so; //将位依次排列,组成16进制数clk=1; //拉高}//首先读最高位信号再一次往低}//-----主函数--------void main(){while(1){read();//读信号P3=n; //P3口赋值}}。
74HC165串口驱动程序//-------------------------------------库函数声明,管脚定义-------------#include <reg52.h>sbit LOAD=P1^7; //用P1^7控制SH/LD管脚//----------------------------------------------------------------------// 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//----------------------------------------------------------------------void UART_init(void){SCON =0x10; //没串行口方式0,允许接收,启动接收过程ES=0; // 禁止串口中断}//----------------------------------------------------------------------// 函数名称:PA()// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//----------------------------------------------------------------------unsigned char PA(void){unsigned char PA_data;LOAD=0; //当P1.7输出低电平,74LS165将并行数据置入寄存器中LOAD=1; //当P1.7输出高电平,74LS165将并行数据置入寄存器中UART_init(); //74LS165工作在时钟控制下的串行移位状态While(RI==0); //循环等待RI=0;PA_data=SBUF;return PA_data; //返回并行输入的数据}74HC164串口驱动程序//-----------------------------------库函数声明,管脚定义--------------#include <reg52.h>sbit CLR=P1^7; //用P1^7控制CLR//-----------------------------------------------------------------------// 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//-----------------------------------------------------------------------void UART_init(void) {SCON =0x00;//没串行口方式0,允许发送,启动发送过程ES=0;// 禁止串口中断}//-----------------------------------------------------------------------// 函数名称:PA_out() // 输入参数:PA_data,需要从74LS164并行口输出的数据// 输出参数:无// 功能说明:发送八位串行数据至并口//-----------------------------------------------------------------------void PA_out(unsigned char){CLR =0; //并口输出清零CLR =1; //开始串行移位UART_init(); //74LS165工作在时钟控制下的串行移位状态While(TI==0); //循环等待TI=0;SBUF=PA_data;}74HC165驱动程序/-------------------------------------库函数声明,管脚定义---------------#include <reg52.h>sbit a7=ACC^7;sbit simuseri_CLK=P1^6; //用P1^6模拟串口时钟sbit simuseri_DATA=P1^5; //用P1^5模拟串口数据//-----------------------------------------------------------------------// 函数名称:in_simuseri// 输入参数:无// 输出参数:data_buf// 功能说明:8位同步移位寄存器,将simuseri_DATA串行输入的数据按从低位到高位// 保存到data_buf//-----------------------------------------------------------------------char in_simuseri(void){char i;char data_buf;i=8;do{ACC=ACC>>1;for(;simuseri_CLK==0;) ;a7=simuseri_DATA;for(;simuseri_CLK==1;) ;}while(--i!=0);simuseri_CLK=0;data_buf=ACC;return(data_buf);}//-------------------------------------库函数声明,管脚定义--------------sbit drive74165_LD=P1^7;//用P1^7控制SH/LD管脚//-----------------------------------------------------------------------// 函数名称:PAs// 输入参数:无// 输出参数:PAs_buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//-----------------------------------------------------------------------char PAs(void){char PAs_buf;drive74165_LD =0; 并行置入数据drive74165_LD =1; 开始串行移位PAs_buf= in_simuseri();Return(PAs_buf);}74HC164驱动程序//-------------------------------------库函数声明,管脚定义--------------#include <reg52.h>sbit simuseri_CLK=P1^6; //用P1^6模拟串口时钟sbit simuseri_DATA=P1^5; //用P1^5模拟串口数据sbit drive74164_CLR=P1^7; //用P1^7控制CLRsbit a0=ACC^0;//-----------------------------------------------------------------------// 函数名称:out_simuseri// 输入参数:data_buf// 输出参数:无// 功能说明:8位同步移位寄存器,将data_buf的数据逐位输出到simuseri_DATA //-----------------------------------------------------------------------void out_simuseri(char data_buf){char i;i=8;ACC=data_buf;do{simuseri_CLK=0;simuseri_DATA=a0;simuseri_CLK=1;ACC=ACC>>1;}while(--i!=0);simuseri_CLK=0;}//-----------------------------------------------------------------------// 函数名称:PA_out// 输入参数:Pseri_out,需要输出的8位数据// 输出参数:无// 功能说明:将Pseri_out中的数据送到74165并行口A-G输出//-----------------------------------------------------------------------void PA_out (char Pseri_out ){drive74165_CLR =0; //并口输出清零drive74165_CLR =1; //开始串行移位out_simuseri(Pseri_out);}。
74HC165的联级编程实例三篇篇一:74HC165的联级编程实例#include<reg51.h>#include<intrins.h>sbitCLK=P2^5;//时钟sbitLD=P2^6;//移位,置位sbitSO=P2^7;//输出#defineLED1P0#defineLED2P1inthc165(){inti=0;chardat1=0,dat2=0;intdat=0;LD=0;//允许数据数据进入165 _nop_();LD=1;//for(i=0;i<8;i++){dat1<<=1;CLK=0;if(SO==1)dat1|=0x01; CLK=1;}for(i=0;i<8;i++){dat2<<=1;CLK=0;if(SO==1)dat2|=0x01; CLK=1;}LD=0;dat=dat1;dat<<=8;dat|=dat2;returndat;}voidmain(){while(1){LED1=(hc165()&0XFF);LED2=((hc165()>>8)&0XFF); }}篇二:74HC165联级编程实例#include<AT89X51.h>#define uchar unsigned char#define uint unsigned intsbit DS=P1^0 ; //595sbit SH=P1^1 ;sbit ST=P1^2 ;//sbit MR=P1^3;sbit CLK=P1^4;//165sbit INH=P1^5;sbit LD=P1^6;sbit SO=P1^7;//msec(511);0.5s//msec(2);2ms//msec(1021);//1svoid msec(unsigned long x) //延时 {unsigned char j;while(x!=0){x--;for(j=0;j<116;j++) {;}}}void hc595(uchar *p,n) {uchar i,j;for(;n>0;n--){i=*p;for(j=0;j<8;j++){DS=i&0x80;i=i<<1;SH=0;SH=1;}ST=0;ST=1;ST=0;p++;}}void hc165(uchar *d,n) {uchar i=0,j,c=0;LD=1;LD=0;LD=1;INH=0;for(j=0;j<(n*8);j++) {CLK=1;i=i<<1;i=i|SO;CLK=0;c++;if(c==8){*d=i;c=0;d++;}}}main(){uchar *P,*D;uchari,a[5]={0x00,0x00,0x00,0x00,0x01},b[5]={0x0ff,0x0ff,0x0ff,0x0ff,0x0f f}; P=a;D=b;hc595(P,5);hc165(D,5);P3=b[4];while(1);for(i=0;i<34;i++){if(i==8){a[3]=0x01; a[4]=0x00;}if(i==16){a[2]=0x01;a[3]=0x00;}if(i==24){a[1]=0x01;a[2]=0x00;}if(i==32){a[0]=0x01;a[1]=0x00;}P=a;hc595(P,5);a[0]<<=1;a[1]<<=1; a[2]<<=1; a[3]<<=1; a[4]<<=1; msec(511); }}篇三:74HC165联级编程实例74HC595 74HC165程序例子(AVR)硬件说明:ATmega48/88/168的PB5是SPI时钟输出,接74HC595/74HC165的移位时钟输入端;PB4是SPI的MISO数据输人,接74HC165的数据输出;PB3是SPI的MOSI数据输出,接74HC595的串行数据输入端SER;PB2接74HC595/74HC165的锁存时钟输入端。
74hc165编程说明接触单片机,嵌入式有好长一段时间了,一直想找个机会把自己总结的东西拿出来晒晒太阳(其实没有什么,高手可能早已经了解),在这里我只想分享给和我一样奋斗在单片机一线的广大童鞋么一点小小的甚至卑微的经验。
我们都知道通信从大的方面有两种:串行和并行。
串行的最大优点是占用总线少,但是传输速率低;并行恰恰相反,占用总线多,传输速率高。
市面上有很多这样的芯片,有串入并出的(通俗讲就是一个一个进,最后一块出来),有并入串出的(相对前者而言)。
具体用哪种类型要根据我们得实际情况。
比如利用单片机显示数码管单纯的显示一个数码管如果仅仅是为了显示那么动用单片机一个端口(如P0或P1/P2/P3)那没有什么,当然这里我说的数码管是8段的(如果利用BCD类型16进制数码管那么只需四个即可)就拿51类型的单片机来说,总共32个I/O口,一般如果不是做太大的工程是完全够用的,但有些时候你会恨单片机怎么不多长几条“腿”,怎么省还是不够用。
别急集成串行芯片来帮忙哈哈客套话就不多说了言归正传,今天我介绍一下几个在数码管显示或键盘处理中经常用到的移位寄存器芯片,首先登场的是74HC165:74HC165/74LS165是典型并入串出芯片,用它来读取外界键盘信息再好不过了,前提我们得了解它,我们先了解其引脚:引出端符号CLK,CLK INH 时钟输入端(上升沿有效)A-H 并行数据输入端SER 串行数据输入端QH 输出端QHn 互补输出端SH/LD 移位控制/置入控制(低电平有效)真值表时序图其实看一个芯片是如何使用的,不只是看引脚功能,更重要的是要看时序图和真值表,从其中我们可以详细的了解到它是如何使用的,然后转化成程序代码即可。
从上面我们的真值表和时序图中我们要特别注意几个端口的变化,真值表中SH/LD只有在高电平的时候方才有效;CLK,CLK INH只有当其中一个为低电平的时候,另一个时钟才能正确的输入,这是非常重要的(一般的我们在使用时,可以将其中的一个直接接地,另一个做时钟输入端口使用)。
一、概述串行通讯是单片机系统中常见的一种通讯方式,通过串行通讯可以实现单片机与外部设备之间的数据交换和控制。
74HC165是一种8位并行-串行转换芯片,可以扩展单片机的输入通道。
本文将介绍如何使用74HC165与单片机进行串行通讯,并给出相应的汇编题目作为示例。
二、单片机串行通讯介绍1. 串行通讯概念与原理2. 单片机串行通讯常用的通讯协议3. 串行通讯输入输出的基本操作指令三、74HC165介绍1. 74HC165的基本特性2. 74HC165的引脚功能与连接方式3. 74HC165与单片机的串行通讯原理四、单片机串行通讯接口设计1. 单片机与74HC165的硬件连接2. 单片机与74HC165的软件通讯流程设计五、汇编题目示例1. 题目一:使用74HC165实现8路数字输入,编写汇编程序读取并显示输入数据。
2. 题目二:使用74HC165实现8路数字输入,编写汇编程序进行数据滤波处理并输出。
六、实验验证与应用案例1. 实验一:基于本文所述的设计,实现单片机与74HC165的串行通讯,并进行数据收发测试。
2. 应用案例一:将本文介绍的串行通讯接口设计应用于智能家居系统,实现对物联网设备的控制与数据采集。
七、总结与展望1. 对本文所述内容进行总结2. 展望单片机串行通讯在未来的发展前景八、参考文献1. [参考文献1]2. [参考文献2]3. [参考文献3]以上是本文的大致内容框架,可以根据实际情况对每个部分进行详细论述,以达到文章长度超过3000字的要求。
该文章着重介绍了单片机串行通讯的基本原理,并给出了使用74HC165与单片机进行串行通讯的具体设计与实现方法,并通过汇编题目以及实验验证进行案例分析,希望对读者有所启发与帮助。
九、单片机串行通讯介绍1. 串行通讯概念与原理串行通讯是指在通讯过程中,数据一位一位地进行传输。
相比并行通讯,串行通讯需要较少的线路和引脚数目,可以降低硬件成本,因此在各种设备中得到广泛应用。
sn74hc165dr工作原理SN74HC165DR是一种串行输入、并行输出的移位寄存器,它具有广泛的应用领域。
本文将介绍SN74HC165DR的工作原理及其应用。
SN74HC165DR采用了串行-并行转换的方式,可以将串行输入的数据转换为并行输出。
它具有8个输入引脚(D0-D7)、1个时钟引脚(CLK)、1个使能引脚(OE)、1个清除引脚(CLR)和8个并行输出引脚(Q0-Q7)。
当使能引脚(OE)为低电平时,SN74HC165DR处于使能状态,可以正常工作。
当时钟引脚(CLK)上出现上升沿时,SN74HC165DR会将串行输入引脚(D0-D7)上的数据按照从低位到高位的顺序依次输入,并将其存储在内部的8位移位寄存器中。
移位寄存器可以看作是一个存储数据的缓存器,它的作用是将串行输入的数据进行存储和转换。
当时钟引脚上出现8个上升沿时,SN74HC165DR将通过并行输出引脚(Q0-Q7)将移位寄存器中的数据并行输出。
每个并行输出引脚对应一个位的数据,可以将其连接到其他器件或电路中进行进一步的处理。
在使用SN74HC165DR时,可以通过使能引脚(OE)控制使能状态,通过时钟引脚(CLK)控制数据输入和输出的时机,通过串行输入引脚(D0-D7)输入待转换的数据,通过并行输出引脚(Q0-Q7)输出转换后的数据。
SN74HC165DR的工作原理简单明了,它可以方便地将串行输入的数据转换为并行输出。
这种转换方式在许多应用场景中都非常有用。
例如,在数字电子系统中,可以使用SN74HC165DR将外部输入的数字信号转换为并行数据,然后再进行处理和分析。
在工业自动化控制系统中,可以使用SN74HC165DR将输入的开关信号转换为并行数据,以实现对设备的控制。
SN74HC165DR是一种功能强大的移位寄存器,它可以实现串行输入、并行输出的数据转换。
通过控制使能引脚和时钟引脚,可以灵活地控制数据的输入和输出时机。
74HC165中文资料数据手册参数一、74HC165简介1. 工作电压范围宽:2.0V至6.0V;2. 工作频率高:最高可达50MHz;3. 低功耗:静态功耗几乎为零;4. 输入输出兼容TTL电平;5. 封装形式多样:DIP、SOIC、TSSOP等。
二、74HC165参数1. 电源电压(VCC):2.0V至6.0V;2. 输入电压(VIN):0V至VCC;3. 输出电压(VOUT):0V至VCC;4. 工作温度范围:40℃至+125℃;5. 最大输入电流(II):±1μA;6. 最大输出电流(IO):±25mA;7. 最大功耗(PD):500mW(TA=25℃);8. 传输延迟时间(tpd):22ns(典型值,VCC=5V);9. 输入上升时间(tr):20ns(典型值,VCC=5V);10. 输入下降时间(tf):20ns(典型值,VCC=5V);11. 输出上升时间(tr):25ns(典型值,VCC=5V);12. 输出下降时间(tf):25ns(典型值,VCC=5V)。
三、74HC165引脚功能1. AH(输入端):8位并行数据输入端;2. SH/LD(移位/装载控制端):高电平时,数据从输入端AH并行装载到寄存器;低电平时,数据从输入端A串行移位进入寄存器;3. CLK(时钟输入端):上升沿触发,用于控制数据的移位和装载;4. SER(串行输入端):串行数据输入端,用于接收外部串行数据;5. QH'(串行输出端):串行数据输出端,输出最高位;6. GND(地):电源地;7. VCC(电源):正电源输入。
四、74HC165应用电路1. 数据串行化:将并行数据转换为串行数据,以便于通过单线或少量线进行传输。
2. 数据扩展:通过级联多个74HC165,实现数据位数的扩展,增加并行数据的宽度。
3. 数据缓冲:作为数据缓冲器,提高系统的驱动能力。
【电路图】将74HC165的AH端连接至并行数据源;SH/LD端接高电平,使能并行数据装载;CLK端接时钟信号,控制数据装载和移位;SER端接下一级74HC165的QH'端,实现级联;QH'端输出串行数据至下一级处理或传输。
实验十 74LS165并入串出移位实验一、实验概述通过AT89C52接收来自74LS165的串行数据,再用LED显示出。
二、实验目的掌握串口用于并行输入端口扩充的编程方法;理解74LS165的工作原理。
三、实验预习要求1、主要知识点概述:本实验用到了两个主要知识点是:74LS165的工作机制、简单的单片机串口输入。
2、实验结果说明:通过74LS165来读取8位键值并通过LED显示。
四、实验原理图:74LS165主要引脚介绍:SO:串行数据输出端QH:反相串行数据输出端D0~D7:并行数据输入端CLK:时钟输入端(需要接时钟源,51单片机串口工作在方式0时接TXD(P3.1口))INH:时钟禁止端(高电平有效,使用时设为低电平)SH/LD :移位与置位控制端SI:串行输入端(用于拓展多个74LS165)74LS165是八位并行输入、串行输出移位寄存器,74LS165芯片上电后,首先设置SH/LD端为低电平,此时芯片将D0~D7脚上的高低电平数据存入芯片内寄存器Q0~Q7,然后设置SH/LD端为高电平,此时芯片将寄存器内数据通过SO串行发送(QH也会发送反相数据)。
查阅74LS165的datasheet可以找到它的时序图和真值表。
图:74LS165时序图图:74LS165真值表上面的真值表和时序图中我们要特别注意几个端口的变化,真值表中SH/LD只有在高电平的时候方才有效;CLK、INH只有当其中一个为低电平的时候,另一个时钟才能正确的输入(一般的我们在使用时,可以将其中的一个直接接地,另一个做时钟输入端口使用)。
五、Proteus使用的元器件1.74LS165 //八位并行输入,串行输出移位寄存器。
2.AT89C52 //51单片机。
3.BUTTON //按键,用于最小系统复位。
4.CAP //电容,用于搭建复位电路。
5.CAP-ELEC //电解电容,用于搭建复位电路。
6.CRYSTAL //晶振,给单片机提供时钟信号。