精华内容
下载资源
问答
  • 基于protues 51单片机 led点阵贪吃蛇 ,有仿真电路图。 里面的程序速度没有调好,懒的调了, 这个程序没有注释,可以到http://download.csdn.net/detail/wlx1993/5585159下载我写的另一个“基于普中实验板 51单片机 ...
  • 基于普中实验板 51单片机 led点阵贪吃蛇,初学者单片机的可以参考下
  • 51单片机LED点阵显示文字

    千次阅读 2018-01-14 22:31:51
    51单片机LED点阵显示文字 代码如下。 #include #define u8 unsigned char sbit SER = P3^4; sbit RCLK = P3^5; sbit SCLK = P3^6;  //横向 D0->D7 u8 tao[32]={8,240,8,15,8,136,126,145,8,82,8,2,62,8,8,231,8,...

    51单片机LED点阵显示文字 代码如下。

    #include <REGX51.H>

    #define u8 unsigned char
    sbit SER = P3^4;
    sbit RCLK = P3^5;
    sbit SCLK = P3^6; 

    //横向 D0->D7

    u8 tao[32]={8,240,8,15,8,136,126,145,8,82,8,2,62,8,8,231,8,129,126,129,72,231,72,129,88,129,40,129,8,255,8,129};


    u8 heng[32]=
    {
    0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,
    0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,
    0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,
    0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00
    };
    void display(u8 zimo[],u8 heng[]);
    void sendData(u8 d1, u8 d2, u8 d3, u8 d4);


    void main(void)
    {
    display(tao,heng); 
    }


    void display(u8 zimo[],u8 heng[])
    {
    unsigned char i;
    for (i=0;i<16;i++)
    {
    sendData(~zimo[2*i+1],~zimo[2*i],heng[2*i],heng[2*i+1]);
    }

    }


    void sendData(u8 d1, u8 d2, u8 d3, u8 d4)
    {


    u8 i;
    RCLK = 0;
    SCLK = 0;
    for(i=0;i<8;i++)
    {
    SER = d1>>7; //往74HC595的串口送信
    SCLK = 0;
    SCLK = 1;  //74HC595的移位
    d1 = d1 << 1;
    }
    // d1送到了74HC595A

    for(i=0;i<8;i++)
    {
    SER = d2>>7; //往74HC595的串口送信
    SCLK = 0;
    SCLK = 1;  //74HC595的移位
    d2 = d2 << 1;
    }
    // d1送到了74HC595B,d2送到了74HC595A


    for(i=0;i<8;i++)
    {
    SER = d3>>7; //往74HC595的串口送信
    SCLK = 0;
    SCLK = 1;  //74HC595的移位
    d3 = d3 << 1;
    }
    // d1送到了74HC595C,d2送到了74HC595B,d3送到了74HC595A


    for(i=0;i<8;i++)
    {
    SER = d4>>7; //往74HC595的串口送信
    SCLK = 0;
    SCLK = 1;  //74HC595的移位
    d4 = d4 << 1;
    }
    // d1送到了74HC595D,d2送到了74HC595C,
    // d3送到了74HC595B,d4送到了74HC595A


    RCLK = 0;
    RCLK = 1;//74HC595 锁存,往LED点阵送信
     

    }

    图片如下



    展开全文
  • 51单片机LED点阵实验(74HC595)

    万次阅读 多人点赞 2018-11-29 21:05:21
    实验目的:用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的尺寸。

    苟日新,日日新。

     

     

     

     

     

     

     

     

     

    展开全文
  • 实验目的:用8*8的LED点阵显示数字10

    实验目的:用8*8的LED点阵显示数字10

    代码如下:

    #include<reg51.h>
    #include"intrins.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit SRCLK = P3^6;
    sbit RCLK = P3^5;
    sbit SER = P3^4;
    
    u8 a;
    u16 code c[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
    u16 code b[]={0xfe,0x00,0x00,0x00,0xfe,0x82,0x82,0xfe};
    
    void delay(u16 i)
    {
    	while(i--);
    }
    
    
    void Hc595sendByte(u8 dat)
    {
    	u8 a;
    	SRCLK=0;							
    	RCLK=0;                
    	for(a=0;a<8;a++) 
    	{
    		SER=dat>>7;
    		dat<<=1; 
    		SRCLK=1;
    		_nop_();
    		_nop_();
    		SRCLK=0;	     
    	}
    	RCLK=1;
    	_nop_();
    	_nop_();
    	RCLK=0;     
    }
    
    void main()
    {
    		P0=0xff;
    		while(1){
    		for(a=0;a<8;a++){
    				P0=c[a];
    				Hc595sendByte(b[a]);
    	}
    }	
    }
    

    结果

    在点阵上显示的数字10会发现有重影效果
    经过一番测试,用延时等方法还是没有

    我最开始的时候是利用P0=0xff来解决发现还是会有
    既然不是列的问题,那么就应该找行的问题的
    加上了
    Hc595sendByte(0x00);
    发现问题得到了解决

    void main()
    {
    		P0=0xff;
    		while(1){
    		for(a=0;a<8;a++){
    				P0=c[a];
    				Hc595sendByte(b[a]);
    				P0=0xff;
    				Hc595sendByte(0x00);	
    	}
    }	
    

    学习的道路还是遥远,但绝对不会孤独

    展开全文
  • 51单片机 LED点阵的呼吸灯效果

    千次阅读 2014-12-03 23:01:27
    //选中LED点阵 configPWM(1000, dutyCycle[0]); //配置并启动PWM for (i = 0; i ; i++) calcRldVal(i); configTmr1(50); //用T1定时调整占空比 while (1); } /* 配置并启动T1,ms-定时时间 */ void ...
    #include <reg52.h>
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    typedef unsigned long ulong;
    
    sbit ADDR0 = P1^0;
    sbit ADDR1 = P1^1;
    sbit ADDR2 = P1^2;
    sbit ADDR3 = P1^3;
    sbit ENLED = P1^4;
    
    ulong periodCnt = 0;  //PWM周期计数值
    uchar highRH = 0;  //高电平重载值的高字节
    uchar highRL = 0;  //高电平重载值的低字节
    uchar lowRH  = 0;  //低电平重载值的高字节
    uchar lowRL  = 0;  //低电平重载值的低字节
    uchar T1RH = 0;    //T1重载值的高字节
    uchar T1RL = 0;    //T1重载值的低字节
    
    uchar code dutyCycle[13] = {  //占空比调整表
    	5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95
    };
    uchar code image[8] = {
        0x81,0x81,0xE7,0xC3,0xC3,0xE7,0x81,0x81
    };
    uchar hRHi[13], hRLi[13], lRHi[13], lRLi[13];
    
    void configTmr1(uint ms);
    void configPWM(uint fr, uchar dc);
    void calcRldVal(uchar idx); 
    
    void main() {
    	uchar i;
    
        EA = 1;     //开总中断
        ADDR3 = 0;	//选中LED点阵
    	configPWM(1000, dutyCycle[0]);  //配置并启动PWM
    	for (i = 0; i < 13; i++)
        	calcRldVal(i);
        configTmr1(50);    //用T1定时调整占空比
        while (1);
    }
    /* 配置并启动T1,ms-定时时间 */
    
    void configTmr1(uint ms) {
        ulong tmp;  //临时变量
    
        tmp = 11059200 / 12;      //定时器计数频率
        tmp = (tmp * ms) / 1000;  //计算所需的计数值
        tmp = 65536 - tmp;        //计算定时器重载值
        tmp = tmp + 12;           //补偿中断响应延时造成的误差
        T1RH = tmp >> 8;  //定时器重载值拆分为高低字节
        T1RL = tmp;
    
        TMOD &= 0x0F;   //清零T1的控制位
        TMOD |= 0x10;   //配置T1为模式1
        TH1 = T1RH;     //加载T1重载值
        TL1 = T1RL;
        ET1 = 1;        //使能T1中断
        TR1 = 1;        //启动T1
    }
    /* 配置并启动PWM,fr-频率,dc-占空比 */
    void configPWM(uint fr, uchar dc) {
        uint high, low;
    
        periodCnt = 11059200 / 12 / fr; //计算一个周期所需的计数值
        high = periodCnt * dc / 100;    //计算高电平所需的计数值
        low  = periodCnt - high;        //计算低电平所需的计数值
        high = 65536 - high + 12;       //计算高电平的定时器重载值并补偿中断延时
        low  = 65536 - low  + 12;       //计算低电平的定时器重载值并补偿中断延时
        highRH = high >> 8; //高电平重载值拆分为高低字节
        highRL = high;
        lowRH  = low >> 8;  //低电平重载值拆分为高低字节
        lowRL  = low;
    
        TMOD &= 0xF0;   //清零T0的控制位
        TMOD |= 0x01;   //配置T0为模式1
        TH0 = highRH;   //加载T0重载值
        TL0 = highRL;
        ET0 = 1;        //使能T0中断
        TR0 = 1;        //启动T0
    }
    /* 占空比调整函数,频率不变只调整占空比 */
    void calcRldVal(uchar idx) {
        uint  high, low;
    
        high = periodCnt * dutyCycle[idx] / 100;    //计算高电平所需的计数值
        low  = periodCnt - high;        //计算低电平所需的计数值
        high = 65536 - high + 12;       //计算高电平的定时器重载值并补偿中断延时
        low  = 65536 - low  + 12;       //计算低电平的定时器重载值并补偿中断延时
        hRHi[idx] = high >> 8; //高电平重载值拆分为高低字节
        hRLi[idx] = high;
        lRHi[idx] = low >> 8;  //低电平重载值拆分为高低字节
        lRLi[idx] = low;
    }
    
    void LED1_Scan() {
        static uchar i = 0;
        P0 = 0xFF;
        P1 = (P1 & 0xF8) | i;
        P0 = image[i];
        i = ++i & 0x07;
    }
    /* T0中断服务函数,产生PWM输出 */
    void interruptTimer0() interrupt 1 {
        if (ENLED == 1) {
            TH0 = lowRH;
            TL0 = lowRL;
            ENLED = 0;
    		LED1_Scan();
        }
        else {
            TH0 = highRH;
            TL0 = highRL;
            ENLED = 1;
        }
    }
    /* T1中断服务函数,定时动态调整占空比 */
    void interruptTimer1() interrupt 3 {
        static bit dir = 0;
        static uchar index = 0;
        
        TH1 = T1RH;  //重新加载T1重载值
        TL1 = T1RL;
        highRH = hRHi[index];
    	highRL = hRLi[index];
    	lowRH = lRHi[index];
    	lowRL = lRLi[index];
        if (dir == 0) {
            index++;
            if (index == 12)
                dir = 1;
        }
        else {
            index--;
            if (index == 0)
                dir = 0;
        }
    }
    

    展开全文
  • ;预定义 SER BIT P1.4 SCLR BIT P1.5 SRCLK BIT P1.6 RCK BIT P1.7;主程序 org 0000h ljmp start org 0100h start: mov dptr,#tab mov r2,#05...
  • 51单片机led点阵代码
  • 单片机 LED点阵

    千次阅读 多人点赞 2018-06-01 18:15:55
    单片机 LED点阵一、简述 使用8×8LED点阵显示汉字。向上滚动"中华"两个汉字。 文件打包:链接: https://pan.baidu.com/s/1oHSAIY6qVA7qFFWUvMvJEA 密码: snyg二、效果三、工程文件结构1、Keil工程2、...
  • 51单片机LED点阵屏设计51单片机LED点阵屏设计
  • 基于51单片机LED点阵学习攻略,详细介绍了各种开发的情况。
  • 51单片机LED点阵

    2020-07-24 17:08:25
    LED点阵 LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随处可见,被广泛应用于汽车报站器,广告屏等。 通常应用较多的是 8* 8 点阵,然后使用多个 8 * 8 点阵可组成不同分辨率的 LED点阵显示屏...
  • 为了LED点阵显示屏显示的信息可以方便更新,提出了一种基于P89V51RD2单片机LED显示屏的的设计方案,并完成了系统的软硬件设计。该系统的硬件部分主要有单片机、移位寄存器、译码器以及数据存储器等部分组成;软件有...
  • Protues仿真实例-51单片机-LED点阵.rar
  • 51单片机点亮LED点阵

    千次阅读 2019-03-24 22:46:33
    Led点阵就是很多led放在一起组成的矩阵灯。原理很简单,如果我们要点亮图中左上的绿灯。那么管脚5接高电平,管脚24接低电平,那么这个绿色led就会亮,其他的led亦是如此。我们要显示需要的内容,只要点亮相关内容...
  • 51单片机88点阵LED显示原理及程序
  • 51单片机LED

    2018-01-09 14:22:01
    51单片机LED点阵示例程序。根据电路的不同需要修改程序。
  • LED点阵屏发光亮度强,指示效果好,可以制作运动的发光图文,更容易吸引人的注意力,信息量大,随时更新,有着非常好的广告和告示效果。笔者此处就LED点阵屏动态扫描显示作一个简单的介绍。 1. LED点阵屏显示...
  • 51单片机LED16X16点阵滚动显示51单片机LED16X16点阵滚动显示51单片机LED16X16点阵滚动显示
  • 51单片机LED点阵

    2020-09-10 10:08:22
    这次的程序是通过控制LED点阵,点亮一个+号。我们使用的是一个8×8的电子,需要操作16bit,实现对行和列的管理,这点其实和矩阵按键是有些类似,只不过一个是输入,一个是输出,都是通过逐行扫描实现的(矩阵按键...
  • 基于51单片机点阵显示,适合初学者的简单程序。
  • 使用Proteus7.8实现LED点阵显示的仿真。可以显示一行四个汉字,有跑马滚动显示文字效果。可以显示多于4字的整行文字。提供仿真图,源代码。 注意,仿真时宏定义要修改一下,如下所示: //因为仿真时延时要短些,所以...
  • 单片机LED点阵万年历

    2013-08-06 08:14:28
    LED点阵单片机万年历 ---- snallie@tom.com 2013.01 ---- 特点: 0. 电路简洁,并口直接驱动,51最小系统+74hc259 0.0 采用单片机芯片定时器计时,无需RTC芯片(预留RTC芯片代码). 1. 阳历:年、月、日、时、分、秒...
  • 非常简单易懂 51单片机程序教程 led点阵显示 基础的点阵显示教程
  • 51单片机88点阵LED显示原理及程序.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 545
精华内容 218
关键字:

51单片机led点阵