標(biāo)題: 用單片機(jī)定時(shí)器方式驅(qū)動(dòng)2塊74HC595實(shí)現(xiàn)16只LED流水燈程序 [打印本頁]

作者: 電子浪人    時(shí)間: 2021-12-31 19:50
標(biāo)題: 用單片機(jī)定時(shí)器方式驅(qū)動(dòng)2塊74HC595實(shí)現(xiàn)16只LED流水燈程序
定時(shí)器的代碼風(fēng)格參考了金沙灘宋老師的寫法,74HC595的驅(qū)動(dòng)代碼參考了B站up主金善愚的寫法(他沒用到定時(shí)器去實(shí)現(xiàn)流水燈,只是不停的用延時(shí))我看了一下論壇好像沒有這個(gè)方面的東西,我想分享出來給大家參考參考。也希望大家能提供一些改善代碼的建議。

test2.rar

70.95 KB, 下載次數(shù): 41


作者: 188610329    時(shí)間: 2021-12-31 22:44
假定,你是真的想知道更好的寫法,
如果,僅僅只是流水燈的話,HC595 應(yīng)該這樣用:

void InterruptTimer0() interrupt 1
{
        static uint cnt = 0;
        static uchar j = 0;
        uchar        i;
        TH0 = T0RH;
        TL0 = T0RL;
        if(++cnt>=500)
        {
                cnt = 0;
                for(i=0;i<16;i++)
                {
                        if(i == j)        HC595_DS = 1;       
                        else        HC595_DS = 0;       
                        HC595_SH_CP = 1;
                        HC595_SH_CP = 0;
                }
                HC595_ST_CP = 1;
                HC595_ST_CP = 0;
                j++;
                j &= 0x0f;
        }
}
作者: shuisherr    時(shí)間: 2022-6-20 09:26
如果一次亮兩個(gè)燈,一直往前亮應(yīng)該怎么寫,比如32個(gè)燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。一直往前亮怎么寫比較合理
作者: xianfajushi    時(shí)間: 2022-6-20 20:49
shuisherr 發(fā)表于 2022-6-20 09:26
如果一次亮兩個(gè)燈,一直往前亮應(yīng)該怎么寫,比如32個(gè)燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。 ...

簡單得很,如果能通常IO實(shí)現(xiàn),595也一樣道理,不過就是把數(shù)據(jù)發(fā)送而已。簡述:sl=3;P3=sl;if((sl*=2)==128)sl=3;
作者: shuisherr    時(shí)間: 2023-2-9 23:51
xianfajushi 發(fā)表于 2022-6-20 20:49
簡單得很,如果能通常IO實(shí)現(xiàn),595也一樣道理,不過就是把數(shù)據(jù)發(fā)送而已。簡述:sl=3;P3=sl;if((sl*=2)==12 ...

你這個(gè)邏輯沒看懂,初學(xué)者
作者: xianfajushi    時(shí)間: 2023-2-10 08:55
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒看懂,初學(xué)者

很簡單,IO組送值3則引腳1和2高電平類推送6則引腳2和3高電平...
作者: xianfajushi    時(shí)間: 2023-2-10 08:58
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒看懂,初學(xué)者

修改一下sl=3;P3=sl;if((sl*=2)>128)sl=3;這個(gè)計(jì)算公式就實(shí)現(xiàn)循環(huán)點(diǎn)亮相鄰2個(gè)燈了.
作者: xianfajushi    時(shí)間: 2023-2-10 09:09
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒看懂,初學(xué)者

就寫一個(gè)運(yùn)行驗(yàn)證過的荔枝
  1. #include "reg52.h"
  2. void main()
  3. {
  4.         unsigned char y=0,y1=0,y2=0,d=3;P1=0;
  5.         while(1)
  6.         {
  7.                 if(++y==0)if(++y1==0)if(++y2>7){P1=d;if((d*=2)==128)d=3;y2=0;}
  8.         }
  9. }
復(fù)制代碼

作者: xianfajushi    時(shí)間: 2023-2-10 09:14
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒看懂,初學(xué)者

我寫的一組荔枝擴(kuò)展就是3組4組都可以的如法炮制.
作者: xianfajushi    時(shí)間: 2023-2-10 09:20

作者: zhuls    時(shí)間: 2023-2-10 17:25
shuisherr 發(fā)表于 2022-6-20 09:26
如果一次亮兩個(gè)燈,一直往前亮應(yīng)該怎么寫,比如32個(gè)燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。 ...

用環(huán)移指令。 _crol_
int LED_data=0x0003;
while(1)
{
hc595_sent_data(LED_data&0xff);
hc595_sent_data(LED_data>>8);
hc595_LE_on();
LED_data= _irol_(LED_data,1);
}
作者: lyxing    時(shí)間: 2023-2-10 19:12
我用兩只595驅(qū)動(dòng)過8位數(shù)碼管,就是動(dòng)態(tài)掃描。
作者: shuisherr    時(shí)間: 2023-2-10 20:25
xianfajushi 發(fā)表于 2023-2-10 09:09
就寫一個(gè)運(yùn)行驗(yàn)證過的荔枝

感謝老師的回復(fù),我用數(shù)組和switch寫出來了,現(xiàn)在碰到新的問題了,就是595怎么輸出pwm信號(hào),595是串輸入并輸出,那么應(yīng)該一次輸出一個(gè)波形,如果占空比50%就應(yīng)該前16個(gè)燈亮,后16個(gè)燈滅。這個(gè)怎么用代碼輸出的?找遍了全網(wǎng)沒找到。。。
作者: xianfajushi    時(shí)間: 2023-2-10 20:52
shuisherr 發(fā)表于 2023-2-10 20:25
感謝老師的回復(fù),我用數(shù)組和switch寫出來了,現(xiàn)在碰到新的問題了,就是595怎么輸出pwm信號(hào),595是串輸入 ...

不知道玩什么需要那么多輸出,而且還要占空比,2片串聯(lián)595就有時(shí)差,2片并聯(lián)可以消除時(shí)差;
要595弄占空比頻率允許的話可以實(shí)現(xiàn),就是發(fā)送的時(shí)間時(shí)空比,是要荔枝?
作者: hhh402    時(shí)間: 2023-2-19 11:57
這個(gè)問題太簡單,其實(shí)只是控制16個(gè)LED1一片595就可以了,更簡單一點(diǎn)直接用8個(gè)IO口控制也行(4*4=16)
作者: hi等你    時(shí)間: 2023-2-28 15:20
能達(dá)到目的就用延時(shí)好了,干嘛非得給自己找難題用定時(shí)器,就這么簡單的程序等定時(shí)器定時(shí)的時(shí)候

單片機(jī)不也是在空轉(zhuǎn)白費(fèi)力氣嗎,不要為了問題給自己找麻煩。編程是個(gè)循序漸進(jìn)的修煉過程,

等真正需要定時(shí)器時(shí)候再說
作者: lxm41577    時(shí)間: 2023-6-8 16:45
各位前輩大蝦,能不能給個(gè) 2塊74HC595實(shí)現(xiàn)16只LED流水燈  程序是匯編的,本人只會(huì)匯編,C有些看不了,麻煩一下
作者: lkc8210    時(shí)間: 2023-6-10 15:28
lxm41577 發(fā)表于 2023-6-8 16:45
各位前輩大蝦,能不能給個(gè) 2塊74HC595實(shí)現(xiàn)16只LED流水燈  程序是匯編的,本人只會(huì)匯編,C有些看不了,麻煩 ...

先把你懂的寫出來
作者: lxm41577    時(shí)間: 2023-6-12 11:41
lkc8210 發(fā)表于 2023-6-10 15:28
先把你懂的寫出來

我這個(gè)程序在運(yùn)行時(shí),2片的燈同時(shí)運(yùn)行一樣的結(jié)果,2片同時(shí)在流水,不會(huì)是第1片運(yùn)行完,第1片不運(yùn)行,第2片運(yùn)行

SDATA_595 EQU   P1.0 ;串行數(shù)據(jù)輸入
SCLK_595  EQU   P1.2 ;移位時(shí)鐘脈沖
RCK_595   EQU   P1.1 ;輸出鎖存器控制脈沖

;================================================

ORG 0000H
LJMP MAIN
ORG 0030H

;================================================

MAIN:MOV SP,#60H
     MOV R0,#0FEH

MAIN1:
CALL OUT_595
CALL DELAY
MOV A,R0
RL A
MOV R0,A
JMP MAIN1

;---------------------------------------------------------------
;輸出鎖存器輸出數(shù)據(jù)子程序
;---------------------------------------------------------------

OUT_595:

       MOV R4,#08H
       MOV A,R0
WR_LOOP:
RLC A
MOV SDATA_595,C
SETB SCLK_595        ;上升沿發(fā)生移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP


CLR RCK_595
NOP
NOP
SETB RCK_595         ;上升沿將數(shù)據(jù)送到輸出鎖存器
NOP
NOP
NOP
CLR RCK_595
RET
;--------------------------------------------------------------
;延時(shí)子程序
;--------------------------------------------------------------
DELAY:MOV R5,#03H
DEL0:MOV R6,#0FFH
DEL1:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
;---------------------------------------------------------------
END
作者: lxm41577    時(shí)間: 2023-7-2 14:59
lkc8210 發(fā)表于 2023-6-10 15:28
先把你懂的寫出來

大蝦幫幫忙看看,指導(dǎo)指導(dǎo)一下
作者: lkc8210    時(shí)間: 2023-7-3 10:00
lxm41577 發(fā)表于 2023-6-12 11:41
我這個(gè)程序在運(yùn)行時(shí),2片的燈同時(shí)運(yùn)行一樣的結(jié)果,2片同時(shí)在流水,不會(huì)是第1片運(yùn)行完,第1片不運(yùn)行,第2片運(yùn)行 ...

原理圖呢?
按你的代碼推斷
單片機(jī)每次只輸出8位數(shù)據(jù)
以你的描述來看
你用了并聯(lián)的接線方法
應(yīng)改用串聯(lián)的接線方法并在代碼中輸出16位數(shù)據(jù)

  1. SDATA_595 EQU   P1.0 ;串行數(shù)據(jù)輸入
  2. SCLK_595  EQU   P1.2 ;移位時(shí)鐘脈沖
  3. RCK_595   EQU   P1.1 ;輸出鎖存器控制脈沖

  4. ;================================================

  5. ORG 0000H
  6. LJMP MAIN
  7. ORG 0030H

  8. ;================================================

  9. MAIN:MOV SP,#60H
  10.      MOV R0,#0FEH
  11.      MOV R1,#0FFH
  12.         CLR SCLK_595
  13. MAIN1:
  14. CALL OUT_595
  15. CALL DELAY
  16. CLR C
  17. MOV A,R1
  18. RLC A
  19. MOV R1,A
  20. MOV A,R0
  21. RLC A
  22. MOV R0,A
  23. JNC MAIN1
  24. ORL 01H, #01H;地址01H即R1
  25. JMP MAIN1

  26. ;---------------------------------------------------------------
  27. ;輸出鎖存器輸出數(shù)據(jù)子程序
  28. ;---------------------------------------------------------------

  29. OUT_595:

  30. MOV R4,#08H
  31. MOV A,R1;//輸出高八位
  32. WR_LOOP1:
  33. RLC A
  34. MOV SDATA_595,C
  35. SETB SCLK_595        ;上升沿發(fā)生移位
  36. NOP
  37. NOP
  38. CLR SCLK_595
  39. DJNZ R4,WR_LOOP1

  40. MOV R4,#08H
  41. MOV A,R0//輸出低八位
  42. WR_LOOP2:
  43. RLC A
  44. MOV SDATA_595,C
  45. SETB SCLK_595        ;上升沿發(fā)生移位
  46. NOP
  47. NOP
  48. CLR SCLK_595
  49. DJNZ R4,WR_LOOP2


  50. CLR RCK_595
  51. NOP
  52. NOP
  53. SETB RCK_595         ;上升沿將數(shù)據(jù)送到輸出鎖存器
  54. NOP
  55. NOP
  56. NOP
  57. CLR RCK_595
  58. RET
  59. ;--------------------------------------------------------------
  60. ;延時(shí)子程序
  61. ;--------------------------------------------------------------
  62. DELAY:MOV R5,#03H
  63. DEL0:MOV R6,#0FFH
  64. DEL1:MOV R7,#0FFH
  65. DJNZ R7,$
  66. DJNZ R6,DEL1
  67. DJNZ R5,DEL0
  68. RET
  69. ;---------------------------------------------------------------
  70. END
復(fù)制代碼




作者: lxm41577    時(shí)間: 2023-7-7 10:59
lkc8210 發(fā)表于 2023-7-3 10:00
原理圖呢?
按你的代碼推斷
單片機(jī)每次只輸出8位數(shù)據(jù)

測(cè)試可以用,非常感謝




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