当前位置:   article > 正文

51单片机实验05 -点阵

51单片机实验05 -点阵

目录

 一,熟悉矩阵led小灯

1,点亮矩阵的一只led

 2,点亮矩阵的一排led

3,点亮矩阵的全部led

static 关键字

unsigned 关键字

4,点阵的静态显示

 2)心形矩阵显示代码

3)效果

二,课后练习题

1、用点阵做一个9到0的倒计时牌显示。

1)效果

2)代码

2、尝试实现流水灯、数码管和点阵的同时显示。

1)效果

2)代码


资料见本文所在的专栏:

 一,熟悉矩阵led小灯

1,点亮矩阵的一只led

1)基础

2)代码 

  1. #include<reg52.h>
  2. sbit enled=P1^4; // 138译码器使能
  3. sbit addr3=P1^3;
  4. sbit addr2=P1^2;
  5. sbit addr1=P1^1;
  6. sbit addr0=P1^0;
  7. sbit led=P0^0; // 这里只点亮led点阵的左上角第一个led小灯
  8. void main(){
  9. enled=0; // 控制点阵led 的 U4(138)使能,需要e2低电平
  10. addr3=0; // 控制点阵led 的 U4(138)使能,需要e1低电平
  11. addr2=0; // y0输出低电平,使Q10晶体管开关打开,使led灯能够点亮
  12. addr1=0;
  13. addr0=0;
  14. led=0; // 控制一只小灯点亮
  15. while(1); // 长亮
  16. }

 3)效果

 2,点亮矩阵的一排led

1)基础

2)代码

  1. #include<reg52.h>
  2. sbit enled=P1^4; // 138译码器使能
  3. sbit addr3=P1^3;
  4. sbit addr2=P1^2;
  5. sbit addr1=P1^1;
  6. sbit addr0=P1^0;
  7. void main(){
  8. enled=0; // 控制点阵led的 U4(138)使能,需要e2低电平
  9. addr3=0; // 控制点阵led的 U4(138)使能,需要e1低电平
  10. addr2=0; // y0输出低电平,使Q10晶体管开关打开,使led灯能够点亮
  11. addr1=0;
  12. addr0=0; // 选择了第1行的led
  13. P0=0x00; // 控制列上的led,如果写成0x01,则左边第一列不亮,剩下其它列的led亮
  14. while(1); // 长亮
  15. }

3)效果

3,点亮矩阵的全部led

1)代码

下面用到了定时器及中断器(在单片机中带有break关键字的switch语句和中断器是绝配,天造地设的一对)一旦中断器检测到break关键字,就会停下来。在动态显示中,不管是点阵还是数码管点亮的持续时间通常为1ms左右,然后切换到下一个数码管。这意味着在1ms的时间内,数码管应该能够完成从关闭到完全点亮,再到关闭的完整过程。就会有“鬼影”,即会有视觉残留,我们会看到小灯有明显的亮暗波动,所以定时器和中断器的使用就很有必要。

  1. #include<reg52.h>
  2. sbit enled=P1^4; // 138译码器使能
  3. sbit addr3=P1^3;
  4. sbit addr2=P1^2;
  5. sbit addr1=P1^1;
  6. sbit addr0=P1^0;
  7. void main(){
  8. enled=0; // 控制点阵led 的 U4(138)使能,需要e2低电平
  9. addr3=0; // 控制点阵led 的 U4(138)使能,需要e1低电平
  10. EA=1; // 总使能中断打开
  11. ET0=1; // 定时器T0使能中断打开
  12. TMOD=0x01; // 定时器T0的模式为1
  13. TH0=0xFC; // 定时1ms
  14. TL0=0x67;
  15. TR0=1; // 开启定时器T0
  16. while(1); // 长亮
  17. }
  18. void InterrutpTimer0() interrupt 1{ // 中断服务函数
  19. static unsigned char rowmilisec=0; // 用于存储亮起的行,且是每一毫秒亮一行
  20. TMOD=0x01; // 只要有溢出造成的中断,就将T0初始值重新赋值
  21. TH0=0xFC;
  22. P0=0xFF; //关闭段
  23. switch(rowmilisec){
  24. case 0:addr2=0;addr1=0;addr0=0;P0=0x00;rowmilisec++;break;
  25. case 1:addr2=0;addr1=0;addr0=1;P0=0x00;rowmilisec++;break;
  26. case 2:addr2=0;addr1=1;addr0=0;P0=0x00;rowmilisec++;break;
  27. case 3:addr2=0;addr1=1;addr0=1;P0=0x00;rowmilisec++;break;
  28. case 4:addr2=1;addr1=0;addr0=0;P0=0x00;rowmilisec++;break;
  29. case 5:addr2=1;addr1=0;addr0=1;P0=0x00;rowmilisec++;break;
  30. case 6:addr2=1;addr1=1;addr0=0;P0=0x00;rowmilisec++;break;
  31. case 7:addr2=1;addr1=1;addr0=1;P0=0x00;rowmilisec=0;break;
  32. }
  33. }

在51单片机中,总使能中断EAEnable All Interrupt的缩写。具体来说,EA是中断允许寄存器(IE寄存器)中的一个位,用于控制是否允许CPU响应所有中断请求。

  • 当EA=0时,CPU会屏蔽所有中断请求,即不会响应任何中断。
  • 当EA=1时,CPU会开放所有中断请求,即会根据其他中断使能位(如ES、ET0、ET1、EX0、EX1等)的设置来响应相应的中断。

static 关键字

在函数内部声明一个变量为 static 时,该变量的生命周期会持续到程序执行完毕,而不是在函数返回时结束。此外,static 变量只会初始化一次,即当程序开始运行时。在后续的函数调用中,该变量会保持其上一次被修改后的值。

在中断服务函数 InterrutpTimer0 中,rowmilisec 被声明为 static 是为了确保它能在每次中断调用之间保持其值。这是一个定时器中断,它会在定时器溢出时定期被调用。由于 rowmilisec 用于跟踪已经过去的毫秒数(或行),所以需要它在每次中断之间保持其值,以便知道下一行应该是什么。

unsigned 关键字

unsigned 关键字指定了一个整数类型,它只能存储非负值。与 signed 类型(如 int)相比,unsigned 类型没有符号位,因此它可以存储两倍于相同大小 signed 类型的正数。

在上面的代码中rowmilisec 被用来作为一个计数器,从 0 计数到 7,然后回到 0。由于这个值永远不会是负数,所以使用 unsigned char 是合适的。这不仅可以确保值始终是非负的,而且还可以节省一个位(符号位)

2)效果

4,点阵的静态显示

1)基础 

经过点亮点阵的一只led,一排led,全部led灯相关操作,现在我们开始来让其静态的展示我们指定的图案。要绘制图案,就需要使用到《点阵液晶取模》程序。

对应软件及资源的网盘连接,见本文专栏。之后下载app里面的字模软件即可,如下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/712462
推荐阅读
相关标签