关于单片机的一些小实验_04利用IO口线模拟同步串口驱动74HC595控制八个LED灯花样显示
- 格式:docx
- 大小:14.63 KB
- 文档页数:5
一不用单片机串口电路原理图:C程序:#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit QS=P2^0; // 串行数据输入端sbit shuchu=P2^1; // 存储寄存器脉冲输入sbit yiwei=P2^2; // 移位寄存器脉冲输入sbit Q1=P2^3; //38译码器输入选择sbit Q2=P2^4;sbit Q3=P2^5;uchar shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void wei(uchar z) //数码管位选择{Q1=z&0x01;Q2=(z>>1)&0x01;Q3=(z>>2)&0x01;}void display(){uchar i,j,temp;for(i=0;i<8;i++){wei(i);temp=shuma[i];for(j=0;j<8;j++){QS=temp&0x80;yiwei=0;yiwei=1;temp=temp<<1;}shuchu=0;shuchu=1;delay(2);for(j=0;j<8;j++) //消影{QS=1;yiwei=0;yiwei=1;}}}void main(){while(1){display();}}二用单片机串口(P3^0和P3^1)电路原理图:C程序:#include<REG51.H>#define uint unsigned int#define uchar unsigned char//sbit QS=P3^0; // 串行数据输入端sbit shuchu=P3^2; // 存储寄存器脉冲输入//sbit yiwei=P3^1; // 移位寄存器脉冲输入sbit Q1=P3^3; //38译码器输入选择sbit Q2=P3^4;sbit Q3=P3^5;uchar shuma[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*由于串口发送是由低向高发送,所以得把数码从高低位调换如‘0’码为0xco 11000000换为00000011 0x03*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void wei(uchar z) //数码管位选择{Q1=z&0x01;Q2=(z>>1)&0x01;Q3=(z>>2)&0x01;}void display(){uchar i;for(i=0;i<8;i++){wei(i); //选择数码管位SBUF=shuma[i]; //向串口缓冲寄存器中存入数据while(!TI); //等待发送完成TI=0; //清楚发送完成标志shuchu=0; //输出shuchu=1;delay(2);SBUF=0xff; //消影while(!TI);TI=0;}}void main(){/*单片机上电后默认为串口方式0,所以不需要设置串口模式*/ // EA=1; //开总中断// ES=1; //开串口中断// IE=0x90;/*SM0=0; //选择串行工作模式0SM1=0;*/// TCON=0x00;// TI=0;while(1){display();}}。
基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例标签: proteus单片机实例芯片应用2010-02-24 00:331、本例中利用一片595控制一个数码管显示。
实现了利用3个IO口控制8位数据的输出2、74HC595的控制端口:1)SH_CP(11脚):移位时钟脉冲输入端。
在上升沿时移位寄存器将数据移位2)DS(14脚):串行数据输入端。
本例通过移位运算将每次移位的数据送到PWD寄存器的进位标志位CY,CY再将值传递给DS引脚,8次移位后完成一个字符的串行传送。
3)ST_CP(12脚):锁存脉冲控制端,在上升沿时移位寄存器的数据被传入存储寄存器,这时如果OE端为低电平,传入存储器的数据会直接输出到输出端Q0-Q7。
本例在一个字节的移位操作完成后,通过在ST_CP端产生一个上升沿将数据送出。
4)/MR(10脚):低电平时将移位寄存器数据请0.一般情况下接VCC5)/OE(13脚):高电平时输出端禁止输出(高阻态)。
低电平时允许数据输出使用74HC595的优点是能锁存数据,这样在移位过程中可以保持输出端的数据不变。
而74HC164则没有这种功能。
//利用74HC595实现端口扩展#include <reg51.h> // 寄存器头文件包含#include <intrins.h> // 空操作函数,移位函数头文件包含sbit SH_CP = P2^0; //移位时钟脉冲端口sbit DS = P2^1; // 串行数据输入端口sbit ST_CP = P2^2; //锁存端口unsigned char temp;unsigned char code disp_buff[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码表//延时函数void delayms(unsigned int x){unsigned char i;while(x--){for(i = 0;i < 120;i++);}}//串行输入函数void input_595(void){unsigned char i;for(i = 0;i < 8;i++){temp <<= 1; // 数据移位DS = CY; //产生一个时钟上升沿,使数据移位SH_CP = 1; //_nop_();_nop_();SH_CP = 0;}}//数据并行输出函数void output_595(void){ST_CP = 0; // 锁存器端口产生一个上升沿,将数据输出_nop_();ST_CP = 1;_nop_();ST_CP = 0; //锁存数据}//void main(void){unsigned char i;while(1){for(i = 0;i < 10;i++){temp = disp_buff[i]; //数码管显示input_595(); //将一个字节的数据串行输入595output_595(); //595移位寄存器数据传输到存储寄存器,并输出到数据端口 delayms(500);}}}3、在keil c51中新建工程ex63,编写如下程序代码,编译并生成ex63.hex文件4、在proteus中新建仿真文件ex63.dsn,电路原理图如下所示5、将ex63.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。
2020年第4期信息与电脑China Computer & Communication软件开发与应用74HC595芯片对单片机IO 口的扩展原理与应用杨恒敏(江苏联合职业技术学院扬州分院,江苏 扬州 225003)摘 要:单片机在使用过程中存在IO 端口有限的性能缺陷,笔者针对利用74HC595芯片扩展单片机IO 口的基本原理进行了详细分析,围绕流水灯效果、电子游戏扑克机、16×32LED 点阵显示器3个层面,探讨了单片机IO 口扩展的具体设计方案与实现路径,以期为顺利解决单片机IO 口紧缺问题提供借鉴。
关键词:74HC595芯片;单片机;IO 口扩展中图分类号:TP368.1 文献标识码:A 文章编号:1003-9767(2020)04-120-03Expanding Principle and Application of 74HC595 Chip to IO Port of SingleChip MicrocomputerYang Hengmin(Yangzhou Branch of Jiangsu Union Technical Institute, Yangzhou Jiangsu 225003, China)Abstract: There are limited performance defects of IO ports in the use of single-chip microcomputers. This article analyzesthe basic principles of using 74HC595 chip to expand the single-chip IO ports. At the level, the specific design scheme and implementation path of the expansion of the IO port of the single-chip microcomputer are discussed, in order to provide a reference for the smooth solution of the shortage of the IO port of the single-chip microcomputer.Key words: 74HC595 chip; single chip microcomputer; IO port expansion0 引言当前在使用单片机的过程中常面临IO 端口紧缺的问题,74HC595芯片作为一种通用位移缓存器,可实现8位串行输入/输出或并行输出,其电路连接方式与代码编程较为简单、驱动能力较强,并且凭借存储寄存器可保障在移位过程中并排输出端口数据不变,易于实现对单片机IO 口的扩展,具备良好的应用价值。
最详细的74HC595芯片使用方法介绍2010-01-17 00:07:05 来源: 电子工程师论坛Arduino采用的ATmega168芯片带12个数字I/O管脚,其中每个都可以对一个数字量进行控制,从而实现类似于点亮一个发光二极管这样的功能。
在实际的工程应用里,有时我们可能会遇到需要对更多的数字量进行控制的场合,比如同时控制16个发光二极管,这时Arduino自带的数字I/O管脚就不够用了,必须进行相应的扩展。
其中一种可行的办法就是借助74HC595这样一个8位串入并出移位寄存器,这个芯片能够多个级连起来一起使用,因此理论上能够通过Arduino上有限的几个管脚(最少三个)产生任意多个的数字输出。
74HC595同数据相关的引脚可以分为三类:DS:串行数据输入,接Arduino的某个数字I/O引脚。
Q0~Q7:8位并行数据输出,可以直接控制8个LED,或者是七段数码管的8个引脚。
Q7′:级联输出端,与下一个74HC595的DS相连,实现多个芯片之间的级联。
74HC595同控制相关的引脚一共有四个:SH_CP:移位寄存器的时钟输入。
上升沿时移位寄存器中的数据依次移动一位,即Q0中的数据移到Q1中,Q1中的数据移到Q2中,依次类推;下降沿时移位寄存器中的数据保持不变。
ST_CP:存储寄存器的时钟输入。
上升沿时移位寄存器中的数据进入存储寄存器,下降沿时存储寄存器中的数据保持不变。
应用时通常将ST_CP置为低点平,移位结束后再在ST_CP端产生一个正脉冲更新显示数据。
MR:重置(RESET),低电平时将移位寄存器中的数据清零,应用时通常将它直接连高电平(VCC)。
OE:输出允许,高电平时禁止输出(高阻态)。
引脚不紧张的情况下可以用Arduino的一个引脚来控制它,这样可以很方便地产生闪烁和熄灭的效果。
实际应用时可以将它直接连低电平(GND)。
对于一个最简单的74HC595应用来讲,可以用Arduino的三个数字I/O端口分别控制DS、SH_CP和ST_CP,然后将MR和OE分别接VCC和地。
74hc595的用法-回复74HC595是一种串行输入/并行输出的8位移位寄存器,被广泛应用于数字电路和嵌入式系统设计中。
它是通过串行数据输入的方式将数据存储在内部的8位移位寄存器中,并且可以通过并行输出的方式将数据输出到8个输出引脚上。
本文将一步一步回答有关74HC595的用法。
第一步:了解74HC595的引脚功能74HC595一共有16个引脚,每个引脚都有特定的功能。
以下是74HC595引脚的功能解释:- SER(Serial Data Input):串行数据输入引脚,用于输入要存储的数据。
- SRCLK(Shift Register Clock Input):移位寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将串行输入的数据存储到移位寄存器中。
- RCLK(Register Clock Input):寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将移位寄存器中的数据并行输出到输出引脚上。
- OE(Output Enable):输出使能引脚,通过控制该引脚的高低电平,可以使输出引脚处于高阻态或工作态。
- STCP(Storage Register Clock Input):存储寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将移位寄存器中的数据存储到存储寄存器中。
- SHCP(Shift Register Clock Input):移位寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将存储寄存器中的数据并行输出到输出引脚上。
- Q0-Q7(Parallel Data Outputs):并行数据输出引脚,通过并行方式输出存储在移位寄存器中的数据。
第二步:连接74HC595到微控制器为了正确使用74HC595,需要将其连接到微控制器或其他数字电路中。
以下是连接74HC595到微控制器的步骤:1. 将74HC595的VCC引脚连接到微控制器的电源引脚,并确保电压匹配(一般为5V)。
2. 将74HC595的GND引脚连接到微控制器的地引脚。
单⽚机驱动数码管设计详解(⽤74HC595实现)简单设计了⼀个单⽚机驱动数码管的电路,该设计中只使⽤了4位数码管,占⽤了单⽚机3个IO⼝,如果驱动芯⽚全⽤满可以驱动8位数码管。
仅供初学者分享学习。
1. 数码管显⽰设计本设计使⽤了⼀个4位的数码管,为共阳型,为了节省单⽚机的IO⼝,使⽤了两⽚74HC595作为数码管的驱动芯⽚,共占⽤3个IO⼝。
74HC595部分电路图如下:与单⽚机相连接的三个脚分别为:HC_DAT,HC_RCK,HC_CLK。
两⽚595采⽤级联⽅式,即U2的第9脚接到U3的第14引脚。
2. 74HC595简介74HC595是8位的移位寄存器,串⼊并出,并具有锁存功能,被⼴泛的⽤于数码管、点阵的驱动电路中。
其管脚介绍如下:15:数据输出A-接数码管数据A段;1:数据输出B-接数码管数据B段;2:数据输出C-接数码管数据C段;3:数据输出D-接数码管数据D段;4:数据输出E-接数码管数据E段;5:数据输出F-接数码管数据F段;6:数据输出G-接数码管数据G段;7:数据输出H-接数码管数据H段;16:电源正脚-接电源正;8:电源负脚-接电源负;14:数据输⼊脚-接单⽚机管脚;12:数据锁存时钟-接单⽚机管脚;11:数据输⼊时钟-接单⽚机管脚;13:使能输出脚-低电平有效,接低电平;10:数据清零-不清零,接⾼电平;9:数据级联输出-接下⼀⽚595的数据输⼊脚;74HC595的真值表如下:知道了74HC595的引脚定义和真值表,那该如何编程呢?下⾯重点来了,通过时序图来编程。
看重点!!!3. 74HC595时序图我是重点!我是重点!我是重点!通过时序可以看出:1. SCK是上升沿的时候要把数据写⼊;2. RCK是上升沿的时候数据才能锁存显⽰;3. 有数据操作的过程中RESET必须是⾼电平;4. EN必须是低电平,595才能⼯作;知道了以上4点就可以写程序了。
其中3、4条是硬件连接上的事情(也可以⽤单⽚机的IO⼝来连接,这样的话可以随时控制74HC595的⼯作与否情况)。
74HC595 芯片的应用实例
在学习51 单片机控制LED 点阵的时候碰到74HC595 芯片,大学学的数电知识忘了差不多了,就在网上搜了一些资料,看到这篇写的不错,把大部分文章转过来,最后面是我的开发板里的程序资料。
下面是正文:
这个夏季学习semiok 同学自己动手焊接了一个LED 显示屏,MCU 用的是ATmega16,实现字幕的滚动显示,由于成本问题,只做了16*64 大小的,也就只能显示4 个中文汉字,这是研究显示驱动的时候找到的关于74HC595 的资料,有时间就把所有制作过程放上来。
正面样子还行
背面惨不忍睹
74HC595 同数据相关的引脚可以分为三类:
SDI:串行数据输入,接单片机的某个I/O 引脚。
Q0~Q7:8 位并行数据输出,可以直接控制8 个LED,或者是七段数码管。
74hc595驱动led点阵原理及74HC595在8x8LED点阵中的应用74HC595工作原理只有1个移位寄存器,但有1+8个,共9个锁存器。
其中第1个锁存器可以理解为中转前置锁存器,它并没有连接Q0-Q7,后面8个锁存器连接了Q0-Q7。
当第1次SCK和LCK时,移位寄存器中=第1位数据,前置锁存器=第1位数据。
但是并没有进入到Q0-Q7所对应的锁存器当中去。
Q0到Q7=NON。
当第2次SCK和LCK时,移位寄存器中=第2位数据,前置锁存器=第2位数据。
同时前置锁存器把之前的第1位数据才更新到Q0对应的锁存器当中去。
此时Q0=第1位。
Q1到Q7=NON。
当第3次SCK和LCK时,移位寄存器中=第3位数据,前置锁存器=第3位数据。
同时前置锁存器把之前的第2位数据才更新到Q0对应的锁存器当中去,Q0把之前的第1位数据给Q1,此时Q0=第2位。
Q1=第1位。
Q2到Q7=NON。
当循环8次后(给出8个SCK和8个LCK后),移位寄存器中=第8位数据,前置锁存器=第8位数据。
但Q0-Q6里分别对应第7位-第1位数据,第8位数据并没有更新到Q0,同时Q7=NON。
这就是为什么给出循环8次的程序,总是不能显示第8位数据的原因。
因此要全部显示8位,需要再多给一次SCK和LCK。
那么问题来了,最后给这次SCK和LCK,全部显示8位了。
但是:移位寄存器和前置锁存器中又锁定了8位之外的第9位无用数据。
那么我们就可以用到SCLR(10脚)了。
给SCLR一个下降沿就可以了。
这个下降沿同时清空移位寄存器和前置锁存器。
但并不立即生效!只有产生下一个SCK时,才生效。
所以,SCLR时,前置锁存器和Q0-Q7锁存器依然锁定的是原来的数据,直到下一个SCK 之前,不会改变输出内容。
而等我们下一次再传送一个新的8位数据时,在第一个SCK的时候,SCLR生效之后才接收新数据,因为不会影响接收新数据。
这个过程我称之为“收口操作“。
74HC595在【8x8LED点阵】中的应用每个灯就相当于坐标图中的一个点,具有唯一独特的坐标位置,这样就可以通过引脚的信号来控制每个灯的关和开col管脚连接的是P0的八个引脚,row管脚连接的是595的八位并行输出端。
74hc595 工作原理
74HC595是一种集成电路芯片,它提供了一个8位的移位寄存器和一个串行输入/串行并行输出功能。
该芯片的工作原理如下:
1. 时钟信号:74HC595通过外部提供的时钟信号进行工作。
时钟信号用于同步数据的移位操作。
2. 数据输入:通过串行输入引脚SER输入数据。
当时钟信号的上升沿到达时,输入数据被移入移位寄存器中的第一个位。
之后,每个时钟信号的上升沿,数据将向左依次移位,直到移位寄存器中的最后一个位。
3. 移位寄存器:移位寄存器是由8个触发器组成,每个触发器都可以存储一个位的值(0或1)。
在数据输入完成后,每个触发器存储了相应的数据位。
4. 数据输出:在并行输出模式下,通过并行输出引脚Q0-Q7输出存储在移位寄存器中的数据。
这意味着可以同时输出8个位的数据。
在串行输出模式下,通过引脚Q7'S(又称为Q7'引脚)输出最后一个位的数据。
5. 存储寄存器:存储寄存器用于保存通过移位寄存器移入的数据,以便在输出时能够固定显示。
通过上述过程,74HC595实现了将串行输入的数据移位并以
并行输出的形式存储,从而实现数据的并行输出。
这使得它在需要同时控制多个设备的应用中非常有用,如LED显示、数码管、驱动器等。
*****************************************************************
***************************
*功能:
利用IO 口线模拟同步串口驱动74HC595控制LED1~LED这八个LED灯进行花样流水灯显示。
*硬件条件:1.CPU型号:
AT89S52
*2. 晶振:12.000MHz
*3. 用短接P2.3__SI2
* 用短接P2.2__RCK2
*用短接P2.1__SCK2
* 日期:
2014 年04 月24 号
*****************************************************************
****************************/
#include "reg52.h"// 包含头文件
/* 与编译器无关的数据类型定义*/
/*****************************************************************
***************************/
typedef unsigned char uint8;// 无符号8 位整型变量
typedef signed char int8;// 有符号8 位整型变量
typedef unsigned short uint16;// 无符号16 位整型变量
typedef signed short int16;// 有符号16 位整型变量
typedef unsigned int uint32;// 无符号32 位整型变量
typedef signed int int32;// 有符号32 位整型变量
typedef float fp32;// 单精度浮点数( 32 位长度) typedef double fp64;// 双精度浮点数( 64 位长度)
/********************************************************************* ***********************/ /* 定义位变量*/
sbit P2_3 = P2 八 3;
sbit P2_2 = P2 八 2;
sbit P2_1 = P2 八 1;
sbit P2_0 = P2 八 0;
#defineSI2_H()(P2_3=1)/定义"SI2_H)为P2.3输出高电平,作为74HC595_2 的数据输入信号
#define SI2_L()(P2_3=0)/定义"SI2_L()'为P2.3输出低电平,作为74HC595_2 的数据输入信号
#define RCK2_H()(P2_2=1)定义"RCK2_H()为P2.2输出高电平,作为
74HC595_2的片选输入信号
#define RCK2_L()(P2_2=0)定义"RCK2_L()为P2.2输出低电平,作为
74HC595_2的片选输入信号
#define SCK2_H()(P2_1=1)定义"SCK2_H()为P2.1 输出高电平,作为
74HC595_2的时钟输入信号
#defineSCK2_L()(P2_仁0)定义"SCK2_L()为P2.1 输出低电平,作为
74HC595_2的时钟输入信号
*****************************************************************
***************************
* 函数名称:Delay() *功能:软件xx *xx 参数:
count xx 参数,值越大,xx 越长
* 出口参数:无
*********************************************************************
************************/
void Delay(uint16 count){uint8 i;
while(--count != 0){for(i = 0; i < 125; i++);〃";"表示空语句,CPU空转。
}//i从0加到125,在12M晶体下CPU大概耗时1毫
******************************************************************
秒}/
**************************
* 函数名称:
SendDataTo74HC595_2()
*功能:
向74HC595_2发送一字节数据
*xx 参数:
data 要发送的数据
出口参数:无* 注意:
发送数据时,高位先发送
*****************************************************************
****************************/
void SendDataTo74HC595_2(uint8 dat){uint8 i;
RCK2_L();〃RCK为低电平
for(i=0;i<8;i++)// 发送8 位数据( 1 个字节) {
SCK2_L();〃SCK为低电平
/*设置SI2的输出值*/
if((dat & 0x80)!=0)
{SI2_H();}〃SI2输出高电平
else
{SI2_L();}〃SI2输出低电平
dat<v=1;〃将要发送的1字节数据左移一位SCK2_H();〃SCK为高电
平}RCK2_H();〃RCK为高电平}/*流水灯花样,低电平点亮,注意调用时用了取反"操作*/ const uint8 DISPLAY_TAB[42]={
0x00,0xff,// 全部熄灭后,再全部点亮
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,/依次逐个点亮
0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,〃依次逐个叠加0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,〃依次逐个递减0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,俩个靠拢后分开
0x81,0xc3,0xe7,0xff,0xff,0xe7,0xc3,0x81,//从两边叠加后递减
};
*****************************************************************
***************************
* 函数名称:
main()
*功能:
利用IO 口线模拟同步串口驱动74HC595控制LED1~LED这八个LED灯进行花样流水灯显示。
*****************************************************************
****************************/
void main (void){uint8 i;
while
(1)〃死循环{for(i=0;i<42;i++){Se ndDataTo74HC595_2(~DISPLAY_TAB[i]输出LED显示数据Delay
(100);//xx}}}。