74HC165的联级编程实例

合集下载

74HC165 概述

74HC165 概述

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编程

74HC165编程

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流水灯的控制。

164和165的使用

164和165的使用

浅谈单片机系统中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并入串出实验

74LS165并入串出实验

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。

基于51单片机之74HC165实验例程

基于51单片机之74HC165实验例程

************************** 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的联级编程实例三篇

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连级使用方法及程序实例

74HC165连级使用方法及程序实例
参考链接:/read.asp?id=1224
{ HC165_PL = 1; //允许数据移位 HC165_CLK = 0; //低电平时读取数据 if(HC165_IN) //数据高位在前 { BJ_Priority |= 0x80>>i; } HC165_CLK = 1; //数据移位
}
for(i = 0;i<8;i++) //读取下一个 165 的数据 { HC165_CLK = 0; if(HC16LCD_DATA = 0xFF; } void Read_Busy(void) { LCD_DATA = 0xFF; RS = 0; RW = 1; EN = 1; //while(LCD_DATA & 0x80); Delay(100); EN = 0; } void Write_Lcd(unsigned char Value, bit i) //i = 0 写指令.i = 1 写数据; { Read_Busy(); LCD_DATA = Value; RS = i; RW = 0; EN = 1; EN = 0; } void Init_Lcd(void) { Delay(15000); Write_Lcd(0x38,0); Delay(5000); Write_Lcd(0x38,0); Delay(5000); Write_Lcd(0x38,0); Write_Lcd(0x08,0); Write_Lcd(0x01,0); Write_Lcd(0x06,0); Write_Lcd(0x0c,0);
sbit HC165_CE = P1^1; //HC165 控制端 L 有效 sbit HC165_PL = P1^2; //HC165 锁存引脚 H 高效 sbit HC165_CLK = P1^0; //HC165 时钟引脚 sbit HC165_IN = P1^3; //HC165 数据输出引脚 uint8 Address = 0; //本地地址变量 uint8 Priority = 0; //优先级变量 ///////////////////////////////////////////////////////
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档