找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4212|回復(fù): 21
打印 上一主題 下一主題
收起左側(cè)

用單片機(jī)定時(shí)器方式驅(qū)動(dòng)2塊74HC595實(shí)現(xiàn)16只LED流水燈程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:966442 發(fā)表于 2021-12-31 19:50 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
定時(shí)器的代碼風(fēng)格參考了金沙灘宋老師的寫(xiě)法,74HC595的驅(qū)動(dòng)代碼參考了B站up主金善愚的寫(xiě)法(他沒(méi)用到定時(shí)器去實(shí)現(xiàn)流水燈,只是不停的用延時(shí))我看了一下論壇好像沒(méi)有這個(gè)方面的東西,我想分享出來(lái)給大家參考參考。也希望大家能提供一些改善代碼的建議。

test2.rar

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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-12-31 22:44 | 只看該作者
假定,你是真的想知道更好的寫(xiě)法,
如果,僅僅只是流水燈的話(huà),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;
        }
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:1032740 發(fā)表于 2022-6-20 09:26 | 只看該作者
如果一次亮兩個(gè)燈,一直往前亮應(yīng)該怎么寫(xiě),比如32個(gè)燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。一直往前亮怎么寫(xiě)比較合理
回復(fù)

使用道具 舉報(bào)

地板
ID:332444 發(fā)表于 2022-6-20 20:49 | 只看該作者
shuisherr 發(fā)表于 2022-6-20 09:26
如果一次亮兩個(gè)燈,一直往前亮應(yīng)該怎么寫(xiě),比如32個(gè)燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。 ...

簡(jiǎn)單得很,如果能通常IO實(shí)現(xiàn),595也一樣道理,不過(guò)就是把數(shù)據(jù)發(fā)送而已。簡(jiǎn)述:sl=3;P3=sl;if((sl*=2)==128)sl=3;
回復(fù)

使用道具 舉報(bào)

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

你這個(gè)邏輯沒(méi)看懂,初學(xué)者
回復(fù)

使用道具 舉報(bào)

6#
ID:332444 發(fā)表于 2023-2-10 08:55 | 只看該作者
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒(méi)看懂,初學(xué)者

很簡(jiǎn)單,IO組送值3則引腳1和2高電平類(lèi)推送6則引腳2和3高電平...
回復(fù)

使用道具 舉報(bào)

7#
ID:332444 發(fā)表于 2023-2-10 08:58 | 只看該作者
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒(méi)看懂,初學(xué)者

修改一下sl=3;P3=sl;if((sl*=2)>128)sl=3;這個(gè)計(jì)算公式就實(shí)現(xiàn)循環(huán)點(diǎn)亮相鄰2個(gè)燈了.
回復(fù)

使用道具 舉報(bào)

8#
ID:332444 發(fā)表于 2023-2-10 09:09 | 只看該作者
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒(méi)看懂,初學(xué)者

就寫(xiě)一個(gè)運(yùn)行驗(yàn)證過(guò)的荔枝
  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ù)制代碼
回復(fù)

使用道具 舉報(bào)

9#
ID:332444 發(fā)表于 2023-2-10 09:14 | 只看該作者
shuisherr 發(fā)表于 2023-2-9 23:51
你這個(gè)邏輯沒(méi)看懂,初學(xué)者

我寫(xiě)的一組荔枝擴(kuò)展就是3組4組都可以的如法炮制.
回復(fù)

使用道具 舉報(bào)

10#
ID:332444 發(fā)表于 2023-2-10 09:20 | 只看該作者
回復(fù)

使用道具 舉報(bào)

11#
ID:69038 發(fā)表于 2023-2-10 17:25 | 只看該作者
shuisherr 發(fā)表于 2022-6-20 09:26
如果一次亮兩個(gè)燈,一直往前亮應(yīng)該怎么寫(xiě),比如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);
}
回復(fù)

使用道具 舉報(bào)

12#
ID:67199 發(fā)表于 2023-2-10 19:12 | 只看該作者
我用兩只595驅(qū)動(dòng)過(guò)8位數(shù)碼管,就是動(dòng)態(tài)掃描。
回復(fù)

使用道具 舉報(bào)

13#
ID:1032740 發(fā)表于 2023-2-10 20:25 | 只看該作者
xianfajushi 發(fā)表于 2023-2-10 09:09
就寫(xiě)一個(gè)運(yùn)行驗(yàn)證過(guò)的荔枝

感謝老師的回復(fù),我用數(shù)組和switch寫(xiě)出來(lái)了,現(xiàn)在碰到新的問(wèn)題了,就是595怎么輸出pwm信號(hào),595是串輸入并輸出,那么應(yīng)該一次輸出一個(gè)波形,如果占空比50%就應(yīng)該前16個(gè)燈亮,后16個(gè)燈滅。這個(gè)怎么用代碼輸出的?找遍了全網(wǎng)沒(méi)找到。。。
回復(fù)

使用道具 舉報(bào)

14#
ID:332444 發(fā)表于 2023-2-10 20:52 | 只看該作者
shuisherr 發(fā)表于 2023-2-10 20:25
感謝老師的回復(fù),我用數(shù)組和switch寫(xiě)出來(lái)了,現(xiàn)在碰到新的問(wèn)題了,就是595怎么輸出pwm信號(hào),595是串輸入 ...

不知道玩什么需要那么多輸出,而且還要占空比,2片串聯(lián)595就有時(shí)差,2片并聯(lián)可以消除時(shí)差;
要595弄占空比頻率允許的話(huà)可以實(shí)現(xiàn),就是發(fā)送的時(shí)間時(shí)空比,是要荔枝?
回復(fù)

使用道具 舉報(bào)

15#
ID:491577 發(fā)表于 2023-2-19 11:57 | 只看該作者
這個(gè)問(wèn)題太簡(jiǎn)單,其實(shí)只是控制16個(gè)LED1一片595就可以了,更簡(jiǎn)單一點(diǎn)直接用8個(gè)IO口控制也行(4*4=16)
回復(fù)

使用道具 舉報(bào)

16#
ID:996773 發(fā)表于 2023-2-28 15:20 | 只看該作者
能達(dá)到目的就用延時(shí)好了,干嘛非得給自己找難題用定時(shí)器,就這么簡(jiǎn)單的程序等定時(shí)器定時(shí)的時(shí)候

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

等真正需要定時(shí)器時(shí)候再說(shuō)
回復(fù)

使用道具 舉報(bào)

17#
ID:76044 發(fā)表于 2023-6-8 16:45 | 只看該作者
各位前輩大蝦,能不能給個(gè) 2塊74HC595實(shí)現(xiàn)16只LED流水燈  程序是匯編的,本人只會(huì)匯編,C有些看不了,麻煩一下
回復(fù)

使用道具 舉報(bào)

18#
ID:161164 發(fā)表于 2023-6-10 15:28 來(lái)自手機(jī) | 只看該作者
lxm41577 發(fā)表于 2023-6-8 16:45
各位前輩大蝦,能不能給個(gè) 2塊74HC595實(shí)現(xiàn)16只LED流水燈  程序是匯編的,本人只會(huì)匯編,C有些看不了,麻煩 ...

先把你懂的寫(xiě)出來(lái)
回復(fù)

使用道具 舉報(bào)

19#
ID:76044 發(fā)表于 2023-6-12 11:41 | 只看該作者
lkc8210 發(fā)表于 2023-6-10 15:28
先把你懂的寫(xiě)出來(lái)

我這個(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
回復(fù)

使用道具 舉報(bào)

20#
ID:76044 發(fā)表于 2023-7-2 14:59 | 只看該作者
lkc8210 發(fā)表于 2023-6-10 15:28
先把你懂的寫(xiě)出來(lái)

大蝦幫幫忙看看,指導(dǎo)指導(dǎo)一下
回復(fù)

使用道具 舉報(bào)

21#
ID:161164 發(fā)表于 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ù)
以你的描述來(lái)看
你用了并聯(lián)的接線(xiàn)方法
應(yīng)改用串聯(lián)的接線(xià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ù)制代碼



回復(fù)

使用道具 舉報(bào)

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

測(cè)試可以用,非常感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表