单片机点阵_单片机点阵式 - CSDN
  • 74hc595.h: #ifndef __74hc595_H__ #define __74hc595_H__ /************************************位定义************************************/ sbit DATA_IN = P1^0; //串行数据输入 sbit ST_CK = P1^1;...

    74hc595.h:

    #ifndef __74hc595_H__
    #define __74hc595_H__
    /************************************位定义************************************/
    sbit DATA_IN = P1^0;	        //串行数据输入
    sbit ST_CK = P1^1;	        //存储寄存器时钟输入
    sbit SH_CK = P1^2;	        //移位寄存器时钟输入
    /***********************************函数声明***********************************/
    void Ser_IN(unsigned char Data);	//串行数据输入
    void Par_OUT(void);					//串行数据输出
    
    void Ser_IN(unsigned char Data)
    {
    	unsigned char i;
    	for(i = 0; i < 8; i++)
    	{
    		SH_CK = 0;			//CLOCK_MAX=100MHz
    		DATA_IN = Data & 0x80;
    		Data <<= 1;
    		SH_CK = 1;
    	}
    }
    
    void Par_OUT(void)
    {
    	ST_CK = 0;
    	ST_CK = 1;
    }
    
    #endif 
    

    8x8LED.c

    #include <reg52.h>
    #include "74hc595.h"
    
    unsigned char  i;
    unsigned int  m,n;
    
    #define  num  sizeof(Digit_Tab)	//代码长度
    unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    unsigned char code Digit_Tab[]= {//取模方式 阴码 列扫描 逆向
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x06,0x18,0x60,0x1D,0x60,0x18,0x06,0x00,
    0x06,0x18,0x60,0x1C,0x60,0x18,0x06,0x00,
    0x0B,0x1F,0x60,0x1C,0x60,0x18,0x06,0x00,
    0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
    0x00,0x04,0x04,0x7E,0x4E,0x24,0x00,0x00,
    0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00,
    0x7C,0x02,0x02,0x7C,0x02,0x02,0x7C,0x00,
    0x00,0x3C,0x42,0x42,0x42,0x24,0x00,0x00,
    0x00,0x3E,0x40,0x40,0x40,0x3E,0x00,0x00,
    0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
    0x0A,0x3C,0x42,0x4C,0x42,0x24,0x00,0x00,
    0x00,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,
    0x7C,0x02,0x02,0x7C,0x02,0x02,0x7C,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x88,0x49,0x2A,0x1F,0xB9,0x49,0x8E,0x00,
    0x0A,0xFF,0x1A,0x22,0x2B,0xFE,0x2B,0x22,
    0x00,0x3E,0x2E,0x2A,0x7F,0xAA,0xAA,0xBF,
    0x00,0x08,0x09,0x89,0x8D,0x7B,0x09,0x08,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    };
    
    void Display(void)
    {		
        Ser_IN((table[i]));       //列扫描数据
        Ser_IN(Digit_Tab[i + n]); //查表取出行扫描数据
    	Par_OUT();			      //输出显示
    	i++; 
        if(i == 8)
        {
            i = 0;
        } 
        			     	      //循环扫描
    	m++; 
        if(m == 300) 
        {
            m = 0;
            n++;
        }		                  //滚动速度控制
    	if(n == num - 7)
        {
            n = 0;		          //循环显示
        }
    }
    
    void Timer0_init(void)
    {
        TMOD = 0xf8;
        TH0  = 0xcc;		
        TL0  = 0x00;
        IE   = 0x82;
        TR0  = 1;
    }
    
    void Timer0_intservice(void) interrupt 1 using 0
    {
        TH0 = 0xf8;
        TL0 = 0xcc;
    	Display();
    }
    
    
    void main (void)
    {
    	Timer0_init();
    	while(1);		
    }
    
    展开全文
  • 开发板led点阵模块电路图如下:     点阵内部led连接方式如下图: led点阵点亮图案仍然使用动态扫描的方式,方法同“51单片机实验5:动态数码管”...

    开发板led点阵模块电路图如下:

     

     

    点阵内部led连接方式如下图:

    led点阵点亮图案仍然使用动态扫描的方式,方法同“51单片机实验5:动态数码管”https://blog.csdn.net/cax1165/article/details/86557551

    D0口到D7口依次控制点阵的第8到1行(注意顺序),P0^0到P0^7口依次控制点阵的第8到1列(注意顺序)。

    显然,根据点阵内部led连接电路,74HC595控制高电平输出,P0口控制低电平输出。

    以移位寄存器74HC595控制段选,P0口控制位选!

    注意:写程序时需要考虑74HC595移位寄存器的工作特点。

    程序可参考“51单片机实验8:led点阵(1):点亮一个点 ”https://blog.csdn.net/cax1165/article/details/86607762

    #include<reg52.h>
    #include<intrins.h>
    #define uc unsigned char
    sbit srclk=P3^6;
    sbit rclk=P3^5;
    sbit ser=P3^4;
    uc ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
    uc ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
    void delay(uc x)
    {
    	uc i,j;
    	for(i=1;i<=x;i++)
    		for(j=1;j<=110;j++);
    }
    void c74hc595(uc dat)
    {
    	uc i;
        srclk=rclk=0;
    	for(i=1;i<=8;i++)
    	{
    		ser=dat>>7;
    		dat<<=1;
    		srclk=1;
    		_nop_();
    		srclk=0;
    	}
    	rclk=1;
    	_nop_();
    	rclk=0;
    }
    void main()
    {
    	uc i;
    	while(1)
    	{
    		//P0=0x7f;
            for(i=1;i<=8;i++)
    		{
    			P0=ledwei[i-1];
    			c74hc595(ledduan[i-1]);
    			delay(1);
    			c74hc595(0x00);
    		}
    	}
    }

     

    展开全文
  • 实验目的:用8*8的LED点阵显示一颗爱心。 实验仪器:普中开发板(非广告) 实验背景:出于一些原因,最近在看Arduino,但仍觉得51好玩。遂,一边看Arduino,一边整理51。 8*8的LED点阵电路如图一所示,有两种方式...

    实验目的:用8*8的LED点阵显示一颗爱心。

    实验仪器:普中开发板(非广告)

    实验背景:出于一些原因,最近在看Arduino,但仍觉得51好玩。遂,一边看Arduino,一边整理51。


    8*8的LED点阵电路如图一所示,有两种方式。单片机上集成的电路方式为第二种。

    其中,行由P0口控制,列由D7~D0(HC595芯片控制,见下方)控制。

    图一

    首先考虑,如何先点亮一个灯?

    eg:让P0^7的端口为低电平,P0的其他端口为高电平;D7的端口为高电平,则第一行第一列的led被点亮。

    同样的方式也可以,让其他单独的led点亮。

    接着考虑,如何控制多个led的点亮?

    类似与数码管的动态显示,利用余晖来进行动态显示。

    第一步:P0口先选通某一列,D7~D0控制这一列中哪些灯亮。

    第二步:动态显示每一列。

     

    为了减少单片机引脚的使用,这里使用了74HC595芯片。(注:图二中led的方向反了)。

    图二
    图三
    图四

    这图是丑的没法看了。但为了叙述清楚,目前也只能这样了。74HC595芯片详细的内容可以网上找,也可以直接评论区留言。

    HC595芯片的功能:串行输入,并行输出。

    看如何给芯片接线,并使用:(注:引脚上加一个“非横线”,表示低有效)

    1、D0~D7,并行输出,接LED。

    2、16号和8号引脚,分别接Vcc,Gnd。

    3、OE,13号引脚,低电平才输出有效,让它接地。

    4、10号引脚,主复位引脚,低有效。目前不需要复位,直接接VCC就好.

    5、14号引脚SER,接在集成板的P3^4,为串行输入端。

    6、11号引脚SRCLK,接在集成板的P3^6;上升沿时,将串行口RCLK的一位,移位输入。

    7、12号引脚RCLK,接在集成板的P3^5;上升沿时,将移入的8位数据,送到存储寄存器。

    上面的只是使用方法,如果还想继续深究,可以查看数电当中的串并行输入输出。

     

    代码:

    #include<reg51.h>
    #include<intrins.h>
    
    typedef unsigned char uchar;
    
    sbit SER=P3^4;//14号引脚,串行数据输入
    sbit SRCLK=P3^6;//11号引脚,移位寄存器时钟输入
    sbit RCLK=P3^5;//12号引脚,存储寄存器时钟输入
    
    uchar code lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//p0^7~p0^0,单片机中,p0^7是高位
    uchar code hang[]={0x00,0x38,0x3c,0x1e,0x1e,0x3c,0x38,0x00};//D7~D0
    
    
    void Hc595SendByte(uchar dat)
    {
    	int i; //编译可能有点老,变量的定义必须放在块的开头
    	SRCLK=0;//初始化
    	RCLK=0;	
    	for(i=0;i<8;i++)//从高位到低位,依次串行输入
    	{
    		SER=dat>>7;
    		dat<<=1;
    		SRCLK=1;//上升沿,将数据串行输入
    		_nop_();//一个机器周期
    		_nop_();
    		SRCLK=0;
    	}
    	RCLK=1;//上升沿,将数据送入存储寄存器
    	_nop_();//一个机器周期
    	_nop_();
    	RCLK=0;
    }
    
    void delay(int i)
    {
    	while(i--);	
    }
    
    void main(void)
    {
    	int i;
    	while(1)
    	{
    		for(i=0;i<8;i++)
    		{
    			P0=lie[i];//选通列
    			Hc595SendByte(hang[i]);//送入行
    			delay(100);
    			//Hc595SendByte(0x00);//消隐
    			P0=0xff;//消隐
    		}
    	}
    }
    

     

    补充:

    1、不是只有整数才分有符号数和无符号数。char,字符型也有,我感觉挺奇怪的,哈哈。  unsigned char

    2、我第一次写这个程序的头文件是#include<reg52.h>,但是总是报错,提示RCLK重定义。我仔细检查程序并没有发现重定义的地方。后来参看例程序,将头文件改成#include<reg51.h>,程序顺利通过。看来52的头文件中应该定义过该变量。就像P0一样。头文件reg51.h与reg52.h的区别

    3、按照C语言的标准,变量的定义必须放在块的开头。比如我将主函数中的int i放在for之前写,程序会报错。

    这个标准已近很老了,现在C99标准中,变量定义的位置比较随意了,只要使用之前定义就好了。(当然单单这么说不严谨,详细的可以去网上看看)

    4、今天win10刚装的Kail,端口和win7的有些不同。成功解决win10下单片机开发板驱动识别问题

    5、当然还有最后的结果

    图五

     


    用手机拍摄,还是能看到余晖,肉眼的效果还是很好的。

    拓展:这里每次显示的都是爱心,所以整体是一个静态爱心的形状。

               当如果动态显示的分别是I LOVE DOG,想来也是很好看。但是估计得16*16的尺寸。

    苟日新,日日新。

     

     

     

     

     

     

     

     

     

    展开全文
  • 代码及仿真原理图下载地址: ... 一、效果展示及连线方式 ...1、Proteus中8x8点阵   8x8点阵主要分为以下两种:   第一种为行共阴,第二种为行共阳   详细介绍可以参考这位大神说的: http...

    代码及仿真原理图下载地址:

    https://download.csdn.net/download/qq_41639829/10641349

    一、效果展示及连线方式

     

    注:制作动图时效果显示不好

     

    二、所用材料

    1、Proteus中8x8点阵

     

    8x8点阵主要分为以下两种:

     

    第一种为行共阴,第二种为行共阳

     

    详细介绍可以参考这位大神说的:

    http://www.51hei.com/bbs/dpj-31998-1.html

    在Proteus中我选择的是绿色的8x8的点阵,其类型是行共阴

     

    2、74hc595

    详细介绍见我上一篇文章

    https://blog.csdn.net/qq_41639829/article/details/82151706

    3、stc89c52

    可以选择其他单片机,我用的这个

     

    三、原理介绍

    1、点阵的 “静态显示”

    这里所说的静态显示就是不滚动画面的意思,比如你用点阵只显示一个数字,或者只显示一个心形。

    首先明白点阵显示的原理就相当于发光二极管一样,只不过是64个发光二极管罢了。

     

    假如你想让第一行全亮,应该怎么做?

    很简单,因为是行共阴,所以第一行首先接负极,其他行都接正极或者不接,然后每一列都接正极,这样就可以使第一行全亮。如果第二列不接正极,则第一行的第二列的灯就不会亮,就只亮七个灯。如果第二行这时接地,则第二行也会和第一行一样亮同样的七个灯(不懂得话看看上边的原理图)。

     

    假如你想显示心形应该怎么办?

    如果我们想显示上面的这个图形,可知,第一行和第八行是不需要接地的,其他的需要接地。

    但是看列,每一列都能用到。如果按照上面说的接线就是下图这个样子(不懂看原理图)。

    所以不能采取这种方法,我们采取“扫描”的方式,即一行一行的亮,也就是先第一行接地(其他行不接地),然后如果按照心形的图,就是所有都列都不接正极。然后接着第二行接地(其他行不接地),由心形图可知,需要第二、三、六、七列亮,则这几列接正。再往下是第三行,第三行再接地,然后第一、四、五、八列接正,依次往下。循环一圈后接着再第一行然后一直循环即可。

     

    或许大家会疑惑,假如第二行接地,只有第二行的几个灯亮,那么其他行都是暗的,怎么会看到心形呢,其实这个每一行的切换时间需要很短,几毫秒左右,利用人眼的视觉暂留效应(不懂得可以查一下)来显示,正所谓 ”眼见不一定为实“ 啊。

    2、点阵的滚动显示

    本实验应为行扫描即行选择端口,所以上下滚动显示,当然也可以左右,大家可以自己探索一下。

    滚动显示和静态类似,只不过差别是,在一次循环后回到第一行时,静态情况下是显示第一行应有的列,而滚动是显示上次循环第二行对应的列,第二行就显示第三行对应的列,依次往下,这样就相当于图形往上移了一个格。然后每次循环都说是这样,这样就滚动显示了。不懂可以再看代码。

     

    3、74hc595的原理

    详细原理见我上一篇文章

    https://blog.csdn.net/qq_41639829/article/details/82151706

     

    四、取模软件

    软件来源于网络(使用方法百度一下):

    链接:https://pan.baidu.com/s/1fRfJ_QPTqsN8LM9Npya_lQ 密码:avhl

    五、Proteus连线方式

    如下图:

    六、代码展示

    #include<reg52.h>
    #include<intrins.h>
    
    //intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用
    //OE	第13脚	输出有效(低电平)
    //MR	第10脚	主复位(低电平)
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    
    
    /**********管脚说明********************/
    #define P P1   //define 不用加;
    
    sbit SER = P3^4;    //p3.4串行数据输入   DS
    sbit SCK = P3^6;    //串行输入时钟,上升沿有效    SHCP	第11脚	数据输入时钟线
    sbit RCK = P3^5;    //串行寄存器时钟,上升沿有效  STCP	第12脚	输出存储器锁存时钟线
    
    /***********************************/
    
    /**********函数声明********************/
    void SendTo595(uchar byteData);
    /***********************************/
    
    /**********全局参数声明********************/
    char shu=0xFE;
    /***********************************/
    
    
    void delay(unsigned int n)//延时函数
    {
        unsigned int i=0,j=0;
        for(i=0;i<n;i++)
            for(j=0;j<123;j++);
    }
    
    void hang()//行扫描
    {
    	P=shu;
    	shu=_crol_(shu,1);
    }
    
    char a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,
    						0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,
    						0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,
    					  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    void main()
    {
      int i,b=0;
    	while(1)
    	{
    			int num=12;
    			while(num--)
    			{
    				for(i=0;i<8;i++)
    				{
    					hang();     //先位选再段选
    					SendTo595(a[i+b]);			
    					delay(3);
    				}
    				//P=0xFF;
    				//SendTo595(0x00);
    			}
    		  b++;
    			if(b>=24)b=0;
    			//P=0xFF;
    	 }	
    }
    
    
    
    //发送一个字节数据给595再并行输出
    void SendTo595(uchar Data)
    {
       int j=0;
       for(j;j<8;j++)
       {
    		    SCK = 0; 
            SER=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0 
            Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
            SCK = 1;          //上升沿让串行输入时钟变成高电平 并延时两个时钟周期
            _nop_();
    
       }  
       
       /*位移寄存器完毕,转移到存储寄存器*/
    	 
    	
    	 RCK = 0;
       RCK = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
       _nop_();
    	 RCK = 0;
    
    }

     

    展开全文
  • 51单片机(使用8x8点阵)

    2018-03-21 22:55:06
    2018/3/2151单片机1.说在前面今天初步学会了怎样使用面包板,感觉挺好玩的,学硬件的路渐行渐远吧2.74hc595模块(8位移位寄存器和一个存储器,三态输出功能)1.将三位串行输入变为并行输出2.数据先移位到最高点在...
  • 51单片机LED点阵

    2020-07-24 17:08:25
    通常应用较多的是 8* 8 点阵,然后使用多个 8 * 8 点阵可组成不同分辨率的 LED点阵显示屏,比如 16* 16 点阵可以使用 4 个 8* 8 点阵构成。因此理解了 8* 8LED点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样...
  • 感谢 大熙熙 的代码解析  ... 他对具体的代码做了形象的解释  ...由于部分代码解析还不够具体 融入了 个人对该代码的理解 ...我是参考普中单片机的源码(注释函数太少) 代码如下: #include
  • 单片机 LED点阵

    2018-06-01 18:15:55
    单片机 LED点阵一、简述 使用8×8LED点阵显示汉字。向上滚动"中华"两个汉字。 文件打包:链接: https://pan.baidu.com/s/1oHSAIY6qVA7qFFWUvMvJEA 密码: snyg二、效果三、工程文件结构1、Keil工程2、...
  • 单片机点阵屏动画

    2020-07-22 23:31:05
    单片机点阵屏动画,利用单片机显示字符、动画。
  • C51单片机点阵贪吃蛇代码(16*16点阵和8*8点阵都有)。keil4的完整工程文件夹,可以用红外遥控器控制蛇的上下左右移动,注释清楚,内附我用到的板子原理图以供移植参考。
  • 单片机点阵毕业设计

    2020-07-23 23:30:45
    本文介绍一种基于PIC16F877A[5]单片机控制系统,设计了16×48小型的LED点阵屏。此设计采用动态扫描方式,通过单片机控制3-8译码器74LS138和数据移位寄存器74HC595来驱动显示屏的显示,此方案实用简单,软件编程方便...
  • #include "main.h" //定义变量 unsigned char temp = 0xfe; unsigned char KEY_NUM = 0; unsigned char Display_word[4][4] = { 0x00,0x48,0x2A,0x8E,0xFB,0x0E,0x2A,0x48, /...0x0C,0x1E,0x3E,0x7C,0x7C,
  • 用于单片机字库的生成。单片机点阵模块字库的生成。
  • 单片机点阵静态显示

    2020-07-30 23:31:55
    基于C语言的C51单片机中的点阵静态显示的开发与应用。
  • 单片机点阵显示数据

    2020-06-28 21:31:07
    我们老师要求我们写一段话,这一段话挺长在 8*8 的点阵上显示“武汉是一座英雄的城市,武汉人民是英雄的人民”对应的拼音 字母,纵向移动,每 200ms 改变一张图片,然后不停地动态刷新(每 1ms 刷新一次)。...
  • 本PCB为个人课程设计所画,可以使用,上传部分不含代码,可...主控芯片为51单片机,使用74595和74138作为行列驱动,所用为共阳38*38mm点阵,市场上3、4块钱一个。建议焊接时用IC插座,点阵那里用母口排针,方便拔插。
  • 51单片机点阵实验

    2020-04-02 17:03:56
    1.1点阵实验图 P0控制列,P0输出低电平有效;74hc595输出控制行,输出高电平有效. 让P0^7的端口为低电平,P0的其他端口为高电平;D7的端口为高电平,则第一行第一列的led被点亮 1.2 74hc595的原理图 (1)D0...
  • 点阵 首先来介绍一下8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮; 如要将第一个点点亮,则 1 脚接高电平 a ...
  • 如何用51单片机来控制点阵和矩阵,可以让大家更好地了解51的工作情况。
  • 芯片74ls373的引脚G是怎么回事,接vcc点阵要亮,接GND不亮,给它高点平要亮,接低电平乱亮。(不接也要亮)我定义的是G=P3.2。
1 2 3 4 5 ... 20
收藏数 2,994
精华内容 1,197
关键字:

单片机点阵