找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于stm32f103VC的HC595驅(qū)動LED出現(xiàn)問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:214628 發(fā)表于 2021-1-7 23:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
初次使用HC595來擴展接口驅(qū)動LED,結(jié)果出現(xiàn)595不受控,不管是輸出0xff,還是0x00,LED都是有的滅,有的亮搞不懂怎么回事?求大佬指點!
  1. c文件
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_rcc.h"
  4. #include "stm32f10x_gpio.h"

  5. #include "74HC595.h"
  6. void delay(uint16_t t);

  7. //HC595_Send_Multi_Byte(Led_All_On,2);//10路燈全開
  8. //HC595_Send_Multi_Byte(Led_All_Off,2);//10路燈全關(guān)
  9. u8 Led_Buf[2] = {0xff, 0xff}; //存儲要發(fā)送的指令字節(jié),也就是燈的狀態(tài)         Led_Buf[0]控制燈6-10;Led_Buf[1]控制燈1-5
  10. u8 Led_All_Off[2] = {0xff,0xff}; //LED燈全滅
  11. u8 Led_All_On[2] = {0x00,0x00}; //LED燈全亮

  12. /********  74HC595 GPIO 配置 *************************/
  13. void HC595_GPIO_Config(void)
  14. {
  15.         GPIO_InitTypeDef GPIO_InitStructure;
  16.         RCC_APB2PeriphClockCmd( SHCP_GPIO_CLK | STCP_GPIO_CLK | DS_GPIO_CLK, ENABLE);

  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

  19.         GPIO_InitStructure.GPIO_Pin = SHCP_GPIO_PIN;
  20.         GPIO_Init(SHCP_GPIO_PORT, &GPIO_InitStructure);   // 初始化 SHCP 引腳

  21.         GPIO_InitStructure.GPIO_Pin = STCP_GPIO_PIN;
  22.         GPIO_Init(STCP_GPIO_PORT, &GPIO_InitStructure);   // 初始化 STCP 引腳

  23.         GPIO_InitStructure.GPIO_Pin = DS_GPIO_PIN;
  24.         GPIO_Init(DS_GPIO_PORT, &GPIO_InitStructure);     // 初始化 DS   引腳

  25.         GPIO_ResetBits(SHCP_GPIO_PORT, SHCP_GPIO_PIN);      // 引腳初始狀態(tài)為高,便于產(chǎn)生上升沿
  26.         GPIO_ResetBits(STCP_GPIO_PORT, STCP_GPIO_PIN);
  27.         GPIO_ResetBits(DS_GPIO_PORT, DS_GPIO_PIN);
  28. }


  29. /***
  30. *74HC595 發(fā)送一個字節(jié)
  31. *即往74HC595的DS引腳發(fā)送一個字節(jié)
  32. */
  33. void HC595_Send_Byte(u8 byte)
  34. {
  35.     u8 i;
  36.     for (i = 0; i < 8; i ++)  //一個字節(jié)8位,傳輸8次,一次一位,循環(huán)8次,剛好移完8位
  37.     {
  38.       /****  步驟1:將數(shù)據(jù)傳到DS引腳    ****/
  39.         if (byte & 0x80)        //先傳輸高位,通過與運算判斷第八是否為1
  40.             HC595_Data_High();    //如果第八位是1,則與 595 DS連接的引腳輸出高電平
  41.         else                    //否則輸出低電平
  42.             HC595_Data_Low();

  43.         /*** 步驟2:SHCP每產(chǎn)生一個上升沿,當(dāng)前的bit就被送入移位寄存器 ***/
  44.         HC595_SHCP_Low();   // SHCP拉低
  45.         delay(1);           // 適當(dāng)延時
  46.         HC595_SHCP_High();  // SHCP拉高, SHCP產(chǎn)生上升沿
  47.         delay(1);

  48.         byte <<= 1;     // 左移一位,將低位往高位移,通過  if (byte & 0x80)判斷低位是否為1
  49.     }
  50. }

  51. /**
  52. *74HC595輸出鎖存 使能
  53. **/
  54. void HC595_CS(void)
  55. {
  56.     /**  步驟3:STCP產(chǎn)生一個上升沿,移位寄存器的數(shù)據(jù)移入存儲寄存器  **/
  57.     HC595_STCP_Low();   // 將STCP拉低
  58.     delay(1);           // 適當(dāng)延時
  59.     HC595_STCP_High();  // 再將STCP拉高,STCP即可產(chǎn)生一個上升沿
  60.     delay(1);
  61. }

  62. /**
  63. *發(fā)送多個字節(jié)
  64. *便于級聯(lián)時數(shù)據(jù)的發(fā)送
  65. *級聯(lián)N級,就需要發(fā)送N個字節(jié)控制HC595
  66. ***/
  67. void HC595_Send_Multi_Byte(u8 *data, u16 len)
  68. {
  69.     u8 i;
  70.     for (i = 0; i < len; i ++ ) // len 個字節(jié)
  71.     {
  72.         HC595_Send_Byte(data[i]);
  73.     }

  74.     HC595_CS(); //先把所有字節(jié)發(fā)送完,再使能輸出
  75. }

  76. void delay(uint16_t t)
  77. {
  78.     for (; t != 0; t --);

  79. }




  80. /******************************************************   
  81. *流水燈程序
  82. *******************************************************/
  83. void LED_ShowOneToOne(void)       
  84. {
  85.                 u8 pos; // led位置       
  86.                 u8 Led_Show[2] = {0xff, 0xff}; //存儲要發(fā)送的指令字節(jié),                Led_Show[0]控制燈6-10;                Led_Show[1]控制燈1-5
  87.                         //第X個led亮        :1     2    3      4    5           
  88.                 u8 Waterfall_Led[20] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef,  //控制第一級74HC595
  89.                                         0xff, 0xff, 0xff, 0xff, 0xff,  
  90.                         //第X個led亮        :6     7    8      9    10         
  91.                                         0xff, 0xff, 0xff, 0xff, 0xff,  //控制第二級74HC595
  92.                                         0xfe, 0xfd, 0xfb, 0xf7, 0xef };
  93.                 for (pos = 0; pos < 10; pos ++)                                 //第pos個燈,實現(xiàn)流水燈效果
  94.                 {                                       
  95.                         Led_Show[1] = Waterfall_Led[pos];                        //存放第一級74HC595數(shù)據(jù),因為先進先出,所以第一級放在Led_Pos_Buf[1],而不是Led_Pos_Buf[0]
  96.                         Led_Show[0] = Waterfall_Led[pos+10];         //存放第二級74HC595的數(shù)據(jù)                                       
  97.                         HC595_Send_Multi_Byte(Led_Show,2);                //將當(dāng)前數(shù)據(jù)發(fā)送到595         
  98. //                        delay_ms(500);               
  99.                 }       



  100. }












  101. H文件

  102. #ifndef __74HC595_H
  103. #define __74HC595_H
  104. #include "stm32f10x.h"
  105. #include "delay.h"





  106. #define SHCP_GPIO_PORT      GPIOB
  107. #define SHCP_GPIO_CLK       RCC_APB2Periph_GPIOB
  108. #define SHCP_GPIO_PIN       GPIO_Pin_4

  109. #define STCP_GPIO_PORT      GPIOB
  110. #define STCP_GPIO_CLK       RCC_APB2Periph_GPIOB
  111. #define STCP_GPIO_PIN       GPIO_Pin_5

  112. #define DS_GPIO_PORT        GPIOB
  113. #define DS_GPIO_CLK         RCC_APB2Periph_GPIOB
  114. #define DS_GPIO_PIN         GPIO_Pin_3

  115. #define HC595_SHCP_Low()      GPIO_ResetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )
  116. #define HC595_SHCP_High()     GPIO_SetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )
  117. #define HC595_STCP_Low()      GPIO_ResetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )
  118. #define HC595_STCP_High()     GPIO_SetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )
  119. #define HC595_Data_Low()      GPIO_ResetBits( DS_GPIO_PORT, DS_GPIO_PIN )
  120. #define HC595_Data_High()     GPIO_SetBits( DS_GPIO_PORT, DS_GPIO_PIN )


  121. void HC595_GPIO_Config(void);
  122. void HC595_Send_Byte(u8 byte);
  123. void HC595_CS(void);
  124. void HC595_Send_Multi_Byte(u8 *data, u16 len);

  125. extern u8 Led_Buf[2] ; //存儲要發(fā)送的指令字節(jié),也就是燈的狀態(tài)         Led_Buf[0]控制燈6-10;Led_Buf[1]控制燈1-5
  126. extern u8 Led_All_Off[2]; //LED燈全滅
  127. extern u8 Led_All_On[2]; //LED燈全亮


  128. #endif



復(fù)制代碼

我在main函數(shù)中初始化595,然后使用HC595_Send_Multi_Byte函數(shù)控制結(jié)果如圖,一點都不受控,請問哪里出問題了。
int main(void){
   HC595_GPIO_Config();
   HC595_Send_Multi_Byte(Led_All_Off,1);
}
main程序大致如上。
請問該怎么解決。
或者哪位大佬發(fā)一個基于stm32f1的控制595 的程序,最好是驗證過的,網(wǎng)上大部分都試過沒有用。

1.png (28.79 KB, 下載次數(shù): 116)

1.png

51hei圖片20210106215157.jpg (147.82 KB, 下載次數(shù): 93)

51hei圖片20210106215157.jpg

3.png (21.69 KB, 下載次數(shù): 92)

3.png

2.png (19.16 KB, 下載次數(shù): 116)

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

使用道具 舉報

沙發(fā)
ID:390416 發(fā)表于 2021-1-8 00:23 | 只看該作者
15 03 13 01 74HC595移位寄存器使用手冊.pdf (622.84 KB, 下載次數(shù): 6)




這樣吧 你看我發(fā)的貼子吧
兩片74HC595 驅(qū)動8位數(shù)碼管 單片機源代碼分享
http://www.torrancerestoration.com/bbs/dpj-201201-1.html

89單片機+四個74HC595的LED16x16點陣 源代碼分享
http://www.torrancerestoration.com/bbs/dpj-200961-1.html

以上貼子 都是74HC595的。

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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