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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4160|回復: 21
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
定時器的代碼風格參考了金沙灘宋老師的寫法,74HC595的驅動代碼參考了B站up主金善愚的寫法(他沒用到定時器去實現流水燈,只是不停的用延時)我看了一下論壇好像沒有這個方面的東西,我想分享出來給大家參考參考。也希望大家能提供一些改善代碼的建議。

test2.rar

70.95 KB, 下載次數: 41

評分

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

查看全部評分

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

使用道具 舉報

沙發
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;
回復

使用道具 舉報

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

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

使用道具 舉報

6#
ID:332444 發表于 2023-2-10 08:55 | 只看該作者
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

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

使用道具 舉報

7#
ID:332444 發表于 2023-2-10 08:58 | 只看該作者
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

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

使用道具 舉報

8#
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. }
復制代碼
回復

使用道具 舉報

9#
ID:332444 發表于 2023-2-10 09:14 | 只看該作者
shuisherr 發表于 2023-2-9 23:51
你這個邏輯沒看懂,初學者

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

12#
ID:67199 發表于 2023-2-10 19:12 | 只看該作者
我用兩只595驅動過8位數碼管,就是動態掃描。
回復

使用道具 舉報

13#
ID:1032740 發表于 2023-2-10 20:25 | 只看該作者
xianfajushi 發表于 2023-2-10 09:09
就寫一個運行驗證過的荔枝

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

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

使用道具 舉報

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

使用道具 舉報

18#
ID:161164 發表于 2023-6-10 15:28 來自手機 | 只看該作者
lxm41577 發表于 2023-6-8 16:45
各位前輩大蝦,能不能給個 2塊74HC595實現16只LED流水燈  程序是匯編的,本人只會匯編,C有些看不了,麻煩 ...

先把你懂的寫出來
回復

使用道具 舉報

19#
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
回復

使用道具 舉報

20#
ID:76044 發表于 2023-7-2 14:59 | 只看該作者
lkc8210 發表于 2023-6-10 15:28
先把你懂的寫出來

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

使用道具 舉報

21#
ID:161164 發表于 2023-7-3 10:00 | 只看該作者
lxm41577 發表于 2023-6-12 11:41
我這個程序在運行時,2片的燈同時運行一樣的結果,2片同時在流水,不會是第1片運行完,第1片不運行,第2片運行 ...

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

  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
復制代碼



回復

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人在线 | 成年人黄色一级片 | 国产视频福利在线观看 | 亚洲精品电影网在线观看 | 免费午夜剧场 | 亚洲一区二区三区在线播放 | 亚洲乱码一区二区三区在线观看 | www.精品国产 | 在线资源视频 | 老司机久久 | 日韩午夜在线播放 | 女同久久另类99精品国产 | 成人欧美一区二区三区1314 | 国产精品波多野结衣 | 国产精品美女久久久久aⅴ国产馆 | 国产高清视频在线观看 | 欧美一级在线 | 影音先锋久久 | 成人精品视频在线观看 | 久久99精品久久久久 | 国产乱码精品一区二区三区中文 | 欧美一区二区三区视频 | 精品国产一区二区三区日日嗨 | 黄色网页在线观看 | av香港经典三级级 在线 | 九九久久久 | 久久夜夜| 日韩美香港a一级毛片免费 国产综合av | 欧美一区二区在线免费观看 | 99re热精品视频 | 精品九九| 中日字幕大片在线播放 | www97影院| 天堂在线免费视频 | 日韩在线免费电影 | 国产免费观看一级国产 | www.久| 99免费在线观看视频 | 毛片区 | 成人综合视频在线 | 久久蜜桃资源一区二区老牛 |