【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制

目录

  • 硬知识
    • IO 口扩展方式-串转并
    • 74HC595 芯片介绍
    • 硬件设计
  • 测试源码
    • HC74595.c
    • HC74595.h
    • main.h
  • 实验现象
  • SPI控制

普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


硬知识

选自《普中51单片机开发攻略_V1.2》

IO 口扩展方式-串转并

       使用的芯片是 74HC595。开发板板载 1 个 74HC595 芯片,仅需单片机 3 个 IO 口即可扩展 8 个,如果需要还可以将 2 个 74HC595 级联扩展出 16 个 IO,这就实现用少数 IO 资源控制多个设备。

74HC595 芯片介绍

       74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗)。
在这里插入图片描述

15 和 1 到 7 脚 QA–QH:并行数据输出
9 脚 QH 非:串行数据输出
10 脚 SCLK 非( MR) : 低电平复位引脚
11 脚 SCK( SHCP) : 移位寄存器时钟输入
12 脚 RCK( STCP) : 存储寄存器时钟输入
13 脚 G 非( OE) : 输出有效
14 脚 SER( DS) : 串行数据输入

       74HC595 具有 8 位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是单独的时钟。数据在 SCK 的上升沿输入,在 RCK 的上升沿进入到存 储器中。如果两个时钟连在一起,则移位寄存器总是比存储器早一个脉冲。移位寄存器有一个串行输入(DS),和一个串行输出(Q7 非),和一个异步的低电 平复位,存储寄存器有一个并行8 位、具有三态的总线输出,当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在 STCP 上升沿输出到并行端口。

硬件设计

在这里插入图片描述
       74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连接到 51 单片机的 P3.4~P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。
       要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据,这样即可控制 LED 点阵的数据。根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机 P0 口控制点阵74HC595控制点阵

测试源码

修改自官方例程
stdint.h见【51单片机快速入门指南】1:基础知识和工程创建

HC74595.c

#include <REGX52.H>
#include "intrins.h"
#include "stdint.h"#define Rows P0uint8_t Mat[8][8] = 
{1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,
};void HC74595_Delay() //10us @11.0592MHz
{unsigned char i;i = 2;while (--i);
}//定义74HC595控制管脚
sbit SRCLK_74595	=	P3^6;	//移位寄存器时钟输入
sbit RCLK_74595		=	P3^5;		//存储寄存器时钟输入
sbit SER_74595		=	P3^4; 		//串行数据输入/*******************************************************************************
* 函 数 名         : hc595_write_data(uint8_t dat)
* 函数功能		   : 向74HC595写入一个字节的数据
* 输    入         : dat:数据
* 输    出         : 无
*******************************************************************************/
void hc595_write_data(uint8_t dat)
{uint8_t i=0;for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中{SER_74595=dat>>7;//优先传输一个字节中的高位dat<<=1;//将低位移动到高位SRCLK_74595=0;HC74595_Delay();SRCLK_74595=1;HC74595_Delay();//移位寄存器时钟上升沿将端口数据送入寄存器中	}RCLK_74595=0;HC74595_Delay();RCLK_74595=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出	
}void imshow(uint8_t mat[8][8])
{uint8_t i, j, Row_Pix;for(i=0; i<8; ++i){	hc595_write_data(0x00);//消除前面寄存器缓存数据for(j = 0, Row_Pix = 0; j < 8; ++j)Row_Pix |= mat[i][j] << (7-j);Rows = ~Row_Pix;hc595_write_data(0x80>>i);//写入新的数据HC74595_Delay();}
}

HC74595.h

#ifndef HC74595_H_
#define HC74595_H_#include "stdint.h"extern uint8_t Mat[8][8];void hc595_write_data(uint8_t dat);
void imshow(uint8_t mat[8][8]);#endif

main.h

#include <REGX52.H>
#include "intrins.h"
#include "stdint.h"
#include "HC74595.h"void main(void)
{	while(1){imshow(Mat);}
}

实验现象

如图,成功将Mat中的二值图像打印在8x8的点阵屏上
在这里插入图片描述

SPI控制

SPI控制代码见【51单片机快速入门指南】5:软件SPI
SPI使用模式2

#include <STC89C5xRC.H>
#include "intrins.h"
#include "stdint.h"
#include "./Soft_SPI/Soft_SPI.h"#define Rows P0//定义74HC595控制管脚
sbit RCLK_74595_CS	=	P3^5;		//存储寄存器时钟输入uint8_t Mat[8][8] = 
{1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,
};void HC74595_Delay() 
{}/*******************************************************************************
* 函 数 名         : hc595_write_data(uint8_t dat)
* 函数功能		   : 向74HC595写入一个字节的数据
* 输    入         : dat:数据
* 输    出         : 无
*******************************************************************************/
void hc595_write_data(uint8_t dat)
{RCLK_74595_CS=0;SOFT_SPI_RW_MODE2(dat);RCLK_74595_CS=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出	
}void imshow(uint8_t mat[8][8])
{uint8_t i, j, Row_Pix;for(i=0; i<8; ++i){	hc595_write_data(0x00);//消除前面寄存器缓存数据for(j = 0, Row_Pix = 0; j < 8; ++j)Row_Pix |= mat[i][j] << (7-j);Rows = ~Row_Pix;hc595_write_data(0x80>>i);//写入新的数据HC74595_Delay();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb 安装和启动

一.首先去官网下载对应的的mongodb ,本人的操作系统是win7 64位 mongodb-win32-x86_64-2.0.6.rar 解压安装&#xff1a;进入到bin目录下&#xff0c;会看到N多的.exe文件 二.启动mongodb mongod.exe --dbpathd:\mongo\data\db --logpathd:\mongo\log\log.txt, 通过浏览器访问…

【51单片机快速入门指南】3:中断系统

目录硬知识中断概念中断系统中断结构中断优先级中断处理普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 选自《普中51单片机开发攻略_V1.2》、《STC89C52系列单片机器件手册》 中断概念 中断是为使单片机具有对外部或内…

正能量之项目经理的自我修养

正能量之项目经理的自我修养 作者&#xff1a;张子良 版权所有&#xff0c;转载请注明出处 引子 还记得曾经看过的《喜剧之王》么&#xff1f;还记的那曾经经典的台词么&#xff1a;“我不是死跑龙套的”&#xff0c;“人如果没有理想&#xff0c;和咸鱼又有什么区别呢&#xf…

20170505

RAID级别 raid0 为带区阵列&#xff1b;raid1 为镜像阵列raid01 为四块磁盘实现的荣誉磁盘阵列&#xff1b;raid5 至少三块&#xff0c;容量为&#xff08;n-1&#xff09;/n 广泛用于各种服务器&#xff1a;文件&#xff0c;数据库&#xff0c;web&#xff0c;邮件服务器 1.gi…

MVC4下配置log4net 五部曲

第一步&#xff1a;把log4net.dll 编译成Framework 4.0 第二步&#xff1a;找到项目的Properties下的AssemblyInfo。在最下面添加&#xff1a;[assembly: log4net.Config.XmlConfigurator(Watch true)]。 第三步&#xff1a;Web.config <configuration><configSectio…

算法,俄罗斯方块

炮姐的88行代码,亮瞎了..有待研究 #include <windows.h> #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib.h> char gcText[] " 1LJTSZ#"; struct tetris {int _pool[16][32], (*pool)[32], tmap[8][4][16…

利用D触发器和异或门实现两个IO解读电机编码器的计数值和方向

目录反转变正转正转变反转iPad Pro 2020 14.8.1 仿真软件&#xff1a;iCircuit 突发奇想&#xff0c;做个记录。应该可以用于诸如51单片机、Arduino或是电赛中可能用到的MSP430G2553这类外设十分稀缺的单片机上。一个想法&#xff0c;啊&#xff0c;不一定对。 黄色波形是编码…

TCP协议的三次握手和四次分手

HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol )&#xff0c;是Web联网的基础&#xff0c;也是手机联网常用的协议之一&#xff0c;HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应&#xff0c;在请…

CountDownLatch线程同步辅助

2019独角兽企业重金招聘Python工程师标准>>> http://bughope.iteye.com/blog/2081935 在上一篇文章中写道用一个静态的变量保存线程的执行状态,并用时间等待的方法后来仔细考虑,其实是 线程不安全的.多个线程同时执行这个类时,这个静态变量的值就不能保证了. 用一个…

SQLServer链接服务器至Oracle

1. 我方服务器必须安装msdtc服务&#xff0c;并进行相应配置。 2. 我方服务器必须安装oracle client&#xff0c;这个要对应中心站oracle版本的客户端。 3. 我方服务器必须安装Oracle Services For Microsoft Transaction Server [版本] Oracle Provid…

【51单片机快速入门指南】3.1:配置外部中断触发方式和中断优先级

目录源码EXTI.cEXTI.hmain.c实验现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 源码 stdint.h见【51单片机快速入门指南】1&#xff1a;基础知识和工程创建 中断知识见【51单片机快速入门指南】3&#xff1a;中断系统 将…

(转)工厂方法模式

转自&#xff1a;http://www.jellythink.com/archives/62 问题描述 之前讲到了C设计模式——简单工厂模式&#xff0c;由于简单工厂模式的局限性&#xff0c;比如&#xff1a;工厂现在能生产ProductA、ProductB和ProductC三种产品了&#xff0c;此时&#xff0c;需要增加生产Pr…

一种父线程阻塞等待子线程的有效方法

最近在做一个查询优化时&#xff0c;考虑到一次查询耗时较多&#xff0c;所以打算用多线程来做&#xff0c;之前是串行查询。比如一个用户查询触发50个线程&#xff0c;在只有一个用户的情况下&#xff0c;性能比串行查询确实提高了许多&#xff0c;但当多个用户同时触发查询的…

C语言利用循环队列实现滑动平均值滤波器,提高计算速度

目录源码Filter.cFilter.h使用效果普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 串口示波器&#xff1a;Vofa 1.3.10 网上查到的滑动平均值滤波器在计算平均值的时候还要再for累加一遍&#xff0c;这太浪费时间了&#xff0c…

iOS 计算文字宽度的一个细节

设计师给到的图&#xff0c;经常是 “按钮的左边距离文字右边5px” 这样子的标注。于是我们需要计算文字的宽度。 有两种方法&#xff1a; 用 label 或 button 的 sizetofit 方法 [label sizeToFit]; NSLog("label size is %",[NSValue valueWithCGSize:label.boun…

Exchange Server 2013日记功能

9.6 日记9.6.1 日记功能为什么很重要首先&#xff0c;了解日记功能与存档功能之间的区别十分重要&#xff1a;首先&#xff0c;了解日记功能与存档功能之间的区别十分重要&#xff1a; “日记”可以记录组织中的所有通信&#xff08;包括电子邮件通信&#xff09;&#xff0c;以…

VB数据库经典实例总结(二)

大家先看一张似图非图的图、 我们先称它为“过程”也许有不对的地方&#xff0c;在我学数据库到这个阶段、到这个刚刚接触、初生牛犊不怕虎的阶段对它的理解是这样的、所有的都是这个过程、只是在这中间掺杂了一些知识点&#xff08;我们要掌握的&#xff09;针对有些个别的&am…

适用于单片机的FFT快速傅里叶变换算法,51单片机都能用

目录源码FFT.cFFT.h使用方法效果其他部分的代码main.c普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 算法来自FFT算法的使用说明与C语言版实现源码 —— 原作者&#xff1a;吉帅虎 速度更快的版本见C语言实现的FFT与IFFT源代码…

第9课 - 函数重载分析(下)

第9课 - 函数重载分析&#xff08;下&#xff09; 1. 重载与指针 1.1 下面的函数指针将保存哪个函数的地址&#xff1f; 1.2 函数重载遇上函数指针 将重载函数名赋值给函数指针时&#xff1a; &#xff08;1&#xff09;根据重载规则挑选与函数指针参数列表一致的候选者 &#…

常见窗函数的C语言实现及其形状,适用于单片机、DSP作FFT运算

目录源码WindowFunction.cWindowFunction.h使用形状三角窗巴特利特窗巴特利特-汉宁窗布莱克曼窗布莱克曼-哈里斯窗博曼窗切比雪夫窗平顶窗高斯窗海明窗汉宁窗纳托尔窗Parzen窗矩形窗&#xff08;模拟&#xff09;效果无窗汉宁窗平顶窗平台&#xff1a;Windows 10 20H2 Visual …