74HC595使用SPI总线连接51单片机的驱动程序
- 格式:docx
- 大小:17.45 KB
- 文档页数:2
51单片机+74HC595驱动数码管程序这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595=P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}voidled_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。
74HC595芯片资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register。
#include<reg51.h〉#include <intrins.h〉#define uchar unsigned char#define uint unsigned intsbit stcp1=P2^2;sbit ds1=P2^1;sbit shcp1=P2^0;sbit stcp2=P2^5;sbit ds2=P2^4;sbit shcp2=P2^3;uchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管显示码uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};void delay(uint ms){uint x,y;for(x=ms;x>0;x--)for(y=255;y>0;y--);}void QR0_5951(uchar num1){uchar j;for (j=0;j<8;j++){num1=num1〈<1 ;ds1=CY;shcp1=1;//上升沿发生移位// shcp1=0;}}void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示{stcp1=0;stcp1=1;//上升沿将数据送到输出锁存器stcp1=0;}void QR1_5952(uchar num2){uchar j;for (j=0;j<8;j++){num2=num2〈〈1 ;ds2=CY;shcp2=1;//上升沿发生移位// shcp2=0;}}void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示{stcp2=0;stcp2=1;//上升沿将数据送到输出锁存器stcp2=0;}void main(){uchar i;while(1){for(i=0;i<2;i++){QR0_5951(DAT[0]);OUT_5951();QR1_5952(wei[i]);OUT_5952();delay(1);}}}描述595是告诉的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准.595是具有8位移位寄存器和一个存储器,三态输出功能。
SPI总线在51系列单片机系统中的实现(一)摘要:MCS51系列、MCS96系列等单片机由于都不带SPI串行总线接口而限制了其在SPI总线接口器件的使用。
文中介绍了SPI串行总线的特征和时序,并以串行E2PROM为例,给出了在51系列单片机上利用I/O口线实现SPI串行总线接口的方法和软件设计程序。
关键词:单片机SPI串行总线总线接口1引言SPI(SerialPeripheralInterface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。
外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。
SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。
由此可见,在MCS51系列等不具有SPI接口的单片机组成的智能仪器和工业测控系统中,当传输速度要求不是太高时,使用SPI总线可以增加应用系统接口器件的种类,提高应用系统的性能。
2SPI总线的组成利用SPI总线可在软件的控制下构成各种系统。
如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。
在大多数应用场合,可使用1个MCU作为控机来控制数据,并向1个或几个从外围器件传送该数据。
74HC595芯片资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register.描述595是告诉的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
参考数据CPD决定动态的能耗,PD=CPD×VCC×f1+∑(CL×VCC2×f0)F1=输入频率,CL=输出电容f0=输出频率(MHz)Vcc=电源电压功能表H=高电平状态L=低电平状态↑=上升沿↓=下降沿Z=高阻NC=无变化×=无效当MR为高电平,OE为低电平时,数据在SHCP上升沿进入移位寄存器,在STCP上升沿输出到并行端口。
/***************************************************************************************/ 给个74HC595的"慢动作"void WriteSIOByte(unsigned char val){unsigned char i;ACC = val;for (i = 8; i > 0; i --) {SRCLK = 0;//拉低74HC595时钟_rrca_();//右移一位数据SER = CY;//发送74HC595一位串行数据SRCLK = 1;//拉高74HC595时钟_nop_();//延时}SER = 1;//释放数据总线//以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令RCLK = 0;_nop_();//延时RCLK = 1;//打入并行数据}74ls595"速射"hotpowerfor(i = 0; i < buffsize; i ++){SBUF = siobuff[i];while(TI == 0);TI = 0;}RCLK = 0;_nop_();//延时RCLK = 1;//打入并行数据/************************************************************************/摘要:本文介绍了应用移位寄存器芯片74HC595实现LED动、静态显示的基本原理。
74HC595芯片资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register.#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit stcp1=P2^2;sbit ds1=P2^1;sbit shcp1=P2^0;sbit stcp2=P2^5;sbit ds2=P2^4;sbit shcp2=P2^3;uchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管显示码uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; void delay(uint ms){uint x,y;for(x=ms;x>0;x--)for(y=255;y>0;y--);}void QR0_5951(uchar num1){uchar j;for (j=0;j<8;j++){num1=num1<<1 ;ds1=CY;shcp1=1;//上升沿发生移位// shcp1=0;}}void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示{stcp1=0;stcp1=1;//上升沿将数据送到输出锁存器stcp1=0;}void QR1_5952(uchar num2){uchar j;for (j=0;j<8;j++){num2=num2<<1 ;ds2=CY;shcp2=1;//上升沿发生移位// shcp2=0;}}void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示{stcp2=0;stcp2=1;//上升沿将数据送到输出锁存器stcp2=0;}void main(){uchar i;while(1){for(i=0;i<2;i++){QR0_5951(DA T[0]);OUT_5951();QR1_5952(wei[i]);OUT_5952();delay(1);}}}描述595是高速的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
51单片机控制74HC595驱动的编程要点51单片机编程要点51单片机控制74HC595驱动的编程要点:74595外形图______QB--|1 16|--VccQC--|2 15|--QAQD--|3 14|--SIQE--|4 13|--/GQF--|5 12|--RCKQG--|6 11|--SCKQH--|7 10|--/SCLRGND-|8 9|--QH'|_____|74595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。
我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:/SCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注1)74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
2)74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
3)595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。
2008-07-27 | 74HC595中文资料标签:移位寄存器stcp输出上升沿寄存器________QB--|1 16|--VccQC--|2 15|--QAQD--|3 14|--SIQE--|4 13|--/GQF--|5 12|--RCKQG--|6 11|--SCKQH--|7 10|--/SCLRGND- |8 9|--QH'|________|74595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。
我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:/SCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
74HC595芯片做51单片机IO扩展PROTEUS仿真最近有个小活需要用到IO扩展,经搜索资料,有很多方式,比如MCP23017/MCP23S17、74HC595、8255A、74HC164、74HC138等,经对比我选择74HC595,MCP23017/MCP23S17相对功能更好些,可以做输入输出使用,74HC595只能用作输出,8255A采用并行口扩展,74HC164的缺点是没有输出寄存器,移位过程中输出端数据不稳定,且没有串行输出接口。
一、74HC595芯片介绍595移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
芯片引脚定义图:/MR(10脚): 低电平时将移位寄存器的数据清零。
通常接到VCC防止数据清零。
SH_CP(11脚):上升沿时数据寄存器的数据移位。
Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/OE(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
二、PROTEUS仿真按下图在PROTEUS中做好连线Keil下编写C51程序如下:#include<reg52.h>typedef unsigned char uint8_t;typedef unsigned short int uint16_t;typedef unsigned int uint32_t;sbit ST_CP = P2^7; //输出时钟sbit DS = P2^6; //串行数据输入sbit SH_CP = P2^5; //输入时钟uint16_tled_buff[]={0xfffe,0xfffd,0xffb,0xfff7,0xffef,0xffdf,0xffbf, 0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};void send_byte16(uint16_t byte16)//发送16位数据{uint8_t i=0;for(i=0;i<16;i++){if((byte16<<i)&0x8000){DS = 1;SH_CP = 0;SH_CP = 1;}else{DS = 0;SH_CP = 0;SH_CP = 1;}}ST_CP = 0;ST_CP = 1;}/*** @brief :1MS延时函数* @note :12MHz 下1MS延时 */static void drv_delay_1ms( ) {uint16_t Ms = 1;uint32_t j = 80;while( Ms-- ){while( j-- );}}/*** @brief :MS延时函数* @Ms:延时的MS数*/void drv_delay_ms( uint16_t Ms ) {while( Ms-- ){drv_delay_1ms( );}}void main(){uint8_t i=0;while(1){for(i=0;i<16;i++){send_byte16(led_buff[i]);drv_delay_ms(1000);send_byte16(0xffff);drv_delay_ms(1000);}}}程序思路:循环16次,在每次时钟ST_CP的上升沿循环串行写入数据到内部寄存器,最后在SH_CP上升沿将寄存器数据并行输出。