找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4283|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机LED点阵亮度太低如何解决?

[复制链接]
跳转到指定楼层
楼主
ID:834099 发表于 2020-10-24 19:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在尝试写一个C51程序来使整个LED点阵都亮起来,但是我的亮度相比运行示例代码的亮度差得很远。下面是单片机示例代码:

  1. #include <reg52.h>
  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. void main()
  8. {
  9. EA = 1; //使能总中断
  10. ENLED = 0; //使能 U4,选择 LED 点阵
  11. ADDR3 = 0; //因为需要动态改变 ADDR0-2 的值,所以不需要再初始化了
  12. TMOD = 0x01; //设置 T0 为模式 1
  13. TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms
  14. TL0 = 0x67;
  15. ET0 = 1; //使能 T0 中断
  16. TR0 = 1; //启动 T0
  17. while (1); //程序停在这里,等待定时器中断
  18. }
  19. /* 定时器 0 中断服务函数 */
  20. void InterruptTimer0() interrupt 1

  21. {
  22. static unsigned char i = 0; //动态扫描的索引
  23. TH0 = 0xFC; //重新加载初值
  24. TL0 = 0x67;
  25. //以下代码完成 LED 点阵动态扫描刷新
  26. P0 = 0xFF; //显示消隐
  27. switch (i)
  28. {
  29. case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
  30. case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
  31. case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
  32. case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0x00; break;
  33. case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
  34. case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
  35. case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
  36. case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=0x00; break;
  37. default: break;
  38. }
  39. }
复制代码
这是我写的代码,区别主要在用了for循环
  1. #include <reg52.h>
  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;

  7. unsigned char code addr2[] = {0,0,0,0,1,1,1,1};
  8. unsigned char code addr1[] = {0,0,1,1,0,0,1,1};
  9. unsigned char code addr0[] = {0,1,0,1,0,1,0,1};



  10. void main()
  11. {
  12.         EA = 1;
  13.         ENLED = 0;
  14.         ADDR3 = 0;
  15.         TMOD = 0x01;
  16.         TH0 = 0xFC;
  17.         TL0 = 0x67;
  18.         ET0 = 1;
  19.         TR0 = 1;

  20.         while(1);
  21. }

  22. void InterruptTimer0()  interrupt 1
  23. {
  24.         unsigned char i = 0;
  25.         TH0 = 0xFC;
  26.         TL0 = 0x67;
  27.         P0 = 0xFF;
  28.         for (i=0; i<8; i++){
  29.         ADDR0 = addr0[i];
  30.         ADDR1 = addr1[i];
  31.         ADDR2 = addr2[i];
  32.         P0 = 0x00;
  33.         }
  34.         P0 = 0xFF;
  35. }
复制代码



希望能有大神指点指点



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:213173 发表于 2020-10-25 17:13 | 只看该作者
楼主不要在一次中断中显示8行8列。每次中断只显示1行,分8次中断完成1屏。注意消隐码放在开始,结束时不要消隐,显示时间才可保持到下次中断。这样每行显示时间略小于中断周期就不会很暗了。
回复

使用道具 举报

板凳
ID:332444 发表于 2020-10-25 07:30 | 只看该作者
要知道循环与switch 是不同的switch 要等待中断,而循环不需要等待要循环完成的。
回复

使用道具 举报

地板
ID:234355 发表于 2020-10-25 08:07 | 只看该作者
例子是1ms显示一个数位,轮流8ms一个周期,每个位都是均匀的。你是1ms显示8个数位,而且前面0-6位时间都很短只用几个us,只有位7停留时间长点。
回复

使用道具 举报

5#
ID:420836 发表于 2020-10-25 09:43 | 只看该作者
如果LED太暗,则可能是由于硬件。 检查接线或更换较小的电阻器。
回复

使用道具 举报

6#
ID:834375 发表于 2020-10-25 17:26 | 只看该作者
感谢感谢,这个困扰了我很久
回复

使用道具 举报

7#
ID:834099 发表于 2020-10-25 20:29 | 只看该作者
xianfajushi 发表于 2020-10-25 07:30
要知道循环与switch 是不同的switch 要等待中断,而循环不需要等待要循环完成的。

谢谢解答。就是说switch凭借静态变量i能够让一排小灯亮1ms,而for很快的结束了循环。
回复

使用道具 举报

8#
ID:834099 发表于 2020-10-25 20:31 | 只看该作者
wanghz12 发表于 2020-10-25 08:07
例子是1ms显示一个数位,轮流8ms一个周期,每个位都是均匀的。你是1ms显示8个数位,而且前面0-6位时间都很 ...

感谢解答。事实上我刚开始写的时候确实是这样的,但是我后来在第40行添加了那句
  1. P0=0xFF;
复制代码

关掉了最后一行,所以所有的小灯都很暗。
回复

使用道具 举报

9#
ID:834099 发表于 2020-10-25 20:33 | 只看该作者
TTQ001 发表于 2020-10-25 09:43
如果LED太暗,则可能是由于硬件。 检查接线或更换较小的电阻器。

谢谢。硬件没有问题的,示例代码运行结果很好。是我的代码的问题,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表