当前位置: 首页 > news >正文

51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED)

目录

目的/效果

一,STC单片机模块

二,8*8 LED点阵模块 

2.1 电路图

2.1.1 8*8 点阵模块电路图

2.1.2 74HC595(串转并)模块 电路图

2.1.3 芯片引脚

2.2 引脚电平分析

2.3 74HC595 串转并模块

2.3.1 装弹(移位寄存器)

2.3.2 发弹(存储寄存器)

2.4 STC89C52RC 中的sfr、sbit

2.4.1 sfr(special function register):特殊功能寄存器声明   

2.4.2 sbit(special bit):特殊位声明   

2.4.3 可位寻址/不可位寻址:

三,创建Keil项目

四,代码 

五,代码编译、下载到51单片机


目的/效果

程序控制,点亮点阵LED 第1行第一列LED

一,STC单片机模块

二,8*8 LED点阵模块 

2.1 电路图

2.1.1 8*8 点阵模块电路图

2.1.2 74HC595(串转并)模块 电路图

 

2.1.3 芯片引脚

 

 

2.2 引脚电平分析

我们要点亮左下角 第一个 LED,需要将P70和DPa接通,其他引脚不管,如下图

将LED点阵左边第一列设置为0,即LED阴极为低电平,其余列为1,即高电平 

将LED点阵上边第一行设置为1,即LED阳极为高电平,其余行为0,即低电平  

对于74HC595模块的电平如下

 这里要注意跳线帽:OE 输出有效(低电平),我们直接可以拔掉或者接GND上

 

 

DP上的HEX=0x80=1000 0000(二进制)

那么对于引脚P35(RCLK)、P36(SRCLK)、P34(SER)输入怎样的数据,DPa-DPh 才会输出1000 0000 的电平呢?我们就要详细分析这个74HC595译码器。

2.3 74HC595 串转并模块

    74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗)

移位寄存器工作方式就像手枪弹夹,但是子弹的发射(移位寄存器中的数据转储到存储寄存器),又像是【散弹】(因为是并行输出嘛)。

具体的装弹和发弹如下

2.3.1 装弹(移位寄存器)

上升沿:电平从低到高的那个过程。移位寄存器时钟在上升沿这个过程中才起作用。

先把数据放到针脚P34(SER)上(SER=1低电平 或者SER=0 高电平)

然后将 将P36(SRCLK) 针脚 先置低电平(SRCLIK=1)再置高电平(SRCLK=0)。这样就是实现了由上升沿 移位寄存(装弹)的效果。不过要注意这里不能立即置0,机器也需要处理时间。这里我们需要将程序延时10微秒后再做处理。

2.3.2 发弹(存储寄存器)

 数据从位移寄存器转移到存储寄存器,也是需要时钟脉冲驱动的,这就是P35(RCLK)脚的作用。它也是上升沿有效。

2.4 STC89C52RC 中的sfr、sbit

2.4.1 sfr(special function register):特殊功能寄存器声明   

 例:sfr P0 = 0x80;     声明P0口寄存器,物理地址为0x80

2.4.2 sbit(special bit):特殊位声明   

 例:sbit P0_1 = 0x81;    或    sbit P0_1 = P0^1;     声明P0寄存器的第1位

比如本节我们用到了下面几个,我们把针脚P34、P35、P36定义用对应申明,在使用时不在写针脚地址寄存器(当然也可以继续使用针脚,作用一样)。

//定义74HC595控制管脚
sbit _SRCLK=P3^6;	//移位寄存器时钟输入
sbit _RCLK=P3^5;	//存储寄存器时钟输入 注意:在 REGX52.H 中已经申明了RCLK
sbit _SER=P3^4; 	//串行数据输入 

2.4.3 可位寻址/不可位寻址:

在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作

三,创建Keil项目

详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客

四,代码 

main.c

#include <REGX52.H>  
#include "74HC595.h"
/*** 函    数:主函数* 参    数:无* 返 回 值:无*/
void main()
{	 	 while(1){_74HC595_Show(0,0x80);//点亮第一行,第一个LED}
} 

Delay.c

/*** 函    数:延时函数 毫秒* 参    数:ms 延时多少毫秒* 返 回 值:无*/
void Delay_ms(int ms)	//@12.000MHz
{unsigned char data i, j;while(ms--){ i = 2;j = 239;do{while (--j);} while (--i);}
}
/*** 函    数:延时函数 毫秒* 参    数:ms 延时多少毫秒* 返 回 值:无*/
void Delay_us(int ms)	//@12.000MHz
{unsigned char data i, j;while(ms--){ i = 2;j = 239;do{while (--j);} while (--i);}
}
/*** 函    数:延时函数  10微秒* 参    数:无* 返 回 值:无*/
void Delay_10us(int _10us)	//@11.0592MHz
{unsigned char data i;while(_10us--){i = 2;while (--i);}
}

 Delay.h

#ifndef __DELAY_H_
#defind __DELAY_H_ 
void Delay_ms(int ms);
void Delay_10us(int _10us);
#endif

 74HC595.c

#include <REGX52.H>
#include "Delay.h"//定义74HC595控制管脚
sbit _SRCLK=P3^6;	//移位寄存器时钟输入
sbit _RCLK=P3^5;	//存储寄存器时钟输入 注意:在 REGX52.H 中已经申明了RCLK
sbit _SER=P3^4; 	//串行数据输入 /*** 函    数:74HC595写入一个字节* 参    数:Byte 要写入的字节* 返 回 值:无*/
void _74HC595_WriteByte(unsigned int Byte)
{	unsigned char i;for(i=0;i<8;i++){_SER=Byte&(0x80>>i);		//将1000 0000 右移i位后 & Byte_SRCLK=0;				//移位寄存器置搞电平Delay_10us(1);_SRCLK=1;				//移位寄存器置低电平/*这里有需要可以延时10微秒*/Delay_10us(1);}_RCLK=1;	//存储寄存器置低电平Delay_10us(1);_RCLK=0;	//存储寄存器置搞电平 
}
/*** 函    数:LED点阵屏显示一列数据* 参    数:Column 要选择的列,范围:0~7,0在最左边,Data 选择列显示的数据,高位在上,1为亮,0为灭* 返 回 值:无*/
void _74HC595_Show(unsigned char Column,Byte)
{_74HC595_WriteByte(Byte);	//向行写入数据P0=~(0x80>>Column);			//向列写入数据Delay_10us(1);				//等待显示稳定 
}

 74HC595.h

#ifndef __74HC595_H_
#defind __74HC595_H_
void _74HC595_WriteByte(unsigned int Byte);
void _74HC595_Show(unsigned char Column,Byte);
#endif

五,代码编译、下载到51单片机

代码编译请参考

《51单片机STC89C52RC——代码编译-CSDN博客》

代码下载请参考

《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》

http://www.lryc.cn/news/383118.html

相关文章:

  • 2024最新免费版轻量级Navicat Premium Lite 下载和安装教程
  • PHP+laravel 生成word
  • redis集群简单介绍及其搭建过程
  • linux桌面运维----第五天
  • 【SQL Server数据库】简单查询
  • Docker 从入门到精通(大全)
  • 基于JSP的在线教育资源管理系统
  • 在java中代理http请求,如何避免陷入循环?
  • 国内镜像源网址
  • 合适的智能猫砂盆到底怎么挑?开放式封闭式一次说清!
  • 阿里云开启ssl证书过程记录 NGINX
  • C语言程序设计 9.37 调用随机函数为5x4的矩阵置 100以内的整数,输出该矩阵,求出每行元素之和,并把和的最大的那一行与第一行的元素对调
  • Webpack: 借助 Babel+TS+ESLint 构建现代 JS 工程环境
  • 孩子不想上学,父母应如何教育?“强迫教育”会激起孩子反抗心理
  • Python深度学习技术
  • ECharts 雷达图案例002 - 诈骗性质分析
  • 想远程控制手机,用哪个软件好?
  • 数字内容“遍地开花”,AI技术如何创新“造梦”?
  • MySQL集群如何实现读写分离
  • 一分钟剪辑1000条视频的云微客矩阵,怎么做到的?
  • 简单案例比较Lambda和方法引用的差别
  • 10 个最佳 AI 代码生成器
  • Eureka服务发现机制解析:服务实例的唯一标识
  • 操作系统实训复习笔记(基于命名管道与信号的进程间通信)
  • 数字化转型第三步:数字化业务创新与发展,提升收入和利润
  • SSM爱心捐赠物资维护系统-计算机毕业设计源码09536
  • ​中国9大流域地图SHP数据
  • android Switch/case with R.id.XXXX in android doesn‘t work 错误: 需要常量表达式解决方案
  • vue3-openlayers marker 光晕扩散(光环扩散)(postrender 事件和 render 方法)
  • 新型防勒索病毒方案分享无需依靠病毒库