51单片机STC 89C52RC进阶 – 两片74HC595D串联实现跑马灯

芯片概述(回忆)

STC 89C52RC电气特性
管脚定义

在这里插入图片描述

管脚符号管脚序号管脚含义备注
T2/P1.0 ~ P1.71 ~ 8带内部上拉电阻的8位双向I/O口可输入或输出数据。同时可做定时器/计数器2的的外部技术输入(P1.0/T2)和触发输入(P1.1/T2EX)
RST9复位输入用来完成单片机单片机的复位初始化操作
RXD/P3.010串行输入口使用USB转TTL下载器烧写程序时,此接口一般接下载器的TXD引脚
TXD/P3.111串行输出口使用USB转TTL下载器烧写程序时,此接口一般接下载器的RXD引脚
INTO/P3.212外部中断口0
INT1/P3.313外部中断口1
TO/P3.414定时器0的外部输入
T1/P3.515定时器1的外部输入
WR/P3.616外部数据存储器写选通
RD/P3.717外部数据存储器读选通
XTAL218振荡器反相放大器的输入端
XTAL119振荡器反相放大器和内部时钟发生电路的输入端
VSS20接地(GND)端
P2.0/A8 ~ P2.7/A1521 ~ 28带内部上拉电阻的8位双向I/O端口可输入或输出数据
PSEN29外ROM读选通信号在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号
ALE/PROG30地址锁存允许/片内EPROM编程脉冲ALE:用来锁存P0口送出的低8位地址 PROG:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲
EA31访问外部程序存储器控制信号为了执行内部程序指令,应该接电源正极
P0.0/AD0 ~ P0.7/AD732 ~ 39漏极开路的8位双向I/O口可输入或输出数据
VCC40电源正极输入接电源正极

补充表格注释:
在这里插入图片描述

74HC595和74HC595D 电气特性

管脚定义(左:74HC595D 右:74HC595)

在这里插入图片描述

管脚符号管脚序号管脚含义备注
QA158位并行数据输出分别接8颗独立的LED发光二极管
QB1
QC2
QD3
QE4
QF5
QG6
QH7
GND8接地端接树莓派的GND引脚
Vcc16电源正极输入接树莓派的5V电源正极引脚
SI14串行数据输入控制数据的输入。一般接树莓派定义好的GPIO引脚来接收树莓派的高低电平数据
G13输出使能控制端是否要将数据输出到QA~QH引脚上
RCK12存储寄存器(锁存器)时钟输入是否要将移位寄存器中的数据拷贝到存储寄存器(锁存器)中。一般接树莓派定义好的GPIO引脚来接收树莓派的数据实现上升沿
SCK11移位寄存器时钟输入决定何时把SI引脚的数据存入移位寄存器中。一般接树莓派定义好的GPIO引脚来接收树莓派的数据实现上升沿
SCLR10移位寄存器清零输入决定是否要重置所有的寄存器到初始状态。
QH’9串行数据输出接下一个74HC595D的SI引脚实现串联

补充表格注释:
在这里插入图片描述

电路图

完整电路图

在这里插入图片描述
以下三张图分别是在面包板上搭建好的完整电路、最小系统+74HC595D串联电路和LED等阵列电路。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

电路图分析

整体来看,从右到左,电路可分为三大部分:STC
89C52RC最小系统电路、74HC595D级联电路和LED发光二极管阵列电路。

完整电路连接分析表
STC 89C52RC最小系统电路部分
源芯片名称源芯片管脚符号 /管脚序号连接到的目标芯片名称连接到的目标芯片管脚符号 /管脚序号接法解释备注
STC 89C52RCRST / 910uF铝电解电容和10K电阻最小系统必需
STC 89C52RCXTAL2 / 1811.0592MHz晶振和30pF瓷片电容最小系统必需
STC 89C52RCXTAL1 / 1911.0592MHz晶振和30pF瓷片电容最小系统必需
STC 89C52RCVSS / 20电源电源负极/GND为STC 89C52RC提供电源回路
STC 89C52RCEA / 31电源电源正极让STC 89C52RC从内部读取程序执行
STC 89C52RCVCC / 40电源电源正极为STC 89C52RC提供工作电源
74HC595D级联电路部分
源芯片名称源芯片管脚符号 /管脚序号连接到的目标芯片名称连接到的目标芯片管脚符号 /管脚序号接法解释备注
第一片74HC595DQB / 1红色LED阵列第二排阵列正极驱动红色LED阵列的第二排LED
第一片74HC595DQC / 2红色LED阵列第三排阵列正极驱动红色LED阵列的第三排LED
第一片74HC595DQD / 3红色LED阵列第四排阵列正极驱动红色LED阵列的第四排LED
第一片74HC595DQE / 4绿色LED阵列第一排阵列正极驱动绿色LED阵列的第一排LED
第一片74HC595DQF / 5绿色LED阵列第二排阵列正极驱动绿色LED阵列的第二排LED
第一片74HC595DQG / 6绿色LED阵列第三排阵列正极驱动绿色LED阵列的第三排LED
第一片74HC595DQH / 7绿色LED阵列第四排阵列正极驱动绿色LED阵列的第四排LED
第一片74HC595DGND / 8电源电源负极为第一片74HC595D提供电源回路
第一片74HC595DQH’ / 9第二片74HC595DSI / 14串联下一片74HC595D
第一片74HC595DSCLR / 10STC 89C52RCP1.5 / 6灵活控制LED的亮灭
第一片74HC595DSCK / 11STC 89C52RCP1.4 / 5控制何时将SI引脚上输入的串行数据移动到移位寄存器中
第一片74HC595DRCK / 12STC 89C52RCP1.3 / 4控制何时将移位寄存器中的数据拷贝到存储寄存器(锁存器)中
第一片74HC595DG / 13STC 89C52RCP1.6 / 7控制QA~QH是否输出数据
第一片74HC595DSI / 14STC 89C52RCP1.2 / 3输入串行数据
第一片74HC595DQA / 15红色LED阵列第一排阵列正极驱动红色LED阵列的第一排LED
第一片74HC595DVcc / 16电源电源正极为74HC595D提供工作电源
第二片74HC595DQB / 1黄色LED阵列第二排阵列正极驱动黄色LED阵列的第二排LED
第二片74HC595DQC / 2黄色LED阵列第三排阵列正极驱动黄色LED阵列的第三排LED
第二片74HC595DQD / 3黄色LED阵列第四排阵列正极驱动黄色LED阵列的第四排LED
第二片74HC595DQE / 4蓝色LED阵列第一排阵列正极驱动蓝色LED阵列的第一排LED
第二片74HC595DQF / 5蓝色LED阵列第二排阵列正极驱动蓝色LED阵列的第二排LED
第二片74HC595DQG / 6蓝色LED阵列第三排阵列正极驱动蓝色LED阵列的第三排LED
第二片74HC595DQH / 7蓝色LED阵列第四排阵列正极驱动蓝色LED阵列的第四排LED
第二片74HC595DGND / 8电源电源负极为第二片74HC595D提供电源回路
第二片74HC595DQH’ / 9如没有第三片74HC595D则不连
第二片74HC595DSCLR / 10STC 89C52RCP1.5 / 6灵活控制LED的亮灭和第一片74HC595D连接位置一致
第二片74HC595DSCK / 11第一片74HC595DSCK / 11控制何时将SI引脚上输入的串行数据移动到移位寄存器中
第二片74HC595DRCK / 12第一片74HC595DRCK / 12控制何时将移位寄存器中的数据拷贝到存储寄存器(锁存器)中
第二片74HC595DG / 13STC 89C52RCP1.6 / 7控制QA~QH是否输出数据和第一片74HC595D连接位置一致
第二片74HC595DSI / 14第一片74HC595DQH’ / 9输入串行数据
LED发光二极管阵列电路部分
比较简单,按电路图连接即可,不再赘述

表格注释补充:
在这里插入图片描述
在这里插入图片描述

跑马灯程序

完整程序

执行C程序后,会看到16排LED发光二极管依次循环亮灭,行如流水。

程序:

https://gitee.com/stevejrong1024/water-lamp

文件:

labs/lab2.c

基础知识

  1. 十进制数转换二进制数:

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

例:十进制数255转换二进制数为多少?
答:
在这里插入图片描述

  1. 形如“0x”这样的表示法为十六进制的表示法。十六进制一般用数字0到9和字母A到F(或a~f)表示,其中A~F(或a~f)表示10~15,这些称作十六进制数字。

  2. 十六进制数转换十进制数:
    16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

例:十六进制数 0x80、0xff、0xfe 转换十进制数分别为多少?
答:
在这里插入图片描述

  1. 两个十进制数进行按位与运算:
    按位与就是将两个数字或字符串,转换为二进制数之后,其中的每一位进行运算最后得出的一个新的二进制结果,将这个新得出的二进制数转换为十进制数,即为最终答案
    按位与的运算规则:
    两个要进行按位与运算的数字都转为二进制数后,每一位进行比较。若当前位中,两者的值都等于1,则新生成的二进制数中,此位的值就写为1,否则此位写0

例:十进制数7和十进制数9进行按位与运算,结果为多少?
答:
在这里插入图片描述
5. 循环左移运算:
在二进制表示法下,循环将位于二进制数最左边的一位移动到二进制数最右边,构成新的二进制数的操作。

例:十进制数1,左移一位后,结果为多少?
答:
在这里插入图片描述
在C语言中,没有现成的库能实现循环左移,使用一下自定义方法可实现循环左移:

/**
 * 循环左移
 *
 * @param sourceData 原始数据
 * @param bit 原始数据的位数。可选值:8、16、32
 * @param step 移动位数
 * @return
 */
int circularLeft(int sourceData, int bit, int step) {
    return (sourceData << step) | (sourceData >> (bit - step));
}
  1. 可能用到的数字,其十进制、十六进制和二进制表示法大全:
十进制数十六进制表示法二进制表示法备注
10x010000 0001
20x020000 0010
40x040000 0100
80x080000 1000
160x100001 0000
320x200010 0000
640x400100 0000
1280x801000 0000
  • 仔细观察二进制表示法中,值1的位置。从表格第一行的十进制数字1开始,到表格最后一行的十进制数字128结束,二进制数中的值1,从最右边逐位移动到了最左边。
    这也就是为什么跑马灯程序中,main方法里的初始值要设置成0x01了,因为这表示第一片QA引脚接入的第一排红色LED先点亮
  1. 两片74HC595D串联以后,16位的二进制数与74HC595D管脚的对应位置关系
    对应了关系,也就表明一个二进制数可以精确到单独控制74HC595D的每一个并行输出引脚,是否输出数据。即可以精确地控制16排LED发光二极管,每一排的亮灭**
二进制位数位置二进制数位置列举对应74HC595D片对应管脚符号 /管脚序号备注
第16位0000 0000 0000 0001第一片QA / 15即当给SI引脚输入0000 0000 0000 0001二进制数据后,红色LED阵列的第一排LED会亮起,剩余15排LED都熄灭
第15位0000 0000 0000 0010第一片QB / 1即当给SI引脚输入0000 0000 0000 0010二进制数据后,红色LED阵列的第二排LED会亮起,剩余15排LED都熄灭
第14位0000 0000 0000 0100第一片QC / 2以此类推
第13位0000 0000 0000 1000第一片QD / 3以此类推
第12位0000 0000 0001 0000第一片QE / 4以此类推
第11位0000 0000 0010 0000第一片QF / 5以此类推
第10位0000 0000 0100 0000第一片QG / 6以此类推
第9位0000 0000 1000 0000第一片QH / 7以此类推
第8位0000 0001 0000 0000第二片QA / 16以此类推
第7位0000 0010 0000 0000第二片QB / 1以此类推
第6位0000 0100 0000 0000第二片QC / 2以此类推
第5位0000 1000 0000 0000第二片QD / 3以此类推
第4位0001 0000 0000 0000第二片QE / 4以此类推
第3位0010 0000 0000 0000第二片QF / 5以此类推
第2位0100 0000 0000 0000第二片QG / 6以此类推
第1位1000 0000 0000 0000第二片QH / 7以此类推
  1. 适用于频率为11.0529MHz,精确延时的C语言方法:
void delay(unsigned int n) {  
int i, j;  
for (i = n; i \> 0; i--)  
for (j = 110; j \> 0; j--);  
}

程序分析

完整程序中已包含详尽注释,不再赘述。
重在理解以下几点:

  1. 为什么通过数据的移位操作就能控制74HC595D每个并行输出引脚的数据输出
  2. main()方法中,每次while循环结束前为什么要循环左移,不循环左移行吗?
  3. send_data()方法每一步的执行逻辑是什么样的,执行到每一步之后,输入到SI引脚的二进制数据分别是什么?

根据注释一步步分析下来以后,就能很清楚的知道程序是如何精确控制每一个并行输出引脚的了。

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值