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口赋值}}。
74HC165功能说明

74HC165功能说明
1.并行输入:74HC165具有8个并行输入引脚(A-H),可以同时读取8个输入信号。
这些输入信号可以是数字信号,也可以是模拟信号。
2.串行输出:74HC165具有串行输出引脚(QH),它可以将输入信号转换为串行输出信号。
输出信号的顺序与输入信号的读取顺序相同。
3.移位操作:74HC165可以通过移位操作来读取并且存储输入信号。
移位操作可以由一个时钟信号(SH/LD)和一个时钟使能信号(CLKINH)来控制。
当时钟使能信号为高电平时,移位操作生效;当时钟使能信号为低电平时,移位操作被禁止。
4.并行加载:除了移位操作之外,74HC165还可以通过并行加载操作来读取并存储输入信号。
并行加载操作可以通过时钟使能引脚(CLKINH)和并行加载引脚(PL)来控制。
当时钟使能引脚为高电平时,同时并行加载引脚为高电平,即可进行并行加载操作。
5.级联操作:多个74HC165芯片可以级联在一起,以扩展输入信号的数量。
级联操作可以通过级联引脚(SERA/B)和级联输出引脚(QH)来实现。
级联引脚可以将一个74HC165的输出连接到另一个74HC165的输入,以实现数据的串行传输。
总结起来,74HC165是一种用于将8个并行输入信号转换为串行输出信号的移位寄存器芯片。
它通过移位操作和并行加载操作来读取并存储输入信号,并且可以通过级联操作扩展输入信号的数量。
这种芯片在数字电路控制和数据采集等应用中非常常见,具有广泛的用途。
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。
74HC165连级使用方法及程序实例

uint8 LCD_DATA1[]= { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
void Init_INT(void); void Read_HC165(void); void main(void) { Init_INT(); LCD1602(); Init_Lcd(); while(1)
{ Read_HC165(); Display_LCD_Byte(0,0,'0'); Display_LCD_Byte(0,1,'x'); Display_LCD_Byte(0,2,LCD_DATA1[Address/16]); Display_LCD_Byte(0,3,LCD_DATA1[Address%16]);
////////////////////////////////////////////// //读取优先级和本机地址 //当执行本次程序时
//函数会将 165 的信号优先级 //以及本机的地址送到 Priority 和 Address ////////////////////////////////////////////// void Read_HC165(void) { uint8 i = 0; //临时变量 uint8 BJ_Address = 0; uint8 BJ_Priority = 0; HC165_CE = 0; //打开 165 选通端 HC165_PL = 0; //允许数据进入 165 for(i = 0;i<8;i++) //读 8 次数据
基于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的联级编程实例#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编程说明接触单片机,嵌入式有好长一段时间了,一直想找个机会把自己总结得东西拿出来晒晒太阳(其实没有什么,高手可能早已经了解),在这里我只想分享给与我一样奋斗在单片机一线得广大童鞋么一点小小得甚至卑微得经验.我们都知道通信从大得方面有两种:串行与并行。
串行得最大优点就是占用总线少,但就是传输速率低;并行恰恰相反,占用总线多,传输速率高.市面上有很多这样得芯片,有串入并出得(通俗讲就就是一个一个进,最后一块出来),有并入串出得(相对前者而言)。
具体用哪种类型要根据我们得实际情况。
比如利用单片机显示数码管单纯得显示一个数码管如果仅仅就是为了显示那么动用单片机一个端口(如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只有当其中一个为低电平得时候,另一个时钟才能正确得输入,这就是非常重要得(一般得我们在使用时,可以将其中得一个直接接地,另一个做时钟输入端口使用).但就是我们做事要细心,要一丝不苟,从时序图中我们瞧到SH/LD有一个负脉冲这就是什么缘故呢?在程序设计中如果忽略了此处,那么注定结果就是悲剧得。
74hc165三片级联

硬件原理图如下:
valet(CLK, HIGH); gpio_set(PL, HIGH); //根据硬件调整数据的位置 tmp = ((val & 0xff0000) >> 16) | (val & 0xff00) | ((val & 0xff) << 16);
return tmp; }
网络错误503请刷新页面重试持续报错请尝试更换浏览器或网络环境
74hc165三 片 级 联
3片74HC165进行级联,用于扩展IO口,读取外界设备的数据。
unsigned int read_74165(void) {
unsigned int val = 0; unsigned int count = 24; unsigned int i, tmp; //加载并行数据并锁存 gpio_set(PL, HIGH); delay(); gpio_set(PL, LOW); delay(); gpio_set(PL, HIGH); delay(); gpio_set(CLK, HIGH); delay();
//三片74hc165,需要读24次
//gpio引脚与芯片数据脚直接相连,所以第一次不需要时钟就能读取到第一位数据。 //下一个时钟将会得到第二位数据 if (data_get())
val += 1; //读取剩下的23位 for (i = 0; i < count - 1; i++) {
gpio_set(CLK, LOW); delay(); gpio_set(CLK, HIGH); delay(); val <<= 1; if (data_get())
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ 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; //优先级变量 ///////////////////////////////////////////////////////
74HC165 连级使用方法及程序实例
发布:2010-4-13 10:42 | 作者:pcb_dz | 来源:本站 | 查看:237 次 | 字号: 小 中 大 74HC165 是一种并入串出的芯片,我们可以用它来做按键检测。它可以外接 8 个接键,然后将数据转成串行的 送入单片机。如果用 74HC165 做键盘的话,能节省很多 IO 口。 LCD 程序是采用 wang1jin 带您从零学单片机里面的 1602 程序修改。 #include<AT89X52.H> #include"LCD.h" #define uint16 unsigned int #define uint8 unsigned char #define AUDIO_OUT P0 ///////////////////////////////////////////////////////
uint8 LCD_DATA1[]= { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
void Init_INT(void); void Read_HC165(void); void main(void) { Init_INT(); LCD1602(); Init_Lcd(); while(1)
Display_LCD_Byte(1,0,'0'); Display_LCD_Byte(1,1,'x'); Display_LCD_Byte(1,2,LCD_DATA1[Priority/16]); Display_LCD_Byte(1,3,LCD_DATA1[Priority%16]);
} } ////////////////////////////////////////////// //定时器初始化 ////////////////////////////////////////////// void Init_INT(void) { TMOD = 0x01; ET0 = 1; TR0 = 1; EA = 1; TH0 = 0xF8; TL0 = 0xC5; }
{ Read_HC165(); Display_LCD_Byte(0,0,'0'); Display_LCD_Byte(0,1,'x'); Display_LCD_Byte(0,2,LCD_DATA1[Address/16]); Display_LCD_Byte(0,3,LCD_DATA1[Address%16]);
{ BJ_Address|= 0x80>>i; } HC165_CLK = 1; } HC165_CE = 1; HC165_PL = 0; Address = BJ_Address; Priority = BJ_Priority; }
#ifndef _LCD_H_ #define _LCD_H_ #include<AT89X52.H> #define LCD_DATA P3 sbit RS = P1^5; sbit RW = P1^6; sbit EN = P1^7; void LCD1602(void); void Read_Busy(void); void Write_Lcd(unsigned char Value, bit i); void Init_Lcd(void); void Delay(unsigned int i); void Display_LCD_Byte(unsigned char y,unsigned char x,unsigned char Value); #endif #include "LCD.h" void LCD1602(void) { EN = 0;
} void Display_LCD_Byte(unsigned char y,unsigned char x,unsigned char Value) { y &= 0x01; //y 不能大于 1 x &= 0x0F; //x 不能大于 15 if(y) //是否显示在第二行;
{ x += 0x40; //显示在第二行,加 0X40; } x += 0x80; Write_Lcd(x,0); //写入显示的位置 Write_Lcd(Value,1); //写入显示数据 } void Delay(unsigned int i) { while(-- i); }
////////////////////////////////////////////// //读取优先级和本机地址 //当执行本次程序时
//函数会将 165 的信号优先级 //以及本机的地址送到 Priority 和 Address ////////////////////////////////////////////// void Read_HC165(void) { uint8 i = 0; //临时变量 uint8 BJ_Address = 0; uint8 BJ_Priority = 0; HC165_CE = 0; //打开 165 选通端 HC165_PL = 0; //允许数据进入 165 for(i = 0;i<8;i++) //读 8 次数据