51单片机-LED点阵实验

本文实验目的:用51单片机8*8的LED点阵实验实现点亮一个点和显示一个数字。

一、LED点阵介绍

         通常应用较多的是 8*8 点阵,然后使用多个 8*8 点阵可组成不同分辨率的 LED点阵显示屏,比如 16*16 点阵可以使用 4 个 8*8 点阵构成。因此理解了 8*8LED点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样的。这里以 8*8LED 点阵来做介绍。

        如要将第二行第四列的灯点亮,则 2脚接高电平(所在列其余接低电平), d脚接低电平所在行接高电平,则第二行第四列的灯就亮了。如图:

二、程序介绍

1、初始化

        首先,我们需要初始化单片机的端口和74HC595的控制端口。在代码中,我们定义了三个控制74HC595的端口:

  • SRCLK:移位寄存器时钟输入
  • RCLK:存储寄存器时钟输入
  • SER:串行数据输入

 这些端口与51单片机的特定IO口相连。

sbit SRCLK=P3^6;	//移位寄存器时钟输入
sbit RCLK=P3^5;		//存储寄存器时钟输入
sbit SER=P3^4; 		//串行数据输入

2、延时函数

        由于74HC595在传输数据时需要一定的时间来稳定,我们设计了一个延时函数delay_10us,该函数通过简单的循环来实现大约10微秒的延时。

void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

3、数据传输函数

  hc595_write_data函数是向74HC595写入数据的关键函数。它通过循环8次,每次将数据的最高位发送到SER端口,然后通过SRCLK的上升沿将数据送入移位寄存器。之后,通过RCLK的上升沿将数据从移位寄存器输出到存储寄存器

void hc595_write_data(u8 dat)
{
	u8 i=0;
	
	for(i=0;i<8;i++)//循环8次可将一个字节写入寄存器
	{
		SER=dat>>7;//优先传输一个字节中的高位
		dat<<=1;//将低位移动到高位
		SRCLK=0;
		delay_10us(1);
		SRCLK=1;
		delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中	
	}
	RCLK=0;
	delay_10us(1);
	RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}

4、主函数

        在main函数中,我们首先设置P0口的数据,使得除了第4个LED为低电平外,其他所有LED的阴极(列)都是高电平(二进制表示为1110 1111)。然后,通过调用hc595_write_data函数,我们将0x80(二进制表示为0100 0000)发送到74HC595,这样只有第一行的第一个LED(阳极)被设置为高电平,从而点亮第一个点。

void main()
{	
	u8 i=0;

	LEDDZ_COL_PORT=0xef;//这行代码设置P0口的数据为1110 1111,其中第四位是0,表示第四列的阴极为低电平,其他列为高电平。
	while(1)
	{			
		hc595_write_data(0x40);//这行代码发送0000 0100到74HC595,表示第二行的阳极为高电平,其他行为低电平。								
	}		
}

        程序中是用十六进制表示,可用计算机二进制转换成十六进制,如图:

        综上所述可得实验现象第二行第四列的LED就会被点亮。同理可将8*8点阵上任意一点点亮,上述功能实现后还可实现显示数字、文字和图形等。

三、完整程序:

#include "reg51.h"

sbit SRCLK=P3^6;	//移位寄存器时钟输入
sbit RCLK=P3^5;		//存储寄存器时钟输入
sbit SER=P3^4; 		//串行数据输入

#define LEDDZ_COL_PORT	P0	//点阵列控制端口

void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

void hc595_write_data(u8 dat)
{
	u8 i=0;
	
	for(i=0;i<8;i++)//循环8次可将一个字节写入寄存器
	{
		SER=dat>>7;//优先传输一个字节中的高位
		dat<<=1;//将低位移动到高位
		SRCLK=0;
		delay_10us(1);
		SRCLK=1;
		delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中	
	}
	RCLK=0;
	delay_10us(1);
	RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}

void main()
{	
	u8 i=0;

	LEDDZ_COL_PORT=0xef;//这行代码设置P0口的数据为1110 1111,其中第四位是0,表示第四列的阴极为低电平,其他列为高电平。
	while(1)
	{			
		hc595_write_data(0x40);//这行代码发送0000 0100到74HC595,表示第二行的阳极为高电平,其他行为低电平。								
	}		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值