欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī)LED點(diǎn)陣亮度太低如何解決? [打印本頁]

作者: lijiaheli    時間: 2020-10-24 19:17
標(biāo)題: 51單片機(jī)LED點(diǎn)陣亮度太低如何解決?
我在嘗試寫一個C51程序來使整個LED點(diǎn)陣都亮起來,但是我的亮度相比運(yùn)行示例代碼的亮度差得很遠(yuǎn)。下面是單片機(jī)示例代碼:

  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 點(diǎn)陣
  11. ADDR3 = 0; //因?yàn)樾枰獎討B(tài)改變 ADDR0-2 的值,所以不需要再初始化了
  12. TMOD = 0x01; //設(shè)置 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 中斷服務(wù)函數(shù) */
  20. void InterruptTimer0() interrupt 1

  21. {
  22. static unsigned char i = 0; //動態(tài)掃描的索引
  23. TH0 = 0xFC; //重新加載初值
  24. TL0 = 0x67;
  25. //以下代碼完成 LED 點(diǎn)陣動態(tài)掃描刷新
  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. }
復(fù)制代碼
這是我寫的代碼,區(qū)別主要在用了for循環(huán)
  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. }
復(fù)制代碼



希望能有大神指點(diǎn)指點(diǎn)




作者: xianfajushi    時間: 2020-10-25 07:30
要知道循環(huán)與switch 是不同的switch 要等待中斷,而循環(huán)不需要等待要循環(huán)完成的。
作者: wanghz12    時間: 2020-10-25 08:07
例子是1ms顯示一個數(shù)位,輪流8ms一個周期,每個位都是均勻的。你是1ms顯示8個數(shù)位,而且前面0-6位時間都很短只用幾個us,只有位7停留時間長點(diǎn)。
作者: TTQ001    時間: 2020-10-25 09:43
如果LED太暗,則可能是由于硬件。 檢查接線或更換較小的電阻器。
作者: wulin    時間: 2020-10-25 17:13
樓主不要在一次中斷中顯示8行8列。每次中斷只顯示1行,分8次中斷完成1屏。注意消隱碼放在開始,結(jié)束時不要消隱,顯示時間才可保持到下次中斷。這樣每行顯示時間略小于中斷周期就不會很暗了。
作者: wudijueshen    時間: 2020-10-25 17:26
感謝感謝,這個困擾了我很久
作者: lijiaheli    時間: 2020-10-25 20:29
xianfajushi 發(fā)表于 2020-10-25 07:30
要知道循環(huán)與switch 是不同的switch 要等待中斷,而循環(huán)不需要等待要循環(huán)完成的。

謝謝解答。就是說switch憑借靜態(tài)變量i能夠讓一排小燈亮1ms,而for很快的結(jié)束了循環(huán)。
作者: lijiaheli    時間: 2020-10-25 20:31
wanghz12 發(fā)表于 2020-10-25 08:07
例子是1ms顯示一個數(shù)位,輪流8ms一個周期,每個位都是均勻的。你是1ms顯示8個數(shù)位,而且前面0-6位時間都很 ...

感謝解答。事實(shí)上我剛開始寫的時候確實(shí)是這樣的,但是我后來在第40行添加了那句
  1. P0=0xFF;
復(fù)制代碼

關(guān)掉了最后一行,所以所有的小燈都很暗。
作者: lijiaheli    時間: 2020-10-25 20:33
TTQ001 發(fā)表于 2020-10-25 09:43
如果LED太暗,則可能是由于硬件。 檢查接線或更換較小的電阻器。

謝謝。硬件沒有問題的,示例代碼運(yùn)行結(jié)果很好。是我的代碼的問題,




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1