74HC595芯片组成测试工具_流水灯PCB布局部分芯片手册说明芯片工作原理74HC595级联说明电路原理图部分代码部分595驱动核心部分全部代码使用环境是由于我公司生产的运动控制卡需要连接光电传感器PCBA出来后需要检测运动控制卡内部是由光电隔离再连接到单片机。如此需要检测电路板电路是否有无虚焊器件是否能正常工作。如果点击I/O 口就很费时间。由此就需要借助外部的测试工具快速检测。(运动控制卡光耦发光二极管端接地即可点亮)运动控制卡大概的连接关系PCB布局部分正面背面芯片手册说明灯分为三组。每一个通道使用两个595芯片运行状态是每一个通道同时亮起OUT1。按顺序逐个点亮直到OUT16结束再以OUT1开始如此的循环周而复始。旁边的接口可连接被测件。即可检测器件的好坏。芯片介绍74HC595A 是一款高速 CMOS 8 位串行移位寄存器带有存储寄存器和低电平及高阻输出。移位寄存器和存储寄存器分别采用单独的时钟。在 SCK 的上升沿数据发生移位而在 RCK 的高电平时间内数据从每个寄存器中传送到存储寄存器。移位寄存器带有一个串行输入SER端和一个串行标准输出Q7’端用于级联。74HC595A 存储寄存器带有 8 个总线驱动输出数据输出方式为低电平及高阻态。芯片工作原理由14口接单片机输入信号如00010001之后信号存入移位寄存器再通过时钟转换到锁存器中运行最终通过Q0 ~ Q700010001八个引脚进行输出第一步目的将要准备输入的位数据移入74HC595数据输入端上。 方法送位数据到_595。第二步目的将位数据逐位移入74HC595即数据串入方法SH_CP产生一上升沿将DS上的数据移入74HC595移位寄存器中先送低位后送高位。第三步目的并行输出数据。即数据并出 方法ST_CP产生一上升沿将由DS上已移入数据寄存器中的数据 送入到输出锁存器。74HC595级联说明QH’: 级联输出端。将它接下一个74HC595芯片的DS引脚。SER: 串行数据输入端,级联的话接上一级的Q7’。电路原理图部分代码部分595驱动核心部分/************************************** 函数名74HC595函数初始化 调用SerialSend; 参数传递8进制数据 返回值无 结果 备注 ***************************************/staticvoidSerialSend(unsignedcharch)//--- 串并转换函数 ---{unsignedchari;for(i8;i0;i--){if(0(ch(17)))DAT0;//--- 高位为0则输出0 ---elseDAT1;//--- 否则输出1 ---CLK1;//--- 产生一个时钟 ---_nop_();CLK0;_nop_();ch1;//--- 左移1位 ---}}staticvoidHC595_CS(void){/** 步骤3STCP产生一个上升沿移位寄存器的数据移入存储寄存器 **/LCK0;// 将STCP拉低_nop_();// _nop_(); // 适当延时LCK1;// 再将STCP拉高STCP即可产生一个上升沿// _nop_();_nop_();}staticvoidHC595_Send_Multi_Byte(u8*dat,u16 len){u8 i;for(i0;ilen;i)// len 个字节{SerialSend(dat[i]);}HC595_CS();//先把所有字节发送完再使能输出}全部代码#includereg52.h#includeintrins.h//#define unsigned char u16;//#define unsigned int u8;#defineMAIN_Fosc11059200L//定义主时钟//LED指示灯sbit LEDP3^6;/********************** 595芯片引脚别名定义 ***********************/sbit DATP1^0;sbit CLKP1^3;sbit LCKP1^2;sbit SRCLRP1^1;sbit KEYP5^4;//用户按键RES用IO口P54u8 pos;// led位置u8 Led_Pos_Buf[6]{0x00,0x00,0x00,0x00,0x00,0x00};//存储要发送的指令字节u8 LED_G;//按钮按下切换状态//第pos个led亮 1 2 3 4 5 6 7 8//u8 Led[32] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, //控制第二级74HC595// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //第一级的led全灭// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //第二级的led全灭// 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};//控制第一级74HC595//u8 Led[16] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000};//控制第一级74HC595//u8 Led[8] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};//控制第一级74HC595//u8 Led[16] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//控制第一级74HC595u8 Led[16]{0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//控制第一级74HC595/************************************** 函数名74HC595函数初始化 调用SerialSend; 参数传递8进制数据 返回值无 结果 备注 ***************************************/staticvoidSerialSend(unsignedcharch)//--- 串并转换函数 ---{unsignedchari;for(i8;i0;i--){if(0(ch(17)))DAT0;//--- 高位为0则输出0 ---elseDAT1;//--- 否则输出1 ---CLK1;//--- 产生一个时钟 ---_nop_();CLK0;_nop_();ch1;//--- 左移1位 ---}}staticvoidHC595_CS(void){/** 步骤3STCP产生一个上升沿移位寄存器的数据移入存储寄存器 **/LCK0;// 将STCP拉低_nop_();// _nop_(); // 适当延时LCK1;// 再将STCP拉高STCP即可产生一个上升沿// _nop_();_nop_();}staticvoidHC595_Send_Multi_Byte(u8*dat,u16 len){u8 i;for(i0;ilen;i)// len 个字节{SerialSend(dat[i]);}HC595_CS();//先把所有字节发送完再使能输出}staticvoidDelay1000ms()//11.0592MHz{unsignedchari,j,k;_nop_();_nop_();i43;j6;k203;do{do{while(--k);}while(--j);}while(--i);}staticvoiddelay_ms(unsignedcharms){unsignedinti;do{iMAIN_Fosc/13000;while(--i);//14T per loop}while(--ms);}voidKEY_Scan(void){if(KEY0){delay_ms(10);if(KEY0)//按键按下{while(KEY0);//等待按键释放LED_G1;//熄灭绿色指示灯}}}voidmain(){P0M10x00;P0M00xFF;//设置P0.5~P0.7为准双向口P1M10x00;P1M00xFF;//设置P0.5~P0.7为准双向口P5M00x10;P5M10x10;SRCLR1;LED_G0;Led_Pos_Buf[5]0x00;//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]Led_Pos_Buf[4]0x00;//存放第二级74HC595的数据Led_Pos_Buf[3]0x00;//存放第二级74HC595的数据Led_Pos_Buf[2]0x00;//存放第二级74HC595的数据Led_Pos_Buf[1]0x00;//存放第二级74HC595的数据Led_Pos_Buf[0]0x00;//存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595Delay1000ms;Delay1000ms;Delay1000ms;Delay1000ms;Led_Pos_Buf[5]0xFF;//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]delay_ms(500);Led_Pos_Buf[4]0xFF;//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[3]0xFF;//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[2]0xFF;//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[1]0xFF;//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[0]0xFF;//存放第二级74HC595的数据delay_ms(500);HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595Delay1000ms;Delay1000ms;Delay1000ms;Delay1000ms;Led_Pos_Buf[5]0x00;//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]Led_Pos_Buf[4]0x00;//存放第二级74HC595的数据Led_Pos_Buf[3]0x00;//存放第二级74HC595的数据Led_Pos_Buf[2]0x00;//存放第二级74HC595的数据Led_Pos_Buf[1]0x00;//存放第二级74HC595的数据Led_Pos_Buf[0]0x00;//存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595Delay1000ms;Delay1000ms;Delay1000ms;Delay1000ms;while(1){KEY_Scan();if(LED_G0){for(pos0;pos8;pos)//第pos个灯实现流水灯效果{delay_ms(500);Led_Pos_Buf[5]Led[pos];//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]delay_ms(500);Led_Pos_Buf[4]Led[pos8];//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[3]Led[pos];//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[2]Led[pos8];//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[1]Led[pos];//存放第二级74HC595的数据Led_Pos_Buf[0]Led[pos8];//存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595}for(pos0;pos8;pos)//第pos个灯实现流水灯效果{delay_ms(500);Led_Pos_Buf[5]Led[pos8];//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]delay_ms(500);Led_Pos_Buf[4]Led[pos];//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[3]Led[pos8];//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[2]Led[pos];//存放第二级74HC595的数据delay_ms(500);Led_Pos_Buf[1]Led[pos8];//存放第二级74HC595的数据Led_Pos_Buf[0]Led[pos];//存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595}}else{for(pos0;pos8;pos)//第pos个灯实现流水灯效果{delay_ms(500);Led_Pos_Buf[5]Led[pos];//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]Led_Pos_Buf[4]Led[pos8];//存放第二级74HC595的数据Led_Pos_Buf[3]Led[pos];//存放第二级74HC595的数据Led_Pos_Buf[2]Led[pos8];//存放第二级74HC595的数据Led_Pos_Buf[1]Led[pos];//存放第二级74HC595的数据Led_Pos_Buf[0]Led[pos8];//存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595}for(pos0;pos8;pos)//第pos个灯实现流水灯效果{delay_ms(500);Led_Pos_Buf[5]Led[pos8];//存放第一级74HC595数据因为先进先出所以第一级放在Led_Pos_Buf[1]而不是Led_Pos_Buf[0]Led_Pos_Buf[4]Led[pos];//存放第二级74HC595的数据Led_Pos_Buf[3]Led[pos8];//存放第二级74HC595的数据Led_Pos_Buf[2]Led[pos];//存放第二级74HC595的数据Led_Pos_Buf[1]Led[pos8];//存放第二级74HC595的数据Led_Pos_Buf[0]Led[pos];//存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,6);//将当前数据发送到595}}}}