使用51单片机点亮我们的点阵灯

发布者:EnchantedWish最新更新时间:2020-05-04 来源: eefocus关键字:51单片机  点亮  点阵灯 手机看文章 扫描二维码
随时随地手机看文章

通过前面我们都知道点亮我们的不管是点阵,数码管,还是LED灯,不仅要熟悉我们的代码还要会看我们的原理图和真值表,所以我们如果真的要写代码倒是其次的,首先我们得学会看我们的原理图和真值表,但是认识那个我们可以在网上找教程的,所以啊我这里就不去重诉别人的话了。那么我们今天要讨论什么问题勒!?我们今天讲一下点阵吧,点阵说实话对于单片机来说虽然并不是最重要的,但是点阵却是我们单片机中花样最多的之一。可能说到这么有人会说了,学了单片机我们有什么用呢,那么我们可以留意一下我们身边的一些物品,比如我们常在街上可以看见一些商店利用那些LED灯做出的花样,什么闪烁啊,各种图形变化啊,其实和我们的点阵原理都很像,不过他们那些控制的位更多,而我们51 单片机操作的位少一些,只有八位而已。但是我们其实把他的原理弄懂了我们学其他的或者操作更多的位也是很容易的。


我们其实刚开始我们学习51单片机上面的点阵可能会疑惑,我们照着老师的代码敲我们可以点亮他说的灯,但是我们通过原理图来点亮我们的灯却不是那么容易,为什么呢?或许我们细心的同学会发现我们要点亮的灯和我们的代码所写不一样,不一样在什么地方呢?每一排的位操作挺好像是相反的。那么前面的疑惑我们就解决了,我们要操作的点阵和我们的代码点亮是相反的!在我们的51单片机中我们0称做低电平,而1被叫做高电平,低电平是将灯点亮,高电平不亮。我们正对单片机如果我们要点阵第一个灯,那么我们我们要写的代码是P0=0x01;而转换成二进制就是0000 0001(这里我们可以在网上去看2进制和16进制相互转换的一些资料)我们可以知道的是他和我们设想的有些差别,比如我们就是要点亮第一排第一个灯,输入了P0=0x01我们却看见和我们的二进制数不符合,就像我们的灯一样每个灯就是我们的一个位,每个灯有两种状态,一个是1,另一个就是0。实际上我们就可以得出结论操作我们的灯就是操作我们的二进制。那么可以看一下我们的代码,来验证我们的猜想:


/*点亮我们的点阵第一排第一个灯*/

#include

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延时函数

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

P0=0x01;

dz(0,0,0,1);

delay(300);//延时函数的调用

}

 

其实我们的点阵的灯就是操作我们的一个八位数的位,每个灯就是一位,因为我们点阵就是一排八个灯(这个一定得记住)那么我们知道了点亮我们的点阵第一排第一个,我们可不可以点亮我们的点阵第一排呢?!代码如下:

/*点亮我们的点阵第一排灯*/

#include

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延时函数

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

P0=0x00;

dz(0,0,0,1);

delay(300);//延时函数的调用

}

其实代码都差不多,就是我们怎么用了,那么思考我们想多点几排呢?比如我们就要“同时”点亮两排三排或者更多呢?记住我们 一定得看真值表!

代码如下:

/*点亮我们的点阵第一排第一个灯*/

#include

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延时函数

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

//第一行

P0=0x00;

dz(0,0,0,1);

delay(300);//延时函数的调用

//第二行

dz(0,0,0,1);

P0=0x00;

delay(300);

}

我们知道了一些点阵的原理那么我们就来尝试点亮我们全部数码管呗:

#include

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延时函数

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main(){

while(1){
//第一行
LSD(0,0,0,0);
P0=0x00;
delay(300);
//第二行
LSD(0,0,0,1);
P0=0x00;
delay(100);
//第三行
LSD(0,0,1,0);
P0=0x00;
delay(100);
//第4行
LSD(0,0,1,1);
P0=0x00;
delay(100);

//第5行
LSD(0,1,0,0);
P0=0x00;
delay(100);
//第6行
LSD(0,1,0,1);
P0=0x00;
delay(100);
 //第7行
LSD(0,1,1,0);
P0=0x00;
delay(100);

//第8行
LSD(0,1,1,1);
P0=0x00;
delay(100);
                }

}

大家可以自己将代码复制在自己的程序中看一下代码和我说的效果有什么差别没有。

其实我们有没有想过我们该如何将我们的点阵对角线点亮一行呢?

#include

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延时函数

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

while(1)

{

  //第一行第一颗
             dz(0,0,0);
             P0=0xFE;
             delay(100);
            
                //第2行第2颗
             dz(0,0,1);
             P0=0xFD;
             delay(100);

               //第3行第3颗
             dz(0,1,0);
             P0=0xFB;
             delay(100);

             //第4行第4
             dz(0,1,1);
             P0=0xF7;
             delay(100);

             //第5行第 5
             dz(1,0,0);
             P0=0xEF;
             delay(100);

             //第6行第 6
             dz(1,0,1);
             P0=0xDF;
             delay(100);

             //第7行第7
             dz(1,1,0);
             P0=0xBF;
             delay(100);

             //第8行第8
             dz(1,1,1);
             P0=0x7F;
             delay(100);

}

}

关键字:51单片机  点亮  点阵灯 引用地址:使用51单片机点亮我们的点阵灯

上一篇:用51单片机实现爱心跑马灯程序
下一篇:51单片机基础点亮第一个LED实验

推荐阅读最新更新时间:2024-11-04 10:49

51单片机-指针方法-串口实例
1. 指针 变量a的指针=变量a的地址 再定义一个变量p,来存放a的地址(指针),p就是指针变量,简称指针 1.1 指针声明的两种方式 //直接初始化赋值 unsigned char a; unsigned char *p = //定义后再进行赋值 unsigned char a; unsigned char *p; P = 1.2 两个重要区别(P194) 第指针变量p与普通变量a的区别: a可直接赋值,p要赋地址 定义指针变量*p和取值运算*p的区别 *的三种用法: num = a * b; //乘号 unsigned char *p; //定义指针变量 num = *p; //取值运算,取p指向
[单片机]
TQ210裸机编程(1)——点亮一个LED
题外话:为什么要学习裸机编程? 学习裸机编程是为以后学习u-boot移植和内核驱动做铺垫的。 如果你只做应用编程的话,那就不必学习裸机编程。 首先查看TQ210的底板原理图 从原理图可知两个LED分别接在S5PV210的GPC0_3和GPC0_4 要点亮LED1,则需要在GPC0_3引脚输出高电平,使三极管Q1导通 如果以前学过arm编程的应该知道,需要设置GPC0_3为输出 查看S5PV210芯片手册 从这里可知,需要设置GPC0CON寄存器的 为0b0001,使GPC0_3为输出模式 代码如下 ldr r0, =0xE0200060 @GPC0CON寄存器 ldr r1, =0x00001000 str r1,
[单片机]
TQ210裸机编程(1)——<font color='red'>点亮</font>一个LED
LED照明全方位渗透,点亮高能效驱动方案前景
在当今电能需求与生产日趋失衡的条件下,最有效的因应途径就是提升能效,即利用技术,以更少的电能来执行相同的任务或功能。电能使用涉及众多的领域,以常见的建筑物为例,据有关资料统计,美国建筑物总能耗中约有30%的能耗源自照明领域,而中国的估计也达到约11%至12%。由此看来,照明域的节能潜力巨大。 安森美半导体LED通用照明及电源营销和系统工程总监Laurent Jenck(郑乐康)指出,以一款典型的100 W白炽灯为例,其中约有95 W的电能转化为热量,剩余的仅5 W电能转化为光。因此,世界上许多国家都开始逐步淘汰一般的白炽灯,鼓励使用节能灯。与白炽灯相比,紧凑型荧光灯(CFL)和线性荧光灯(LFL)等节能灯
[电源管理]
LED照明全方位渗透,<font color='red'>点亮</font>高能效驱动方案前景
基于51单片机的数字电压表仿真设计
   引言   随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。数字电压表是采用数字化测量技术设计的电压表。数字电压表与模拟电压表相比,具有读数直观、准确、显示范围宽、分辨力高、输入阻抗大、集成度高、功耗小、抗干扰能力强,可扩展能力强等特点,因此在电压测量、电压校准中有着广泛的应用。  Proteus软件是一种电路分析和实物模拟仿真软件。它运行于Windows操作系统上,可以进行仿真、分析(SPICE)各种模拟器件和集成电路,是集单片机和SPICE分析于一身的仿真软件,功能强大,具有系统资源丰富、硬件投入少、形象直观等优点,近年来
[单片机]
基于<font color='red'>51单片机</font>的数字电压表仿真设计
51单片机:定时器
定时器:单条指令时间(us) = 1/单片机频率*单条指令时钟周期 TH0和TL0共16位,最多只能表示65535,所以要设定一个Base值,再利用循环多计数几次 比如0.002s:0.02 = (1/11.0592M * 12)*指令个数,指令个数 = 0.02(1/11.0592M * 12) = 0.018432 因为频率用的是M,所以结果0.018432*1000000 = 18432 使用16位寄存器的情况下,TH0和TL初始值:65536 - 18432 = 47104 = 0xB8 00 编写定时器延时函数: #include sbit LED = P0^0; void Delay(un
[单片机]
用89C2051单片机制作的电话回拨器
  该电话回拨器采用单片机控制,具有电路简单、接触可靠、使用方便等优点。   一、工作原理   电路见附图所示,系统由摘机,挂机电路、单片机拨号控制电路、DTMF号码产生及放大电路、电源电路等四部分组成,下面分别予以介绍   1.摘机/挂机电路   图中,J1为电话线进线插座,J2为该装置所并联的电话机插座,Rl为保险电阻;DI—D4为极性保护电路,用于将线路上极性不确定的电压转换成极性固定的电压,保证无论电话线的正负极如何连接,都能使进入开关管VI发射极的一端始终是正电压;V1是电子开关,该开关的通、断受单片机P3.7口控制,当P3.7为高电平时.V2、VI相继导通,电话线路上的48V电压通过VI加到R5两端,电话线上有
[单片机]
用89C20<font color='red'>51单片机</font>制作的电话回拨器
51单片机实验——输出周期为200ms的方波
1.实验题目: 利用定时器T0的16位不可重加载模式,编制一段程序,只有当INT0(P3.2)引脚输出高电平时,在P1.6输出一个方波控制一个指示灯。设单片机的时钟为12MHz,输出周期为200ms的方波,观察指示灯的变化。 2.KEIL代码 #include reg51.h sbit OUT=P1^6; sbit P32=P3^2; void Int0_Init(); void main() { Int0_Init(); TMOD &=0X0F; TMOD |=0x09;//选择定时器T0的工作模式1 TH0 = (65536 - 50000)/256;//高四位初值 TL0 = (65536 - 5
[单片机]
<font color='red'>51单片机</font>实验——输出周期为200ms的方波
51单片机教程:单片机寻址方式与指令系统
通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习8051单片机的指令部份。 一、概述 1、指令的格式 我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,助记符格式,如MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。 2、汇编 我们写指令使用
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved