久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4406|回復: 21
收起左側

用單片機定時器方式驅動2塊74HC595實現16只LED流水燈程序

  [復制鏈接]
ID:966442 發表于 2021-12-31 19:50 | 顯示全部樓層 |閱讀模式
定時器的代碼風格參考了金沙灘宋老師的寫法,74HC595的驅動代碼參考了B站up主金善愚的寫法(他沒用到定時器去實現流水燈,只是不停的用延時)我看了一下論壇好像沒有這個方面的東西,我想分享出來給大家參考參考。也希望大家能提供一些改善代碼的建議。
1.png 2.png 3.png 4.png

test2.rar

70.95 KB, 下載次數: 41

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:624769 發表于 2021-12-31 22:44 | 顯示全部樓層
假定,你是真的想知道更好的寫法,
如果,僅僅只是流水燈的話,HC595 應該這樣用:

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;
        }
}
回復

使用道具 舉報

ID:1032740 發表于 2022-6-20 09:26 | 顯示全部樓層
如果一次亮兩個燈,一直往前亮應該怎么寫,比如32個燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。一直往前亮怎么寫比較合理
回復

使用道具 舉報

ID:332444 發表于 2022-6-20 20:49 | 顯示全部樓層
shuisherr 發表于 2022-6-20 09:26
如果一次亮兩個燈,一直往前亮應該怎么寫,比如32個燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。 ...

簡單得很,如果能通常IO實現,595也一樣道理,不過就是把數據發送而已。簡述:sl=3;P3=sl;if((sl*=2)==128)sl=3;
回復

使用道具 舉報

ID:1032740 發表于 2023-2-9 23:51 | 顯示全部樓層
xianfajushi 發表于 2022-6-20 20:49
簡單得很,如果能通常IO實現,595也一樣道理,不過就是把數據發送而已。簡述:sl=3;P3=sl;if((sl*=2)==12 ...

你這個邏輯沒看懂,初學者
回復

使用道具 舉報

ID:332444 發表于 2023-2-10 08:55 | 顯示全部樓層
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

很簡單,IO組送值3則引腳1和2高電平類推送6則引腳2和3高電平...
回復

使用道具 舉報

ID:332444 發表于 2023-2-10 08:58 | 顯示全部樓層
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

修改一下sl=3;P3=sl;if((sl*=2)>128)sl=3;這個計算公式就實現循環點亮相鄰2個燈了.
回復

使用道具 舉報

ID:332444 發表于 2023-2-10 09:09 | 顯示全部樓層
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

就寫一個運行驗證過的荔枝
  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. }
復制代碼
回復

使用道具 舉報

ID:332444 發表于 2023-2-10 09:14 | 顯示全部樓層
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

我寫的一組荔枝擴展就是3組4組都可以的如法炮制.
回復

使用道具 舉報

ID:332444 發表于 2023-2-10 09:20 | 顯示全部樓層
1.gif
回復

使用道具 舉報

ID:69038 發表于 2023-2-10 17:25 | 顯示全部樓層
shuisherr 發表于 2022-6-20 09:26
如果一次亮兩個燈,一直往前亮應該怎么寫,比如32個燈,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。 ...

用環移指令啊: _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);
}
回復

使用道具 舉報

ID:67199 發表于 2023-2-10 19:12 | 顯示全部樓層
我用兩只595驅動過8位數碼管,就是動態掃描。
回復

使用道具 舉報

ID:1032740 發表于 2023-2-10 20:25 | 顯示全部樓層
xianfajushi 發表于 2023-2-10 09:09
就寫一個運行驗證過的荔枝

感謝老師的回復,我用數組和switch寫出來了,現在碰到新的問題了,就是595怎么輸出pwm信號,595是串輸入并輸出,那么應該一次輸出一個波形,如果占空比50%就應該前16個燈亮,后16個燈滅。這個怎么用代碼輸出的?找遍了全網沒找到。。。
回復

使用道具 舉報

ID:332444 發表于 2023-2-10 20:52 | 顯示全部樓層
shuisherr 發表于 2023-2-10 20:25
感謝老師的回復,我用數組和switch寫出來了,現在碰到新的問題了,就是595怎么輸出pwm信號,595是串輸入 ...

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

使用道具 舉報

ID:491577 發表于 2023-2-19 11:57 | 顯示全部樓層
這個問題太簡單,其實只是控制16個LED1一片595就可以了,更簡單一點直接用8個IO口控制也行(4*4=16)
回復

使用道具 舉報

ID:996773 發表于 2023-2-28 15:20 | 顯示全部樓層
能達到目的就用延時好了,干嘛非得給自己找難題用定時器,就這么簡單的程序等定時器定時的時候

單片機不也是在空轉白費力氣嗎,不要為了問題給自己找麻煩。編程是個循序漸進的修煉過程,

等真正需要定時器時候再說
回復

使用道具 舉報

ID:76044 發表于 2023-6-8 16:45 | 顯示全部樓層
各位前輩大蝦,能不能給個 2塊74HC595實現16只LED流水燈  程序是匯編的,本人只會匯編,C有些看不了,麻煩一下
回復

使用道具 舉報

ID:161164 發表于 2023-6-10 15:28 來自觸屏版 | 顯示全部樓層
lxm41577 發表于 2023-6-8 16:45
各位前輩大蝦,能不能給個 2塊74HC595實現16只LED流水燈  程序是匯編的,本人只會匯編,C有些看不了,麻煩 ...

先把你懂的寫出來
回復

使用道具 舉報

ID:76044 發表于 2023-6-12 11:41 | 顯示全部樓層
lkc8210 發表于 2023-6-10 15:28
先把你懂的寫出來

我這個程序在運行時,2片的燈同時運行一樣的結果,2片同時在流水,不會是第1片運行完,第1片不運行,第2片運行

SDATA_595 EQU   P1.0 ;串行數據輸入
SCLK_595  EQU   P1.2 ;移位時鐘脈沖
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

;---------------------------------------------------------------
;輸出鎖存器輸出數據子程序
;---------------------------------------------------------------

OUT_595:

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


CLR RCK_595
NOP
NOP
SETB RCK_595         ;上升沿將數據送到輸出鎖存器
NOP
NOP
NOP
CLR RCK_595
RET
;--------------------------------------------------------------
;延時子程序
;--------------------------------------------------------------
DELAY:MOV R5,#03H
DEL0:MOV R6,#0FFH
DEL1:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
;---------------------------------------------------------------
END
回復

使用道具 舉報

ID:76044 發表于 2023-7-2 14:59 | 顯示全部樓層
lkc8210 發表于 2023-6-10 15:28
先把你懂的寫出來

大蝦幫幫忙看看,指導指導一下
回復

使用道具 舉報

ID:161164 發表于 2023-7-3 10:00 | 顯示全部樓層
lxm41577 發表于 2023-6-12 11:41
我這個程序在運行時,2片的燈同時運行一樣的結果,2片同時在流水,不會是第1片運行完,第1片不運行,第2片運行 ...

原理圖呢?
按你的代碼推斷
單片機每次只輸出8位數據
以你的描述來看
你用了并聯的接線方法
應改用串聯的接線方法并在代碼中輸出16位數據 2023-07-03_095940.png

  1. SDATA_595 EQU   P1.0 ;串行數據輸入
  2. SCLK_595  EQU   P1.2 ;移位時鐘脈沖
  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. ;輸出鎖存器輸出數據子程序
  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        ;上升沿發生移位
  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        ;上升沿發生移位
  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         ;上升沿將數據送到輸出鎖存器
  54. NOP
  55. NOP
  56. NOP
  57. CLR RCK_595
  58. RET
  59. ;--------------------------------------------------------------
  60. ;延時子程序
  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
復制代碼



回復

使用道具 舉報

ID:76044 發表于 2023-7-7 10:59 | 顯示全部樓層
lkc8210 發表于 2023-7-3 10:00
原理圖呢?
按你的代碼推斷
單片機每次只輸出8位數據

測試可以用,非常感謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧洲一区视频 | 成人免费在线电影 | av天天澡天天爽天天av | 一级a性色生活片久久毛片波多野 | 国产黄色大片 | 97超碰免费| 亚洲精品99999 | 国产一区二区在线免费观看 | 久久精品亚洲 | 亚洲一区二区三区视频 | 日韩精品1区2区3区 成人黄页在线观看 | 91伊人 | 中文字幕在线免费 | 欧美日韩a | 亚洲视频观看 | www.日韩| 欧美自拍日韩 | 成人一区二区三区在线 | 午夜成人在线视频 | 久久久久久亚洲欧洲 | 日韩a在线 | 色天天综合| 日韩在线观看一区 | 久久精品色视频 | 2019中文字幕视频 | 超碰男人天堂 | 99re在线视频观看 | 午夜寂寞影院在线观看 | 国产最好的av国产大片 | 国产精品中文字幕一区二区三区 | 欧美 日韩 国产 在线 | 国产精品久久久久久久免费大片 | 久久精品高清视频 | 中文字幕一区在线观看视频 | 精品欧美乱码久久久久久 | 国产精品精品久久久 | 久久se精品一区精品二区 | 超碰最新在线 | 免费在线观看毛片 | a级毛片国产 | 91九色视频在线 |